[UNI-V2-USDC-ETH] ERC20 Token Smart Contract Technical Assessment

[UNI-V2-USDC-ETH] ERC20 Token Smart Contract Technical Assessment

General Information

Risk Summary

  • Does the contract implement the ERC20 token standards? Yes.
  • Risk analysis : MEDIUM.

Technical Information

  • Compiler version : v0.5.16+commit.9c3226ce
  • Decimals : 18
  • Overflow checks : Yes, the contract uses the SafeMath library for uint operations.
  • Mitigation against allowance race-condition : No.
  • Upgradeable contract patterns : No.
  • Access control or restriction lists : No.
  • Non-standard features or behaviors : No.

Formal Verification Considerations:

  • Does transfer have simple semantics? Yes.
  • Does transferFrom have simple semantics? Yes.
  • Can balances be arbitrarily modified by some actor? No.
  • Are there any external calls? No.

Testnet Information

  • Uniswap is deployed on Ropsten, Rinkeby, Gorli and Kovan. List of relevant addresses here.

Contract Logic Summary

Administrative Addresses

  • Fee Setter: 0x5e4be8Bc9637f0EAA1A755019e06A68ce081D58F
    • Fee setter can turn fees on and off and set the target address that recieves fees. This address is controlled by Uniswap Governance and is behind a time lock of 48 hours.

Inheritance Structure

UNI-V2-USDC-ETH uses custom minting/burning logic in UniswapV2Pair which extends UniswapV2ERC20.

Other

UniswapV2ERC20 also implements permit for gasless transactions.

Contract Risk Summary

This is a medium risk contract. The ERC20 functions are implemented to industry standard, there are checks to prevent over/underflows, and the contract is non-upgradeable. Uniswap LP tokens are very safe by themselves. The risk comes from the underlying tokens. ETH is safe, but USDC has centralized access controls. Overall the technical risk is about the same as the risk from just USDC.

Supporting Materials

Architecture Diagram

Inheritance Diagram

Sūrya’s Description Report

Files Description Table

File Name SHA-1 Hash
UniswapV2Pair-All.sol f5e7366252c794b5fe2bf7bd2c1ce82240138de2

Contracts Description Table

Contract Type Bases
└ Function Name Visibility Mutability Modifiers
IUniswapV2Pair Interface
└ name External :exclamation: NO❗️
└ symbol External :exclamation: NO❗️
└ decimals External :exclamation: NO❗️
└ totalSupply External :exclamation: NO❗️
└ balanceOf External :exclamation: NO❗️
└ allowance External :exclamation: NO❗️
└ approve External :exclamation: :stop_sign: NO❗️
└ transfer External :exclamation: :stop_sign: NO❗️
└ transferFrom External :exclamation: :stop_sign: NO❗️
└ DOMAIN_SEPARATOR External :exclamation: NO❗️
└ PERMIT_TYPEHASH External :exclamation: NO❗️
└ nonces External :exclamation: NO❗️
└ permit External :exclamation: :stop_sign: NO❗️
└ MINIMUM_LIQUIDITY External :exclamation: NO❗️
└ factory External :exclamation: NO❗️
└ token0 External :exclamation: NO❗️
└ token1 External :exclamation: NO❗️
└ getReserves External :exclamation: NO❗️
└ price0CumulativeLast External :exclamation: NO❗️
└ price1CumulativeLast External :exclamation: NO❗️
└ kLast External :exclamation: NO❗️
└ mint External :exclamation: :stop_sign: NO❗️
└ burn External :exclamation: :stop_sign: NO❗️
└ swap External :exclamation: :stop_sign: NO❗️
└ skim External :exclamation: :stop_sign: NO❗️
└ sync External :exclamation: :stop_sign: NO❗️
└ initialize External :exclamation: :stop_sign: NO❗️
IUniswapV2ERC20 Interface
└ name External :exclamation: NO❗️
└ symbol External :exclamation: NO❗️
└ decimals External :exclamation: NO❗️
└ totalSupply External :exclamation: NO❗️
└ balanceOf External :exclamation: NO❗️
└ allowance External :exclamation: NO❗️
└ approve External :exclamation: :stop_sign: NO❗️
└ transfer External :exclamation: :stop_sign: NO❗️
└ transferFrom External :exclamation: :stop_sign: NO❗️
└ DOMAIN_SEPARATOR External :exclamation: NO❗️
└ PERMIT_TYPEHASH External :exclamation: NO❗️
└ nonces External :exclamation: NO❗️
└ permit External :exclamation: :stop_sign: NO❗️
SafeMath Library
└ add Internal :lock:
└ sub Internal :lock:
└ mul Internal :lock:
UniswapV2ERC20 Implementation IUniswapV2ERC20
└ Public :exclamation: :stop_sign: NO❗️
└ _mint Internal :lock: :stop_sign:
└ _burn Internal :lock: :stop_sign:
└ _approve Private :closed_lock_with_key: :stop_sign:
└ _transfer Private :closed_lock_with_key: :stop_sign:
└ approve External :exclamation: :stop_sign: NO❗️
└ transfer External :exclamation: :stop_sign: NO❗️
└ transferFrom External :exclamation: :stop_sign: NO❗️
└ permit External :exclamation: :stop_sign: NO❗️
Math Library
└ min Internal :lock:
└ sqrt Internal :lock:
UQ112x112 Library
└ encode Internal :lock:
└ uqdiv Internal :lock:
IERC20 Interface
└ name External :exclamation: NO❗️
└ symbol External :exclamation: NO❗️
└ decimals External :exclamation: NO❗️
└ totalSupply External :exclamation: NO❗️
└ balanceOf External :exclamation: NO❗️
└ allowance External :exclamation: NO❗️
└ approve External :exclamation: :stop_sign: NO❗️
└ transfer External :exclamation: :stop_sign: NO❗️
└ transferFrom External :exclamation: :stop_sign: NO❗️
IUniswapV2Factory Interface
└ feeTo External :exclamation: NO❗️
└ feeToSetter External :exclamation: NO❗️
└ getPair External :exclamation: NO❗️
└ allPairs External :exclamation: NO❗️
└ allPairsLength External :exclamation: NO❗️
└ createPair External :exclamation: :stop_sign: NO❗️
└ setFeeTo External :exclamation: :stop_sign: NO❗️
└ setFeeToSetter External :exclamation: :stop_sign: NO❗️
IUniswapV2Callee Interface
└ uniswapV2Call External :exclamation: :stop_sign: NO❗️
UniswapV2Pair Implementation IUniswapV2Pair, UniswapV2ERC20
└ getReserves Public :exclamation: NO❗️
└ _safeTransfer Private :closed_lock_with_key: :stop_sign:
└ Public :exclamation: :stop_sign: NO❗️
└ initialize External :exclamation: :stop_sign: NO❗️
└ _update Private :closed_lock_with_key: :stop_sign:
└ _mintFee Private :closed_lock_with_key: :stop_sign:
└ mint External :exclamation: :stop_sign: lock
└ burn External :exclamation: :stop_sign: lock
└ swap External :exclamation: :stop_sign: lock
└ skim External :exclamation: :stop_sign: lock
└ sync External :exclamation: :stop_sign: lock

Legend

Symbol Meaning
:stop_sign: Function can modify state
:dollar: Function is payable
5 Likes