Blockwell

Uniswap V2

ERC20

This contract is an ERC20 token.

Name Uniswap V2
Symbol UNI-V2
Decimals 18
Total Supply 25,298 UNI-V2

About

Stats

Public Functions 11
Event Types 6
Code Size 20,872 bytes

Library Use

Uses SafeMath for uint.
Uses UQ112x112 for uint224.

Events (6) keyboard_arrow_up

Approval Event

Parameters help
owner
address help
spender
address help
value
uint help

Burn Event

Parameters help
sender
address help
amount0
uint help
amount1
uint help
to
address help

Mint Event

Parameters help
sender
address help
amount0
uint help
amount1
uint help

Swap Event

Parameters help
sender
address help
amount0In
uint help
amount1In
uint help
amount0Out
uint help
amount1Out
uint help
to
address help

Sync Event

Parameters help
reserve0
uint112 help
reserve1
uint112 help

Transfer Event

Parameters help
from
address help
to
address help
value
uint help

MINIMUM_LIQUIDITY Constant

uint help
UNKNOWN VALUE

SELECTOR Constant

bytes4 help
UNKNOWN VALUE

name Constant

string help
Uniswap V2

symbol Constant

string help
UNI-V2

decimals Constant

uint8 help
18

PERMIT_TYPEHASH Constant

bytes32 help
0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9

factory Variable

address help

token0 Variable

address help

token1 Variable

address help

price0CumulativeLast Variable

uint help

price1CumulativeLast Variable

uint help

kLast Variable

uint help

totalSupply Variable

uint help

DOMAIN_SEPARATOR Variable

bytes32 help

balanceOf Variable

mapping(address => uint) help

nonces Variable

mapping(address => uint) help

reserve0 Variable

uint112 help
Internal Variable

reserve1 Variable

uint112 help
Internal Variable

blockTimestampLast Variable

uint32 help
Internal Variable

unlocked Variable

uint help
Internal Variable

allowance Variable

mapping(address => mapping(address => uint)) help
Internal Variable

Functions Expand All Collapse All

Parameters help

Name Type
spender
address help
value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function approve(address spender, uint256 value) external returns (bool) {
  _approve(msg.sender, spender, value);
  return true;
}

Parameters help

Name Type
to
address help
value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function transfer(address to, uint256 value) external returns (bool) {
  _transfer(msg.sender, to, value);
  return true;
}

Parameters help

Name Type
from
address help
to
address help
value
uint help

Properties

Visibility help public
Mutability help transaction
Source Code
function transferFrom(
  address from,
  address to,
  uint256 value
) external returns (bool) {
  if (allowance[from][msg.sender] != uint256(-1)) {
    allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
  }
  _transfer(from, to, value);
  return true;
}

permit keyboard_arrow_up

Parameters help

Name Type
owner
address help
spender
address help
value
uint help
deadline
uint help
v
uint8 help
r
bytes32 help
s
bytes32 help

Properties

Visibility help public
Mutability help transaction
Source Code
function permit(
  address owner,
  address spender,
  uint256 value,
  uint256 deadline,
  uint8 v,
  bytes32 r,
  bytes32 s
) external {
  require(deadline >= block.timestamp, "UniswapV2: EXPIRED");
  bytes32 digest = keccak256(
    abi.encodePacked(
      "\x19\x01",
      DOMAIN_SEPARATOR,
      keccak256(
        abi.encode(
          PERMIT_TYPEHASH,
          owner,
          spender,
          value,
          nonces[owner]++,
          deadline
        )
      )
    )
  );
  address recoveredAddress = ecrecover(digest, v, r, s);
  require(
    recoveredAddress != address(0) && recoveredAddress == owner,
    "UniswapV2: INVALID_SIGNATURE"
  );
  _approve(owner, spender, value);
}

getReserves keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help view
Source Code
function getReserves()
  public
  view
  returns (
    uint112 _reserve0,
    uint112 _reserve1,
    uint32 _blockTimestampLast
  )
{
  _reserve0 = reserve0;
  _reserve1 = reserve1;
  _blockTimestampLast = blockTimestampLast;
}

initialize keyboard_arrow_up

Parameters help

Name Type
_token0
address help
_token1
address help

Properties

Visibility help public
Mutability help transaction
Source Code
function initialize(address _token0, address _token1) external {
  require(msg.sender == factory, "UniswapV2: FORBIDDEN"); // sufficient check
  token0 = _token0;
  token1 = _token1;
}

mint keyboard_arrow_up

Parameters help

Name Type
to
address help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function mint(address to) external lock returns (uint256 liquidity) {
  (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
  uint256 balance0 = IERC20(token0).balanceOf(address(this));
  uint256 balance1 = IERC20(token1).balanceOf(address(this));
  uint256 amount0 = balance0.sub(_reserve0);
  uint256 amount1 = balance1.sub(_reserve1);

  bool feeOn = _mintFee(_reserve0, _reserve1);
  uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
  if (_totalSupply == 0) {
    liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
    _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
  } else {
    liquidity = Math.min(
      amount0.mul(_totalSupply) / _reserve0,
      amount1.mul(_totalSupply) / _reserve1
    );
  }
  require(liquidity > 0, "UniswapV2: INSUFFICIENT_LIQUIDITY_MINTED");
  _mint(to, liquidity);

  _update(balance0, balance1, _reserve0, _reserve1);
  if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
  emit Mint(msg.sender, amount0, amount1);
}

burn keyboard_arrow_up

Parameters help

Name Type
to
address help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function burn(address to)
  external
  lock
  returns (uint256 amount0, uint256 amount1)
{
  (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
  address _token0 = token0; // gas savings
  address _token1 = token1; // gas savings
  uint256 balance0 = IERC20(_token0).balanceOf(address(this));
  uint256 balance1 = IERC20(_token1).balanceOf(address(this));
  uint256 liquidity = balanceOf[address(this)];

  bool feeOn = _mintFee(_reserve0, _reserve1);
  uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
  amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
  amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
  require(
    amount0 > 0 && amount1 > 0,
    "UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED"
  );
  _burn(address(this), liquidity);
  _safeTransfer(_token0, to, amount0);
  _safeTransfer(_token1, to, amount1);
  balance0 = IERC20(_token0).balanceOf(address(this));
  balance1 = IERC20(_token1).balanceOf(address(this));

  _update(balance0, balance1, _reserve0, _reserve1);
  if (feeOn) kLast = uint256(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date
  emit Burn(msg.sender, amount0, amount1, to);
}

swap keyboard_arrow_up

Parameters help

Name Type
amount0Out
uint help
amount1Out
uint help
to
address help
data
bytes help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Requirements help

Source Code
function swap(
  uint256 amount0Out,
  uint256 amount1Out,
  address to,
  bytes calldata data
) external lock {
  require(
    amount0Out > 0 || amount1Out > 0,
    "UniswapV2: INSUFFICIENT_OUTPUT_AMOUNT"
  );
  (uint112 _reserve0, uint112 _reserve1, ) = getReserves(); // gas savings
  require(
    amount0Out < _reserve0 && amount1Out < _reserve1,
    "UniswapV2: INSUFFICIENT_LIQUIDITY"
  );

  uint256 balance0;
  uint256 balance1;
  {
    // scope for _token{0,1}, avoids stack too deep errors
    address _token0 = token0;
    address _token1 = token1;
    require(to != _token0 && to != _token1, "UniswapV2: INVALID_TO");
    if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
    if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
    if (data.length > 0)
      IUniswapV2Callee(to).uniswapV2Call(
        msg.sender,
        amount0Out,
        amount1Out,
        data
      );
    balance0 = IERC20(_token0).balanceOf(address(this));
    balance1 = IERC20(_token1).balanceOf(address(this));
  }
  uint256 amount0In = balance0 > _reserve0 - amount0Out
    ? balance0 - (_reserve0 - amount0Out)
    : 0;
  uint256 amount1In = balance1 > _reserve1 - amount1Out
    ? balance1 - (_reserve1 - amount1Out)
    : 0;
  require(
    amount0In > 0 || amount1In > 0,
    "UniswapV2: INSUFFICIENT_INPUT_AMOUNT"
  );
  {
    // scope for reserve{0,1}Adjusted, avoids stack too deep errors
    uint256 balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3));
    uint256 balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3));
    require(
      balance0Adjusted.mul(balance1Adjusted) >=
        uint256(_reserve0).mul(_reserve1).mul(1000**2),
      "UniswapV2: K"
    );
  }

  _update(balance0, balance1, _reserve0, _reserve1);
  emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
}

skim keyboard_arrow_up

Parameters help

Name Type
to
address help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function skim(address to) external lock {
  address _token0 = token0; // gas savings
  address _token1 = token1; // gas savings
  _safeTransfer(
    _token0,
    to,
    IERC20(_token0).balanceOf(address(this)).sub(reserve0)
  );
  _safeTransfer(
    _token1,
    to,
    IERC20(_token1).balanceOf(address(this)).sub(reserve1)
  );
}

sync keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help transaction

Modifiers help

Requirements help

UNKNOWN VALUE must be less than or equal to UNKNOWN VALUE
UNKNOWN VALUE must be less than or equal to UNKNOWN VALUE
Source Code
function sync() external lock {
  _update(
    IERC20(token0).balanceOf(address(this)),
    IERC20(token1).balanceOf(address(this)),
    reserve0,
    reserve1
  );
}

Internal Functions Expand All Collapse All

Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.

internal UniswapV2Pair._safeTransfer keyboard_arrow_up

Parameters help

Name Type
token
address help
to
address help
value
uint help

Properties

Visibility help private
Mutability help transaction

Requirements help

Source Code
function _safeTransfer(
  address token,
  address to,
  uint256 value
) private {
  (bool success, bytes memory data) = token.call(
    abi.encodeWithSelector(SELECTOR, to, value)
  );
  require(
    success && (data.length == 0 || abi.decode(data, (bool))),
    "UniswapV2: TRANSFER_FAILED"
  );
}

internal UniswapV2Pair._update keyboard_arrow_up

Parameters help

Name Type
balance0
uint help
balance1
uint help
_reserve0
uint112 help
_reserve1
uint112 help

Properties

Visibility help private
Mutability help transaction

Requirements help

UNKNOWN VALUE must be less than or equal to UNKNOWN VALUE
UNKNOWN VALUE must be less than or equal to UNKNOWN VALUE
Source Code
function _update(
  uint256 balance0,
  uint256 balance1,
  uint112 _reserve0,
  uint112 _reserve1
) private {
  require(
    balance0 <= uint112(-1) && balance1 <= uint112(-1),
    "UniswapV2: OVERFLOW"
  );
  uint32 blockTimestamp = uint32(block.timestamp % 2**32);
  uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired
  if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
    // * never overflows, and + overflow is desired
    price0CumulativeLast +=
      uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) *
      timeElapsed;
    price1CumulativeLast +=
      uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) *
      timeElapsed;
  }
  reserve0 = uint112(balance0);
  reserve1 = uint112(balance1);
  blockTimestampLast = blockTimestamp;
  emit Sync(reserve0, reserve1);
}

internal UniswapV2Pair._mintFee keyboard_arrow_up

Parameters help

Name Type
_reserve0
uint112 help
_reserve1
uint112 help

Properties

Visibility help private
Mutability help transaction
Source Code
function _mintFee(uint112 _reserve0, uint112 _reserve1)
  private
  returns (bool feeOn)
{
  address feeTo = IUniswapV2Factory(factory).feeTo();
  feeOn = feeTo != address(0);
  uint256 _kLast = kLast; // gas savings
  if (feeOn) {
    if (_kLast != 0) {
      uint256 rootK = Math.sqrt(uint256(_reserve0).mul(_reserve1));
      uint256 rootKLast = Math.sqrt(_kLast);
      if (rootK > rootKLast) {
        uint256 numerator = totalSupply.mul(rootK.sub(rootKLast));
        uint256 denominator = rootK.mul(5).add(rootKLast);
        uint256 liquidity = numerator / denominator;
        if (liquidity > 0) _mint(feeTo, liquidity);
      }
    }
  } else if (_kLast != 0) {
    kLast = 0;
  }
}

internal UniswapV2ERC20._mint keyboard_arrow_up

Parameters help

Name Type
to
address help
value
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _mint(address to, uint256 value) internal {
  totalSupply = totalSupply.add(value);
  balanceOf[to] = balanceOf[to].add(value);
  emit Transfer(address(0), to, value);
}

internal UniswapV2ERC20._burn keyboard_arrow_up

Parameters help

Name Type
from
address help
value
uint help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _burn(address from, uint256 value) internal {
  balanceOf[from] = balanceOf[from].sub(value);
  totalSupply = totalSupply.sub(value);
  emit Transfer(from, address(0), value);
}

internal UniswapV2ERC20._approve keyboard_arrow_up

Parameters help

Name Type
owner
address help
spender
address help
value
uint help

Properties

Visibility help private
Mutability help transaction
Source Code
function _approve(
  address owner,
  address spender,
  uint256 value
) private {
  allowance[owner][spender] = value;
  emit Approval(owner, spender, value);
}

internal UniswapV2ERC20._transfer keyboard_arrow_up

Parameters help

Name Type
from
address help
to
address help
value
uint help

Properties

Visibility help private
Mutability help transaction
Source Code
function _transfer(
  address from,
  address to,
  uint256 value
) private {
  balanceOf[from] = balanceOf[from].sub(value);
  balanceOf[to] = balanceOf[to].add(value);
  emit Transfer(from, to, value);
}