ERC-20
Overview
Max Total Supply
0.601666468941769326 STKD-STBL
Holders
1
Market
Price
$0.00 @ 0.000000 S
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.601666468941768326 STKD-STBLValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
StakedLPTokenSolidlyStable5
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** *Submitted for verification at polygonscan.com on 2023-10-10 */ // File: contracts\libraries\SafeMath.sol pragma solidity =0.5.16; // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol // Subject to the MIT license. /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, errorMessage); return c; } /** * @dev Returns the integer division of two unsigned integers. * Reverts on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. * Reverts with custom message on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts\ImpermaxERC20.sol pragma solidity =0.5.16; // This contract is basically UniswapV2ERC20 with small modifications // src: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol contract ImpermaxERC20 { using SafeMath for uint; string public name; string public symbol; uint8 public decimals = 18; uint public totalSupply; mapping(address => uint) public balanceOf; mapping(address => mapping(address => uint)) public allowance; bytes32 public DOMAIN_SEPARATOR; mapping(address => uint) public nonces; event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); constructor() public {} function _setName(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; uint chainId; assembly { chainId := chainid } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), chainId, address(this) ) ); } function _mint(address to, uint value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve(address owner, address spender, uint value) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer(address from, address to, uint value) internal { balanceOf[from] = balanceOf[from].sub(value, "Impermax: TRANSFER_TOO_HIGH"); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint value) external returns (bool) { if (allowance[from][msg.sender] != uint(-1)) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value, "Impermax: TRANSFER_NOT_ALLOWED"); } _transfer(from, to, value); return true; } function _checkSignature(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s, bytes32 typehash) internal { require(deadline >= block.timestamp, "Impermax: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(typehash, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Impermax: INVALID_SIGNATURE"); } // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { _checkSignature(owner, spender, value, deadline, v, r, s, PERMIT_TYPEHASH); _approve(owner, spender, value); } } // File: contracts\interfaces\IERC20.sol pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); } // File: contracts\interfaces\IPoolToken.sol pragma solidity >=0.5.0; interface IPoolToken { /*** Impermax ERC20 ***/ event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; /*** Pool Token ***/ event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens); event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens); event Sync(uint totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint); function MINIMUM_LIQUIDITY() external pure returns (uint); function exchangeRate() external returns (uint); function mint(address minter) external returns (uint mintTokens); function redeem(address redeemer) external returns (uint redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; } // File: contracts\PoolToken.sol pragma solidity =0.5.16; contract PoolToken is IPoolToken, ImpermaxERC20 { uint internal constant initialExchangeRate = 1e18; address public underlying; address public factory; uint public totalBalance; uint public constant MINIMUM_LIQUIDITY = 1000; event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens); event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens); event Sync(uint totalBalance); /*** Initialize ***/ // called once by the factory function _setFactory() external { require(factory == address(0), "Impermax: FACTORY_ALREADY_SET"); factory = msg.sender; } /*** PoolToken ***/ function _update() internal { totalBalance = IERC20(underlying).balanceOf(address(this)); emit Sync(totalBalance); } function exchangeRate() public returns (uint) { uint _totalSupply = totalSupply; // gas savings uint _totalBalance = totalBalance; // gas savings if (_totalSupply == 0 || _totalBalance == 0) return initialExchangeRate; return _totalBalance.mul(1e18).div(_totalSupply); } // this low-level function should be called from another contract function mint(address minter) external nonReentrant update returns (uint mintTokens) { uint balance = IERC20(underlying).balanceOf(address(this)); uint mintAmount = balance.sub(totalBalance); mintTokens = mintAmount.mul(1e18).div(exchangeRate()); if(totalSupply == 0) { // permanently lock the first MINIMUM_LIQUIDITY tokens mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } require(mintTokens > 0, "Impermax: MINT_AMOUNT_ZERO"); _mint(minter, mintTokens); emit Mint(msg.sender, minter, mintAmount, mintTokens); } // this low-level function should be called from another contract function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) { uint redeemTokens = balanceOf[address(this)]; redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18); require(redeemAmount > 0, "Impermax: REDEEM_AMOUNT_ZERO"); require(redeemAmount <= totalBalance, "Impermax: INSUFFICIENT_CASH"); _burn(address(this), redeemTokens); _safeTransfer(redeemer, redeemAmount); emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens); } // force real balance to match totalBalance function skim(address to) external nonReentrant { _safeTransfer(to, IERC20(underlying).balanceOf(address(this)).sub(totalBalance)); } // force totalBalance to match real balance function sync() external nonReentrant update {} /*** Utilities ***/ // same safe transfer function used by UniSwapV2 (with fixed underlying) bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); function _safeTransfer(address to, uint amount) internal { (bool success, bytes memory data) = underlying.call(abi.encodeWithSelector(SELECTOR, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Impermax: TRANSFER_FAILED"); } // prevents a contract from calling itself, directly or indirectly. bool internal _notEntered = true; modifier nonReentrant() { require(_notEntered, "Impermax: REENTERED"); _notEntered = false; _; _notEntered = true; } // update totalBalance with current balance modifier update() { _; _update(); } } // File: contracts\interfaces\IBaseV1Router01.sol pragma solidity >=0.5.0; interface IBaseV1Router01 { function factory() external pure returns (address); function pairFor(address, address, bool) external view returns(address); function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external returns (uint[] memory amounts); } // File: contracts\interfaces\IBaseV1Pair.sol pragma solidity >=0.5.0; interface IBaseV1Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function stable() external view returns (bool); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function token0() external view returns (address); function token1() external view returns (address); function tokens() external view returns (address, address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function observationLength() external view returns (uint); function observations(uint) external view returns ( uint timestamp, uint reserve0Cumulative, uint reserve1Cumulative ); function currentCumulativePrices() external view returns ( uint reserve0Cumulative, uint reserve1Cumulative, uint timestamp ); function metadata() external view returns (uint, uint, uint, uint, bool, address, address); function feeRatio() external view returns (uint); function sync() external; } // File: contracts\interfaces\IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function stable() external view returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); } // File: contracts\interfaces\IBaseV1Factory.sol pragma solidity >=0.5.0; interface IBaseV1Factory { function getPair(address tokenA, address tokenB, bool stable) external view returns (address pair); } // File: contracts\interfaces\ISolidlyVoter.sol pragma solidity >=0.5.0; interface ISolidlyVoter { function gauges(address token) external view returns (address); } // File: contracts\interfaces\ISolidlyGauge3.sol pragma solidity >=0.5.0; interface ISolidlyGauge3 { function notifyRewardAmount(address token, uint amount) external; function getReward() external; function claimFees() external returns (uint claimed0, uint claimed1); function left(address token) external view returns (uint); function isForPair() external view returns (bool); function earned(address account) external view returns (uint); function balanceOf(address account) external view returns (uint); function rewardRate() external view returns (uint); function deposit(uint256 amount) external; function withdraw(uint256 amount) external; } // File: contracts\libraries\SafeToken.sol pragma solidity 0.5.16; interface ERC20Interface { function balanceOf(address user) external view returns (uint256); } library SafeToken { function myBalance(address token) internal view returns (uint256) { return ERC20Interface(token).balanceOf(address(this)); } function balanceOf(address token, address user) internal view returns (uint256) { return ERC20Interface(token).balanceOf(user); } function safeApprove(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeApprove"); } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransfer"); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "!safeTransferFrom"); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call.value(value)(new bytes(0)); require(success, "!safeTransferETH"); } } // File: contracts\libraries\Math.sol pragma solidity =0.5.16; // a library for performing various math operations // forked from: https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/libraries/Math.sol library Math { function min(uint x, uint y) internal pure returns (uint z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File: contracts\StakedLPTokenSolidlyStable5.sol pragma solidity =0.5.16; contract StakedLPTokenSolidlyStable5 is PoolToken { using SafeToken for address; bool public constant isStakedLPToken = true; string public constant stakedLPTokenType = "SolidlyStable5"; bool public constant stable = true; address public token0; address public token1; uint256 public decimals0; uint256 public decimals1; address public router; address public gauge; address public rewardsToken; address[] public bridgeTokens; // these should be stablecoins!!! uint256 public constant REINVEST_BOUNTY = 0.02e18; event Reinvest(address indexed caller, uint256 reward, uint256 bounty); function _initialize( address _underlying, address _router, address _voter, address _rewardsToken, address[] calldata _bridgeTokens ) external { require(factory == address(0), "StakedLPToken: FACTORY_ALREADY_SET"); // sufficient check factory = msg.sender; _setName("Staked Stable LP", "STKD-STBL"); underlying = _underlying; router = _router; gauge = ISolidlyVoter(_voter).gauges(underlying); require(gauge != address(0), "StakedLPToken: NO_GAUGE"); (decimals0, decimals1, , , ,token0, token1) = IBaseV1Pair(_underlying).metadata(); rewardsToken = _rewardsToken; bridgeTokens = _bridgeTokens; _rewardsToken.safeApprove(address(_router), uint256(-1)); _underlying.safeApprove(address(gauge), uint256(-1)); for (uint i = 0; i < _bridgeTokens.length; i++) { _bridgeTokens[i].safeApprove(address(_router), uint256(-1)); } } /*** PoolToken Overrides ***/ function _update() internal { uint256 _totalBalance = ISolidlyGauge3(gauge).balanceOf(address(this)); totalBalance = _totalBalance; emit Sync(_totalBalance); } // this low-level function should be called from another contract function mint(address minter) external nonReentrant update returns (uint mintTokens) { uint mintAmount = underlying.myBalance(); // handle pools with deposit fees by checking balance before and after deposit uint256 _totalBalanceBefore = ISolidlyGauge3(gauge).balanceOf(address(this)); ISolidlyGauge3(gauge).deposit(mintAmount); uint256 _totalBalanceAfter = ISolidlyGauge3(gauge).balanceOf(address(this)); mintTokens = _totalBalanceAfter.sub(_totalBalanceBefore).mul(1e18).div(exchangeRate()); if(totalSupply == 0) { // permanently lock the first MINIMUM_LIQUIDITY tokens mintTokens = mintTokens.sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } require(mintTokens > 0, "StakedLPToken: MINT_AMOUNT_ZERO"); _mint(minter, mintTokens); emit Mint(msg.sender, minter, mintAmount, mintTokens); } // this low-level function should be called from another contract function redeem(address redeemer) external nonReentrant update returns (uint redeemAmount) { uint redeemTokens = balanceOf[address(this)]; redeemAmount = redeemTokens.mul(exchangeRate()).div(1e18); require(redeemAmount > 0, "StakedLPToken: REDEEM_AMOUNT_ZERO"); require(redeemAmount <= totalBalance, "StakedLPToken: INSUFFICIENT_CASH"); _burn(address(this), redeemTokens); ISolidlyGauge3(gauge).withdraw(redeemAmount); _safeTransfer(redeemer, redeemAmount); emit Redeem(msg.sender, redeemer, redeemAmount, redeemTokens); } /*** Reinvest ***/ function _optimalDeposit( uint256 _amountA, uint256 _amountB, uint256 _reserveA, uint256 _reserveB, uint256 _decimalsA, uint256 _decimalsB ) internal pure returns (uint256) { uint256 num; uint256 den; { uint256 a = _amountA.mul(1e18).div(_decimalsA); uint256 b = _amountB.mul(1e18).div(_decimalsB); uint256 x = _reserveA.mul(1e18).div(_decimalsA); uint256 y = _reserveB.mul(1e18).div(_decimalsB); uint256 p; { uint256 x2 = x.mul(x).div(1e18); uint256 y2 = y.mul(y).div(1e18); p = y.mul(x2.mul(3).add(y2).mul(1e18).div(y2.mul(3).add(x2))).div(x); } num = a.mul(y).sub(b.mul(x)); den = a.add(x).mul(p).div(1e18).add(y).add(b); } return num.div(den).mul(_decimalsA).div(1e18); } function approveRouter(address token, uint256 amount) internal { if (IERC20(token).allowance(address(this), router) >= amount) return; token.safeApprove(address(router), uint256(-1)); } function swapExactTokensForTokens(address tokenIn, address tokenOut, uint256 amount) internal { approveRouter(tokenIn, amount); IBaseV1Router01(router).swapExactTokensForTokensSimple(amount, 0, tokenIn, tokenOut, false, address(this), now); } function swapExactStableForStable(address tokenIn, address tokenOut, uint256 amount) internal { approveRouter(tokenIn, amount); IBaseV1Router01(router).swapExactTokensForTokensSimple(amount, 0, tokenIn, tokenOut, true, address(this), now); } function addLiquidity(address tokenA, address tokenB, uint256 amountA, uint256 amountB) internal returns (uint256 liquidity) { approveRouter(tokenA, amountA); approveRouter(tokenB, amountB); (,,liquidity) = IBaseV1Router01(router).addLiquidity(tokenA, tokenB, true, amountA, amountB, 0, 0, address(this), now); } function _getReward() internal returns (uint256 amount) { ISolidlyGauge3(gauge).getReward(); return rewardsToken.myBalance(); } function getReward() external nonReentrant returns (uint256) { require(msg.sender == tx.origin); return _getReward(); } function _swapWithBestBridge() internal view returns (address bestBridgeToken, uint bestIndex) { for (uint i = 0; i < bridgeTokens.length; i++) { if (token0 == bridgeTokens[i]) return (bridgeTokens[i], 0); if (token1 == bridgeTokens[i]) return (bridgeTokens[i], 1); } (uint256 r0, uint256 r1,) = IUniswapV2Pair(underlying).getReserves(); address[2] memory tokens = [token0, token1]; uint[2] memory reserves = [r0, r1]; bestBridgeToken = bridgeTokens[0]; bestIndex = 0; uint bestLiquidity = 0; address pairFactory = IBaseV1Router01(router).factory(); for (uint i = 0; i < bridgeTokens.length; i++) { for (uint j = 0; j < 2; j++) { address pair = IBaseV1Factory(pairFactory).getPair(tokens[j], bridgeTokens[i], true); if (pair == address(0)) continue; uint liquidity = tokens[j].balanceOf(pair).mul(1e18).div(reserves[j]); if (liquidity > bestLiquidity) { bestLiquidity = liquidity; bestIndex = j; bestBridgeToken = bridgeTokens[i]; } } } return (bestBridgeToken, bestIndex); } function reinvest() external nonReentrant update { require(msg.sender == tx.origin); // 1. Withdraw all the rewards. uint256 reward = _getReward(); if (reward == 0) return; // 2. Send the reward bounty to the caller. uint256 bounty = reward.mul(REINVEST_BOUNTY) / 1e18; rewardsToken.safeTransfer(msg.sender, bounty); // 3. Convert all the remaining rewards to token0 or token1. address tokenA; address tokenB; if (token0 == rewardsToken || token1 == rewardsToken) { (tokenA, tokenB) = token0 == rewardsToken ? (token0, token1) : (token1, token0); } else { (address bridgeToken, uint index) = _swapWithBestBridge(); swapExactTokensForTokens(rewardsToken, bridgeToken, reward.sub(bounty)); if (token0 == bridgeToken || token1 == bridgeToken) { (tokenA, tokenB) = token0 == bridgeToken ? (token0, token1) : (token1, token0); } else { swapExactStableForStable(bridgeToken, index == 0 ? token0 : token1, bridgeToken.myBalance()); (tokenA, tokenB) = index == 0 ? (token0, token1) : (token1, token0); } } // 4. Convert tokenA to LP Token underlyings. uint256 totalAmountA = tokenA.myBalance(); uint256 totalAmountB = tokenB.myBalance(); assert(totalAmountA > 0); uint256 decimalsA; uint256 decimalsB; uint256 reserveA; uint256 reserveB; { (uint256 r0, uint256 r1, ) = IUniswapV2Pair(underlying).getReserves(); (decimalsA, decimalsB, reserveA, reserveB) = tokenA == token0 ? (decimals0, decimals1, r0, r1) : (decimals1, decimals0, r1, r0); } uint256 swapAmount = _optimalDeposit(totalAmountA, totalAmountB, reserveA, reserveB, decimalsA, decimalsB); swapExactStableForStable(tokenA, tokenB, swapAmount); addLiquidity(tokenA, tokenB, totalAmountA.sub(swapAmount), tokenB.myBalance()); emit Reinvest(msg.sender, reward, bounty); } /*** Mirrored From uniswapV2Pair ***/ function getScale() internal view returns (uint256 scale) { // if no token has been minted yet mirror uniswap getReserves if (totalSupply == 0) return 1e18; // else, adjust to the underlying reserves of this contract uint256 _totalSupply = IUniswapV2Pair(underlying).totalSupply(); return totalBalance.mul(1e18).div(_totalSupply); } function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) { (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = IUniswapV2Pair(underlying).getReserves(); uint scale = getScale(); reserve0 = safe112(_reserve0.mul(scale).div(1e18)); reserve1 = safe112(_reserve1.mul(scale).div(1e18)); blockTimestampLast = uint32(_blockTimestampLast % 2**32); require(reserve0 > 100 && reserve1 > 100, "StakedLPToken: INSUFFICIENT_RESERVES"); } /*** Mirrored from BaseV2Pair ***/ function observationLength() external view returns (uint) { return IBaseV1Pair(underlying).observationLength(); } function observations(uint index) external view returns ( uint timestamp, uint reserve0Cumulative, uint reserve1Cumulative ) { (timestamp, reserve0Cumulative, reserve1Cumulative) = IBaseV1Pair(underlying).observations(index); uint scale = getScale(); reserve0Cumulative = reserve0Cumulative.mul(scale).div(1e18); reserve1Cumulative = reserve1Cumulative.mul(scale).div(1e18); } function currentCumulativePrices() external view returns ( uint reserve0Cumulative, uint reserve1Cumulative, uint timestamp ) { (reserve0Cumulative, reserve1Cumulative, timestamp) = IBaseV1Pair(underlying).currentCumulativePrices(); uint scale = getScale(); reserve0Cumulative = reserve0Cumulative.mul(scale).div(1e18); reserve1Cumulative = reserve1Cumulative.mul(scale).div(1e18); } function metadata() external view returns (uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1) { (dec0, dec1, r0, r1, st, t0, t1) = IBaseV1Pair(underlying).metadata(); } /*** Utilities ***/ function safe112(uint256 n) internal pure returns (uint112) { require(n < 2**112, "StakedLPToken: SAFE112"); return uint112(n); } } // File: contracts\StakedLPTokenFactorySolidlyStable3.sol pragma solidity =0.5.16; contract StakedLPTokenFactorySolidlyStable5 { address public router; address public voter; address public rewardsToken; address[] public bridgeTokens; mapping(address => address) public getStakedLPToken; address[] public allStakedLPToken; event StakedLPTokenCreated(address indexed token0, address indexed token1, address indexed pair, address stakedLPToken, uint); constructor(address _router, address _voter, address _rewardsToken, address[] memory _bridgeTokens) public { router = _router; voter = _voter; rewardsToken = _rewardsToken; bridgeTokens = _bridgeTokens; } function allStakedLPTokenLength() external view returns (uint) { return allStakedLPToken.length; } function createStakedLPToken(address pair) external returns (address stakedLPToken) { require(getStakedLPToken[pair] == address(0), "StakedLPTokenFactory: POOL_EXISTS"); require(IBaseV1Pair(pair).stable(), "StakedLPTokenFactory: VOLATILE_PAIR"); address token0 = IUniswapV2Pair(pair).token0(); address token1 = IUniswapV2Pair(pair).token1(); bytes memory bytecode = type(StakedLPTokenSolidlyStable5).creationCode; assembly { stakedLPToken := create2(0, add(bytecode, 32), mload(bytecode), pair) } StakedLPTokenSolidlyStable5(stakedLPToken)._initialize(pair, router, voter, rewardsToken, bridgeTokens); getStakedLPToken[pair] = stakedLPToken; allStakedLPToken.push(stakedLPToken); emit StakedLPTokenCreated(token0, token1, pair, stakedLPToken, allStakedLPToken.length); } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bounty","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBalance","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REINVEST_BOUNTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address[]","name":"_bridgeTokens","type":"address[]"}],"name":"_initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_setFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bridgeTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isStakedLPToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"metadata","outputs":[{"internalType":"uint256","name":"dec0","type":"uint256"},{"internalType":"uint256","name":"dec1","type":"uint256"},{"internalType":"uint256","name":"r0","type":"uint256"},{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"bool","name":"st","type":"bool"},{"internalType":"address","name":"t0","type":"address"},{"internalType":"address","name":"t1","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"mintTokens","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"redeemer","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stakedLPTokenType","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526002805460ff19908116601217909155600b805490911660011790556147d68061002f6000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c806370e5a89811610191578063bc25cf77116100e3578063dd62ed3e11610097578063f887ea4011610071578063f887ea401461086e578063fdb5a03e14610876578063fff6cae91461087e576102e9565b8063dd62ed3e14610823578063e8bea1671461085e578063ebeb31db14610866576102e9565b8063d1af0c7d116100c8578063d1af0c7d146107b5578063d21220a7146107bd578063d505accf146107c5576102e9565b8063bc25cf771461077a578063c45a0155146107ad576102e9565b8063a28af8a411610145578063ad7a672f1161011f578063ad7a672f146106c5578063b7ea9b17146106cd578063ba9a7a5614610772576102e9565b8063a28af8a41461067c578063a6f19c8414610684578063a9059cbb1461068c576102e9565b80637ecebe00116101765780637ecebe001461060e57806395a2251f1461064157806395d89b4114610674576102e9565b806370e5a898146105e95780637bdd6b4414610606576102e9565b806330adf81f1161024a5780633d18b912116101fe5780636c2a3bc5116101d85780636c2a3bc5146105a65780636f307dc3146105ae57806370a08231146105b6576102e9565b80633d18b912146105615780634a5d316c146105695780636a62784214610573576102e9565b80633644e5151161022f5780633644e515146104f6578063392f37e9146104fe5780633ba0b9a914610559576102e9565b806330adf81f146104d0578063313ce567146104d8576102e9565b806318160ddd116102a157806322be3de11161028657806322be3de1146103f757806323b872dd14610470578063252c09d7146104b3576102e9565b806318160ddd146104305780631df8c7171461044a576102e9565b8063095ea7b3116102d2578063095ea7b3146103aa5780630a641063146103f75780630dfe1681146103ff576102e9565b806306fdde03146102ee5780630902f1ac1461036b575b600080fd5b6102f6610886565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610330578181015183820152602001610318565b50505050905090810190601f16801561035d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610373610932565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103e3600480360360408110156103c057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610af2565b604080519115158252519081900360200190f35b6103e3610b09565b610407610b0e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610438610b2f565b60408051918252519081900360200190f35b610452610b35565b60408051938452602084019290925282820152519081900360600190f35b6103e36004803603606081101561048657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c30565b610452600480360360208110156104c957600080fd5b5035610d44565b610438610e4c565b6104e0610e70565b6040805160ff9092168252519081900360200190f35b610438610e79565b610506610e7f565b6040805197885260208801969096528686019490945260608601929092521515608085015273ffffffffffffffffffffffffffffffffffffffff90811660a08501521660c0830152519081900360e00190f35b610438610f53565b610438610fa3565b610571611083565b005b6104386004803603602081101561058957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b610438611531565b61040761153c565b610438600480360360208110156105cc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611558565b610407600480360360208110156105ff57600080fd5b503561156a565b61043861159e565b6104386004803603602081101561062457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115a4565b6104386004803603602081101561065757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115b6565b6102f661184f565b6104386118c7565b6104076118cd565b6103e3600480360360408110156106a257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118e9565b6104386118f6565b610571600480360360a08110156106e357600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135831692606083013516919081019060a08101608082013564010000000081111561073357600080fd5b82018360208201111561074557600080fd5b8035906020019184602083028401116401000000008311171561076757600080fd5b5090925090506118fc565b610438611dd9565b6105716004803603602081101561079057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ddf565b610407611f62565b610407611f7e565b610407611f9a565b610571600480360360e08110156107db57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611fb6565b6104386004803603604081101561083957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611ff1565b6102f661200e565b610438612047565b6104076120e3565b6105716120ff565b6105716126f6565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156109a357600080fd5b505afa1580156109b7573d6000803e3d6000fd5b505050506040513d60608110156109cd57600080fd5b50805160208201516040909201516dffffffffffffffffffffffffffff91821695509116925063ffffffff1690506000610a05612797565b9050610a37610a32670de0b6b3a7640000610a26878563ffffffff61287416565b9063ffffffff6128ee16565b612930565b9650610a58610a32670de0b6b3a7640000610a26868563ffffffff61287416565b9550640100000000820694506064876dffffffffffffffffffffffffffff16118015610a9457506064866dffffffffffffffffffffffffffff16115b610ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806146c86024913960400191505060405180910390fd5b50505050909192565b6000610aff3384846129b3565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b158015610ba257600080fd5b505afa158015610bb6573d6000803e3d6000fd5b505050506040513d6060811015610bcc57600080fd5b508051602082015160409092015190945090925090506000610bec612797565b9050610c0a670de0b6b3a7640000610a26868463ffffffff61287416565b9350610c28670de0b6b3a7640000610a26858463ffffffff61287416565b925050909192565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610d2f57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610cfd91849063ffffffff612a2216565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610d3a848484612ad3565b5060019392505050565b600854604080517f252c09d70000000000000000000000000000000000000000000000000000000081526004810184905290516000928392839273ffffffffffffffffffffffffffffffffffffffff9092169163252c09d791602480820192606092909190829003018186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d6060811015610de757600080fd5b508051602082015160409092015190945090925090506000610e07612797565b9050610e25670de0b6b3a7640000610a26858463ffffffff61287416565b9250610e43670de0b6b3a7640000610a26848463ffffffff61287416565b93959294505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b6000806000806000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663392f37e96040518163ffffffff1660e01b815260040160e06040518083038186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d60e0811015610f1c57600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949d939c50919a509850965091945092509050565b600354600a5460009190811580610f68575080155b15610f7f57670de0b6b3a764000092505050610fa0565b610f9b82610a2683670de0b6b3a764000063ffffffff61287416565b925050505b90565b600b5460009060ff1661101757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905533321461104b57600080fd5b611053612bec565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff161561110857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496d7065726d61783a20464143544f52595f414c52454144595f534554000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff166111a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556008546000906111f59073ffffffffffffffffffffffffffffffffffffffff16612c97565b601054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d602081101561129657600080fd5b5051601054604080517fb6b55f2500000000000000000000000000000000000000000000000000000000815260048101869052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163b6b55f259160248082019260009290919082900301818387803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b5050601054604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000945073ffffffffffffffffffffffffffffffffffffffff90921692506370a08231916024808301926020929190829003018186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d60208110156113c357600080fd5b505190506113fa6113d2610f53565b610a26670de0b6b3a76400006113ee858763ffffffff612d3916565b9063ffffffff61287416565b93506003546000141561142857611419846103e863ffffffff612d3916565b935061142860006103e8612d7b565b6000841161149757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00604482015290519081900360640190fd5b6114a18585612d7b565b6040805184815260208101869052815173ffffffffffffffffffffffffffffffffffffffff88169233927f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee929081900390910190a3505050611501612e2c565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b6012818154811061157757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600d5481565b60076020526000908152604090205481565b600b5460009060ff1661162a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905530600090815260046020526040902054611686670de0b6b3a7640000610a26611679610f53565b849063ffffffff61287416565b9150600082116116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146ec6021913960400191505060405180910390fd5b600a5482111561175257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348604482015290519081900360640190fd5b61175c3082612f08565b601054604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052905173ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9160248082019260009290919082900301818387803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b505050506117f18383612fcc565b6040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff86169233927f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc929081900390910190a350611501612e2c565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b600e5481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b6000610aff338484612ad3565b600a5481565b60095473ffffffffffffffffffffffffffffffffffffffff161561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147806022913960400191505060405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155604080518082018252601081527f5374616b656420537461626c65204c500000000000000000000000000000000060208083019190915282518084019093529282527f53544b442d5354424c000000000000000000000000000000000000000000000092820192909252611a0991906131d8565b6008805473ffffffffffffffffffffffffffffffffffffffff8089167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161792839055600f8054898316931692909217909155604080517fb9a09fd50000000000000000000000000000000000000000000000000000000081529282166004840152519086169163b9a09fd5916024808301926020929190829003018186803b158015611ab757600080fd5b505afa158015611acb573d6000803e3d6000fd5b505050506040513d6020811015611ae157600080fd5b5051601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179081905516611b9257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000604482015290519081900360640190fd5b8573ffffffffffffffffffffffffffffffffffffffff1663392f37e96040518163ffffffff1660e01b815260040160e06040518083038186803b158015611bd857600080fd5b505afa158015611bec573d6000803e3d6000fd5b505050506040513d60e0811015611c0257600080fd5b508051602082015160a083015160c090930151600c805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600b8054958316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90961695909517909455600e91909155600d919091556011805491861691909216179055611cb560128383614555565b50611cfd73ffffffffffffffffffffffffffffffffffffffff8416867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b601054611d4a9073ffffffffffffffffffffffffffffffffffffffff88811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b60005b81811015611dd057611dc8867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585818110611d8657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132bc9092919063ffffffff16565b600101611d4d565b50505050505050565b6103e881565b600b5460ff16611e5057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a54600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611f34938593611f2f93919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015611ef757600080fd5b505afa158015611f0b573d6000803e3d6000fd5b505050506040513d6020811015611f2157600080fd5b50519063ffffffff612d3916565b612fcc565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60115473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b611fe6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9613499565b611dd08787876129b3565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600e81526020017f536f6c69646c79537461626c653500000000000000000000000000000000000081525081565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b5051905090565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff1661217057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690553332146121a457600080fd5b60006121ae612bec565b9050806121bb57506126c1565b6000670de0b6b3a76400006121dd8366470de4df82000063ffffffff61287416565b816121e457fe5b60115491900491506122139073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff61373c16565b601154600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff908116911614806122665750601154600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b156122f057601154600b54610100900473ffffffffffffffffffffffffffffffffffffffff9081169116146122c057600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166122e6565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90925090506124cd565b6000806122fb613912565b60115491935091506123339073ffffffffffffffffffffffffffffffffffffffff168361232e898963ffffffff612d3916565b613dcc565b600b5473ffffffffffffffffffffffffffffffffffffffff83811661010090920416148061237b5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b1561240257600b5473ffffffffffffffffffffffffffffffffffffffff83811661010090920416146123d257600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166123f8565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092506124ca565b61246d82821561242a57600c5473ffffffffffffffffffffffffffffffffffffffff16612449565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b6124688573ffffffffffffffffffffffffffffffffffffffff16612c97565b613f5d565b801561249e57600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166124c4565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b60006124ee8373ffffffffffffffffffffffffffffffffffffffff16612c97565b905060006125118373ffffffffffffffffffffffffffffffffffffffff16612c97565b90506000821161251d57fe5b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561258e57600080fd5b505afa1580156125a2573d6000803e3d6000fd5b505050506040513d60608110156125b857600080fd5b508051602090910151600b546dffffffffffffffffffffffffffff92831694509116915073ffffffffffffffffffffffffffffffffffffffff8b8116610100909204161461260d57600e54600d548284612616565b600d54600e5483835b92985090965094509250600091506126349050878785858989614001565b9050612641898983613f5d565b61267a89896126568a8563ffffffff612d3916565b6126758c73ffffffffffffffffffffffffffffffffffffffff16612c97565b6141b2565b50604080518c8152602081018c9052815133927fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f28928290030190a250505050505050505050505b6126c9612e2c565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661276757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556126c9612e2c565b6000600354600014156127b35750670de0b6b3a7640000610fa0565b600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561281e57600080fd5b505afa158015612832573d6000803e3d6000fd5b505050506040513d602081101561284857600080fd5b5051600a5490915061286e908290610a2690670de0b6b3a764000063ffffffff61287416565b91505090565b60008261288357506000610b03565b8282028284828161289057fe5b04146128e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061475f6021913960400191505060405180910390fd5b9392505050565b60006128e783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142b0565b60006e01000000000000000000000000000082106129af57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616b65644c50546f6b656e3a205341464531313200000000000000000000604482015290519081900360640190fd5b5090565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008184841115612acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a90578181015183820152602001612a78565b50505050905090810190601f168015612abd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff8616600090815260049091529190912054612b4191839063ffffffff612a2216565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600460205260408082209390935590841681522054612b83908263ffffffff61432f16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b601054604080517f3d18b912000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633d18b912916004808301928692919082900301818387803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b5050601154612c92925073ffffffffffffffffffffffffffffffffffffffff169050612c97565b905090565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612d0757600080fd5b505afa158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b505192915050565b60006128e783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612a22565b600354612d8e908263ffffffff61432f16565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612dc7908263ffffffff61432f16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526004602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b601054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015612e9d57600080fd5b505afa158015612eb1573d6000803e3d6000fd5b505050506040513d6020811015612ec757600080fd5b5051600a8190556040805182815290519192507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4919081900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612f3e908263ffffffff612d3916565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612f77908263ffffffff612d3916565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009560609594169382918083835b602083106130d257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613095565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613134576040519150601f19603f3d011682016040523d82523d6000602084013e613139565b606091505b5091509150818015613167575080511580613167575080806020019051602081101561316457600080fd5b50515b6131d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496d7065726d61783a205452414e534645525f4641494c454400000000000000604482015290519081900360640190fd5b50505050565b81516131eb9060009060208501906145d9565b5080516131ff9060019060208401906145d9565b50604051469080605261470d82396040805191829003605201822086516020978801208383018352600184527f310000000000000000000000000000000000000000000000000000000000000093880193909352815180880191909152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c090910190925250805192019190912060065550565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061339257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613355565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133f4576040519150601f19603f3d011682016040523d82523d6000602084013e6133f9565b606091505b5091509150818015613427575080511580613427575080806020019051602081101561342457600080fd5b50515b61349257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2173616665417070726f76650000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050565b4285101561350857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496d7065726d61783a2045585049524544000000000000000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff808a1660008181526007602090815260408083208054600180820190925582518085018a905280840196909652958e166060860152608085018d905260a085019590955260c08085018c90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff8a166101828501526101a284018990526101c28401889052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561364a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906136c557508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61373057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000604482015290519081900360640190fd5b50505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061381257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016137d5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613874576040519150601f19603f3d011682016040523d82523d6000602084013e613879565b606091505b50915091508180156138a75750805115806138a757508080602001905160208110156138a457600080fd5b50515b61349257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f21736166655472616e7366657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080805b601254811015613a1b576012818154811061392e57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff9081169116141561399b576012818154811061396f57fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff1693509150613dc89050565b601281815481106139a857fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613a1357601281815481106139e457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925060019150613dc89050565b600101613917565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a8757600080fd5b505afa158015613a9b573d6000803e3d6000fd5b505050506040513d6060811015613ab157600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050613ad9614653565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c54166020820152613b17614653565b60405180604001604052808581526020018481525090506012600081548110613b3c57fe5b600091825260208083209190910154600f54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b158015613bbd57600080fd5b505afa158015613bd1573d6000803e3d6000fd5b505050506040513d6020811015613be757600080fd5b5051905060005b601254811015613dc05760005b6002811015613db75760008373ffffffffffffffffffffffffffffffffffffffff16636801cc30888460028110613c2e57fe5b602002015160128681548110613c4057fe5b60009182526020918290200154604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529390911660248401526001604484015251606480840193829003018186803b158015613cc257600080fd5b505afa158015613cd6573d6000803e3d6000fd5b505050506040513d6020811015613cec57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116613d115750613daf565b6000613d6a878460028110613d2257fe5b6020020151610a26670de0b6b3a76400006113ee868d8960028110613d4357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff6143a316565b905085811115613dac57809550829a5060128481548110613d8757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b600101613bfb565b50600101613bee565b505050505050505b9091565b613dd68382614455565b600f54604080517f13dcfc590000000000000000000000000000000000000000000000000000000081526004810184905260006024820181905273ffffffffffffffffffffffffffffffffffffffff87811660448401528681166064840152608483018290523060a48401524260c4840152925192909316926313dcfc599260e48084019382900301818387803b158015613e7057600080fd5b505af1158015613e84573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613ecb57600080fd5b8101908080516040519392919084640100000000821115613eeb57600080fd5b908301906020820185811115613f0057600080fd5b8251866020820283011164010000000082111715613f1d57600080fd5b82525081516020918201928201910280838360005b83811015613f4a578181015183820152602001613f32565b5050505090500160405250505050505050565b613f678382614455565b600f54604080517f13dcfc590000000000000000000000000000000000000000000000000000000081526004810184905260006024820181905273ffffffffffffffffffffffffffffffffffffffff87811660448401528681166064840152600160848401523060a48401524260c4840152925192909316926313dcfc599260e48084019382900301818387803b158015613e7057600080fd5b600080808061402286610a268c670de0b6b3a764000063ffffffff61287416565b9050600061404286610a268c670de0b6b3a764000063ffffffff61287416565b9050600061406288610a268c670de0b6b3a764000063ffffffff61287416565b9050600061408288610a268c670de0b6b3a764000063ffffffff61287416565b90506000806140a3670de0b6b3a7640000610a26868063ffffffff61287416565b905060006140c3670de0b6b3a7640000610a26868063ffffffff61287416565b905061411e85610a266141116140f0866140e487600363ffffffff61287416565b9063ffffffff61432f16565b610a26670de0b6b3a76400006113ee886140e48b600363ffffffff61287416565b879063ffffffff61287416565b925061415391506141379050858563ffffffff61287416565b614147878563ffffffff61287416565b9063ffffffff612d3916565b965061417b846140e48481670de0b6b3a7640000610a26876113ee8d8c63ffffffff61432f16565b955050505050506141a5670de0b6b3a7640000610a26876113ee85876128ee90919063ffffffff16565b9998505050505050505050565b60006141be8584614455565b6141c88483614455565b600f54604080517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528781166024830152600160448301526064820187905260848201869052600060a4830181905260c483018190523060e4840152426101048401529251931692635a47ddc39261012480840193606093929083900390910190829087803b15801561427857600080fd5b505af115801561428c573d6000803e3d6000fd5b505050506040513d60608110156142a257600080fd5b506040015195945050505050565b60008183614319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612a90578181015183820152602001612a78565b50600083858161432557fe5b0495945050505050565b6000828201838110156128e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561442257600080fd5b505afa158015614436573d6000803e3d6000fd5b505050506040513d602081101561444c57600080fd5b50519392505050565b600f54604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92831660248201529051839285169163dd62ed3e916044808301926020929190829003018186803b1580156144ce57600080fd5b505afa1580156144e2573d6000803e3d6000fd5b505050506040513d60208110156144f857600080fd5b50511061450457614551565b600f546145519073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b5050565b8280548282559060005260206000209081019282156145cd579160200282015b828111156145cd5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614575565b506129af929150614671565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061461a57805160ff1916838001178555614647565b82800160010185558215614647579182015b8281111561464757825182559160200191906001019061462c565b506129af9291506146ad565b60405180604001604052806002906020820280388339509192915050565b610fa091905b808211156129af5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101614677565b610fa091905b808211156129af57600081556001016146b356fe5374616b65644c50546f6b656e3a20494e53554646494349454e545f52455345525645535374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a45524f454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f534554a265627a7a723158208d0d3e6ccd109d8e4ec686db839207747ae4f28c51cb15f788871a8b59efbc6164736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c806370e5a89811610191578063bc25cf77116100e3578063dd62ed3e11610097578063f887ea4011610071578063f887ea401461086e578063fdb5a03e14610876578063fff6cae91461087e576102e9565b8063dd62ed3e14610823578063e8bea1671461085e578063ebeb31db14610866576102e9565b8063d1af0c7d116100c8578063d1af0c7d146107b5578063d21220a7146107bd578063d505accf146107c5576102e9565b8063bc25cf771461077a578063c45a0155146107ad576102e9565b8063a28af8a411610145578063ad7a672f1161011f578063ad7a672f146106c5578063b7ea9b17146106cd578063ba9a7a5614610772576102e9565b8063a28af8a41461067c578063a6f19c8414610684578063a9059cbb1461068c576102e9565b80637ecebe00116101765780637ecebe001461060e57806395a2251f1461064157806395d89b4114610674576102e9565b806370e5a898146105e95780637bdd6b4414610606576102e9565b806330adf81f1161024a5780633d18b912116101fe5780636c2a3bc5116101d85780636c2a3bc5146105a65780636f307dc3146105ae57806370a08231146105b6576102e9565b80633d18b912146105615780634a5d316c146105695780636a62784214610573576102e9565b80633644e5151161022f5780633644e515146104f6578063392f37e9146104fe5780633ba0b9a914610559576102e9565b806330adf81f146104d0578063313ce567146104d8576102e9565b806318160ddd116102a157806322be3de11161028657806322be3de1146103f757806323b872dd14610470578063252c09d7146104b3576102e9565b806318160ddd146104305780631df8c7171461044a576102e9565b8063095ea7b3116102d2578063095ea7b3146103aa5780630a641063146103f75780630dfe1681146103ff576102e9565b806306fdde03146102ee5780630902f1ac1461036b575b600080fd5b6102f6610886565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610330578181015183820152602001610318565b50505050905090810190601f16801561035d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610373610932565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103e3600480360360408110156103c057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610af2565b604080519115158252519081900360200190f35b6103e3610b09565b610407610b0e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610438610b2f565b60408051918252519081900360200190f35b610452610b35565b60408051938452602084019290925282820152519081900360600190f35b6103e36004803603606081101561048657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c30565b610452600480360360208110156104c957600080fd5b5035610d44565b610438610e4c565b6104e0610e70565b6040805160ff9092168252519081900360200190f35b610438610e79565b610506610e7f565b6040805197885260208801969096528686019490945260608601929092521515608085015273ffffffffffffffffffffffffffffffffffffffff90811660a08501521660c0830152519081900360e00190f35b610438610f53565b610438610fa3565b610571611083565b005b6104386004803603602081101561058957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b610438611531565b61040761153c565b610438600480360360208110156105cc57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611558565b610407600480360360208110156105ff57600080fd5b503561156a565b61043861159e565b6104386004803603602081101561062457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115a4565b6104386004803603602081101561065757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166115b6565b6102f661184f565b6104386118c7565b6104076118cd565b6103e3600480360360408110156106a257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118e9565b6104386118f6565b610571600480360360a08110156106e357600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135831692606083013516919081019060a08101608082013564010000000081111561073357600080fd5b82018360208201111561074557600080fd5b8035906020019184602083028401116401000000008311171561076757600080fd5b5090925090506118fc565b610438611dd9565b6105716004803603602081101561079057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ddf565b610407611f62565b610407611f7e565b610407611f9a565b610571600480360360e08110156107db57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611fb6565b6104386004803603604081101561083957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611ff1565b6102f661200e565b610438612047565b6104076120e3565b6105716120ff565b6105716126f6565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081565b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156109a357600080fd5b505afa1580156109b7573d6000803e3d6000fd5b505050506040513d60608110156109cd57600080fd5b50805160208201516040909201516dffffffffffffffffffffffffffff91821695509116925063ffffffff1690506000610a05612797565b9050610a37610a32670de0b6b3a7640000610a26878563ffffffff61287416565b9063ffffffff6128ee16565b612930565b9650610a58610a32670de0b6b3a7640000610a26868563ffffffff61287416565b9550640100000000820694506064876dffffffffffffffffffffffffffff16118015610a9457506064866dffffffffffffffffffffffffffff16115b610ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806146c86024913960400191505060405180910390fd5b50505050909192565b6000610aff3384846129b3565b5060015b92915050565b600181565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631df8c7176040518163ffffffff1660e01b815260040160606040518083038186803b158015610ba257600080fd5b505afa158015610bb6573d6000803e3d6000fd5b505050506040513d6060811015610bcc57600080fd5b508051602082015160409092015190945090925090506000610bec612797565b9050610c0a670de0b6b3a7640000610a26868463ffffffff61287416565b9350610c28670de0b6b3a7640000610a26858463ffffffff61287416565b925050909192565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610d2f57604080518082018252601e81527f496d7065726d61783a205452414e534645525f4e4f545f414c4c4f574544000060208083019190915273ffffffffffffffffffffffffffffffffffffffff87166000908152600582528381203382529091529190912054610cfd91849063ffffffff612a2216565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610d3a848484612ad3565b5060019392505050565b600854604080517f252c09d70000000000000000000000000000000000000000000000000000000081526004810184905290516000928392839273ffffffffffffffffffffffffffffffffffffffff9092169163252c09d791602480820192606092909190829003018186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d6060811015610de757600080fd5b508051602082015160409092015190945090925090506000610e07612797565b9050610e25670de0b6b3a7640000610a26858463ffffffff61287416565b9250610e43670de0b6b3a7640000610a26848463ffffffff61287416565b93959294505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60025460ff1681565b60065481565b6000806000806000806000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663392f37e96040518163ffffffff1660e01b815260040160e06040518083038186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d60e0811015610f1c57600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949d939c50919a509850965091945092509050565b600354600a5460009190811580610f68575080155b15610f7f57670de0b6b3a764000092505050610fa0565b610f9b82610a2683670de0b6b3a764000063ffffffff61287416565b925050505b90565b600b5460009060ff1661101757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905533321461104b57600080fd5b611053612bec565b9050600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590565b60095473ffffffffffffffffffffffffffffffffffffffff161561110857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496d7065726d61783a20464143544f52595f414c52454144595f534554000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b600b5460009060ff166111a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556008546000906111f59073ffffffffffffffffffffffffffffffffffffffff16612c97565b601054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561126c57600080fd5b505afa158015611280573d6000803e3d6000fd5b505050506040513d602081101561129657600080fd5b5051601054604080517fb6b55f2500000000000000000000000000000000000000000000000000000000815260048101869052905192935073ffffffffffffffffffffffffffffffffffffffff9091169163b6b55f259160248082019260009290919082900301818387803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b5050601054604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000945073ffffffffffffffffffffffffffffffffffffffff90921692506370a08231916024808301926020929190829003018186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d60208110156113c357600080fd5b505190506113fa6113d2610f53565b610a26670de0b6b3a76400006113ee858763ffffffff612d3916565b9063ffffffff61287416565b93506003546000141561142857611419846103e863ffffffff612d3916565b935061142860006103e8612d7b565b6000841161149757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5374616b65644c50546f6b656e3a204d494e545f414d4f554e545f5a45524f00604482015290519081900360640190fd5b6114a18585612d7b565b6040805184815260208101869052815173ffffffffffffffffffffffffffffffffffffffff88169233927f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee929081900390910190a3505050611501612e2c565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919050565b66470de4df82000081565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b6012818154811061157757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600d5481565b60076020526000908152604090205481565b600b5460009060ff1661162a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905530600090815260046020526040902054611686670de0b6b3a7640000610a26611679610f53565b849063ffffffff61287416565b9150600082116116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146ec6021913960400191505060405180910390fd5b600a5482111561175257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5374616b65644c50546f6b656e3a20494e53554646494349454e545f43415348604482015290519081900360640190fd5b61175c3082612f08565b601054604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052905173ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9160248082019260009290919082900301818387803b1580156117cf57600080fd5b505af11580156117e3573d6000803e3d6000fd5b505050506117f18383612fcc565b6040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff86169233927f3f693fff038bb8a046aa76d9516190ac7444f7d69cf952c4cbdc086fdef2d6fc929081900390910190a350611501612e2c565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b600e5481565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b6000610aff338484612ad3565b600a5481565b60095473ffffffffffffffffffffffffffffffffffffffff161561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147806022913960400191505060405180910390fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155604080518082018252601081527f5374616b656420537461626c65204c500000000000000000000000000000000060208083019190915282518084019093529282527f53544b442d5354424c000000000000000000000000000000000000000000000092820192909252611a0991906131d8565b6008805473ffffffffffffffffffffffffffffffffffffffff8089167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161792839055600f8054898316931692909217909155604080517fb9a09fd50000000000000000000000000000000000000000000000000000000081529282166004840152519086169163b9a09fd5916024808301926020929190829003018186803b158015611ab757600080fd5b505afa158015611acb573d6000803e3d6000fd5b505050506040513d6020811015611ae157600080fd5b5051601080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179081905516611b9257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5374616b65644c50546f6b656e3a204e4f5f4741554745000000000000000000604482015290519081900360640190fd5b8573ffffffffffffffffffffffffffffffffffffffff1663392f37e96040518163ffffffff1660e01b815260040160e06040518083038186803b158015611bd857600080fd5b505afa158015611bec573d6000803e3d6000fd5b505050506040513d60e0811015611c0257600080fd5b508051602082015160a083015160c090930151600c805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600b8054958316610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff90961695909517909455600e91909155600d919091556011805491861691909216179055611cb560128383614555565b50611cfd73ffffffffffffffffffffffffffffffffffffffff8416867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b601054611d4a9073ffffffffffffffffffffffffffffffffffffffff88811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b60005b81811015611dd057611dc8867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858585818110611d8657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132bc9092919063ffffffff16565b600101611d4d565b50505050505050565b6103e881565b600b5460ff16611e5057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a54600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611f34938593611f2f93919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b158015611ef757600080fd5b505afa158015611f0b573d6000803e3d6000fd5b505050506040513d6020811015611f2157600080fd5b50519063ffffffff612d3916565b612fcc565b50600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60115473ffffffffffffffffffffffffffffffffffffffff1681565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b611fe6878787878787877f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9613499565b611dd08787876129b3565b600560209081526000928352604080842090915290825290205481565b6040518060400160405280600e81526020017f536f6c69646c79537461626c653500000000000000000000000000000000000081525081565b600854604080517febeb31db000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163ebeb31db916004808301926020929190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b5051905090565b600f5473ffffffffffffffffffffffffffffffffffffffff1681565b600b5460ff1661217057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690553332146121a457600080fd5b60006121ae612bec565b9050806121bb57506126c1565b6000670de0b6b3a76400006121dd8366470de4df82000063ffffffff61287416565b816121e457fe5b60115491900491506122139073ffffffffffffffffffffffffffffffffffffffff16338363ffffffff61373c16565b601154600b546000918291610100900473ffffffffffffffffffffffffffffffffffffffff908116911614806122665750601154600c5473ffffffffffffffffffffffffffffffffffffffff9081169116145b156122f057601154600b54610100900473ffffffffffffffffffffffffffffffffffffffff9081169116146122c057600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166122e6565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90925090506124cd565b6000806122fb613912565b60115491935091506123339073ffffffffffffffffffffffffffffffffffffffff168361232e898963ffffffff612d3916565b613dcc565b600b5473ffffffffffffffffffffffffffffffffffffffff83811661010090920416148061237b5750600c5473ffffffffffffffffffffffffffffffffffffffff8381169116145b1561240257600b5473ffffffffffffffffffffffffffffffffffffffff83811661010090920416146123d257600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166123f8565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092506124ca565b61246d82821561242a57600c5473ffffffffffffffffffffffffffffffffffffffff16612449565b600b54610100900473ffffffffffffffffffffffffffffffffffffffff165b6124688573ffffffffffffffffffffffffffffffffffffffff16612c97565b613f5d565b801561249e57600c54600b5473ffffffffffffffffffffffffffffffffffffffff91821691610100909104166124c4565b600b54600c5473ffffffffffffffffffffffffffffffffffffffff610100909204821691165b90945092505b50505b60006124ee8373ffffffffffffffffffffffffffffffffffffffff16612c97565b905060006125118373ffffffffffffffffffffffffffffffffffffffff16612c97565b90506000821161251d57fe5b600080600080600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561258e57600080fd5b505afa1580156125a2573d6000803e3d6000fd5b505050506040513d60608110156125b857600080fd5b508051602090910151600b546dffffffffffffffffffffffffffff92831694509116915073ffffffffffffffffffffffffffffffffffffffff8b8116610100909204161461260d57600e54600d548284612616565b600d54600e5483835b92985090965094509250600091506126349050878785858989614001565b9050612641898983613f5d565b61267a89896126568a8563ffffffff612d3916565b6126758c73ffffffffffffffffffffffffffffffffffffffff16612c97565b6141b2565b50604080518c8152602081018c9052815133927fc003f45bc224d116b6d079100d4ab57a5b9633244c47a5a92a176c5b79a85f28928290030190a250505050505050505050505b6126c9612e2c565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600b5460ff1661276757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496d7065726d61783a205245454e544552454400000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556126c9612e2c565b6000600354600014156127b35750670de0b6b3a7640000610fa0565b600854604080517f18160ddd000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916318160ddd916004808301926020929190829003018186803b15801561281e57600080fd5b505afa158015612832573d6000803e3d6000fd5b505050506040513d602081101561284857600080fd5b5051600a5490915061286e908290610a2690670de0b6b3a764000063ffffffff61287416565b91505090565b60008261288357506000610b03565b8282028284828161289057fe5b04146128e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061475f6021913960400191505060405180910390fd5b9392505050565b60006128e783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506142b0565b60006e01000000000000000000000000000082106129af57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5374616b65644c50546f6b656e3a205341464531313200000000000000000000604482015290519081900360640190fd5b5090565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260056020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008184841115612acb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a90578181015183820152602001612a78565b50505050905090810190601f168015612abd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b604080518082018252601b81527f496d7065726d61783a205452414e534645525f544f4f5f48494748000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff8616600090815260049091529190912054612b4191839063ffffffff612a2216565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600460205260408082209390935590841681522054612b83908263ffffffff61432f16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b601054604080517f3d18b912000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff1691633d18b912916004808301928692919082900301818387803b158015612c5757600080fd5b505af1158015612c6b573d6000803e3d6000fd5b5050601154612c92925073ffffffffffffffffffffffffffffffffffffffff169050612c97565b905090565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612d0757600080fd5b505afa158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b505192915050565b60006128e783836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f7700815250612a22565b600354612d8e908263ffffffff61432f16565b60035573ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612dc7908263ffffffff61432f16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526004602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b601054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015612e9d57600080fd5b505afa158015612eb1573d6000803e3d6000fd5b505050506040513d6020811015612ec757600080fd5b5051600a8190556040805182815290519192507f8a0df8ef054fae2c3d2d19a7b322e864870cc9fd3cb07fb9526309c596244bf4919081900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054612f3e908263ffffffff612d3916565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260046020526040902055600354612f77908263ffffffff612d3916565b60035560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600854604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff86811660248301526044808301879052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009560609594169382918083835b602083106130d257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613095565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613134576040519150601f19603f3d011682016040523d82523d6000602084013e613139565b606091505b5091509150818015613167575080511580613167575080806020019051602081101561316457600080fd5b50515b6131d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496d7065726d61783a205452414e534645525f4641494c454400000000000000604482015290519081900360640190fd5b50505050565b81516131eb9060009060208501906145d9565b5080516131ff9060019060208401906145d9565b50604051469080605261470d82396040805191829003605201822086516020978801208383018352600184527f310000000000000000000000000000000000000000000000000000000000000093880193909352815180880191909152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c090910190925250805192019190912060065550565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061339257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613355565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133f4576040519150601f19603f3d011682016040523d82523d6000602084013e6133f9565b606091505b5091509150818015613427575080511580613427575080806020019051602081101561342457600080fd5b50515b61349257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f2173616665417070726f76650000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050565b4285101561350857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496d7065726d61783a2045585049524544000000000000000000000000000000604482015290519081900360640190fd5b60065473ffffffffffffffffffffffffffffffffffffffff808a1660008181526007602090815260408083208054600180820190925582518085018a905280840196909652958e166060860152608085018d905260a085019590955260c08085018c90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff8a166101828501526101a284018990526101c28401889052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa15801561364a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906136c557508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61373057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496d7065726d61783a20494e56414c49445f5349474e41545552450000000000604482015290519081900360640190fd5b50505050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061381257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016137d5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613874576040519150601f19603f3d011682016040523d82523d6000602084013e613879565b606091505b50915091508180156138a75750805115806138a757508080602001905160208110156138a457600080fd5b50515b61349257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f21736166655472616e7366657200000000000000000000000000000000000000604482015290519081900360640190fd5b600080805b601254811015613a1b576012818154811061392e57fe5b600091825260209091200154600b54610100900473ffffffffffffffffffffffffffffffffffffffff9081169116141561399b576012818154811061396f57fe5b600091825260208220015473ffffffffffffffffffffffffffffffffffffffff1693509150613dc89050565b601281815481106139a857fe5b600091825260209091200154600c5473ffffffffffffffffffffffffffffffffffffffff90811691161415613a1357601281815481106139e457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16925060019150613dc89050565b600101613917565b50600080600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a8757600080fd5b505afa158015613a9b573d6000803e3d6000fd5b505050506040513d6060811015613ab157600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050613ad9614653565b5060408051808201909152600b5473ffffffffffffffffffffffffffffffffffffffff61010090910481168252600c54166020820152613b17614653565b60405180604001604052808581526020018481525090506012600081548110613b3c57fe5b600091825260208083209190910154600f54604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9384169b5094995089948594939092169263c45a015592600480840193829003018186803b158015613bbd57600080fd5b505afa158015613bd1573d6000803e3d6000fd5b505050506040513d6020811015613be757600080fd5b5051905060005b601254811015613dc05760005b6002811015613db75760008373ffffffffffffffffffffffffffffffffffffffff16636801cc30888460028110613c2e57fe5b602002015160128681548110613c4057fe5b60009182526020918290200154604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff94851660048201529390911660248401526001604484015251606480840193829003018186803b158015613cc257600080fd5b505afa158015613cd6573d6000803e3d6000fd5b505050506040513d6020811015613cec57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff8116613d115750613daf565b6000613d6a878460028110613d2257fe5b6020020151610a26670de0b6b3a76400006113ee868d8960028110613d4357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff169063ffffffff6143a316565b905085811115613dac57809550829a5060128481548110613d8757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169b505b50505b600101613bfb565b50600101613bee565b505050505050505b9091565b613dd68382614455565b600f54604080517f13dcfc590000000000000000000000000000000000000000000000000000000081526004810184905260006024820181905273ffffffffffffffffffffffffffffffffffffffff87811660448401528681166064840152608483018290523060a48401524260c4840152925192909316926313dcfc599260e48084019382900301818387803b158015613e7057600080fd5b505af1158015613e84573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015613ecb57600080fd5b8101908080516040519392919084640100000000821115613eeb57600080fd5b908301906020820185811115613f0057600080fd5b8251866020820283011164010000000082111715613f1d57600080fd5b82525081516020918201928201910280838360005b83811015613f4a578181015183820152602001613f32565b5050505090500160405250505050505050565b613f678382614455565b600f54604080517f13dcfc590000000000000000000000000000000000000000000000000000000081526004810184905260006024820181905273ffffffffffffffffffffffffffffffffffffffff87811660448401528681166064840152600160848401523060a48401524260c4840152925192909316926313dcfc599260e48084019382900301818387803b158015613e7057600080fd5b600080808061402286610a268c670de0b6b3a764000063ffffffff61287416565b9050600061404286610a268c670de0b6b3a764000063ffffffff61287416565b9050600061406288610a268c670de0b6b3a764000063ffffffff61287416565b9050600061408288610a268c670de0b6b3a764000063ffffffff61287416565b90506000806140a3670de0b6b3a7640000610a26868063ffffffff61287416565b905060006140c3670de0b6b3a7640000610a26868063ffffffff61287416565b905061411e85610a266141116140f0866140e487600363ffffffff61287416565b9063ffffffff61432f16565b610a26670de0b6b3a76400006113ee886140e48b600363ffffffff61287416565b879063ffffffff61287416565b925061415391506141379050858563ffffffff61287416565b614147878563ffffffff61287416565b9063ffffffff612d3916565b965061417b846140e48481670de0b6b3a7640000610a26876113ee8d8c63ffffffff61432f16565b955050505050506141a5670de0b6b3a7640000610a26876113ee85876128ee90919063ffffffff16565b9998505050505050505050565b60006141be8584614455565b6141c88483614455565b600f54604080517f5a47ddc300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528781166024830152600160448301526064820187905260848201869052600060a4830181905260c483018190523060e4840152426101048401529251931692635a47ddc39261012480840193606093929083900390910190829087803b15801561427857600080fd5b505af115801561428c573d6000803e3d6000fd5b505050506040513d60608110156142a257600080fd5b506040015195945050505050565b60008183614319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612a90578181015183820152602001612a78565b50600083858161432557fe5b0495945050505050565b6000828201838110156128e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561442257600080fd5b505afa158015614436573d6000803e3d6000fd5b505050506040513d602081101561444c57600080fd5b50519392505050565b600f54604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff92831660248201529051839285169163dd62ed3e916044808301926020929190829003018186803b1580156144ce57600080fd5b505afa1580156144e2573d6000803e3d6000fd5b505050506040513d60208110156144f857600080fd5b50511061450457614551565b600f546145519073ffffffffffffffffffffffffffffffffffffffff84811691167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff6132bc16565b5050565b8280548282559060005260206000209081019282156145cd579160200282015b828111156145cd5781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff843516178255602090920191600190910190614575565b506129af929150614671565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061461a57805160ff1916838001178555614647565b82800160010185558215614647579182015b8281111561464757825182559160200191906001019061462c565b506129af9291506146ad565b60405180604001604052806002906020820280388339509192915050565b610fa091905b808211156129af5780547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600101614677565b610fa091905b808211156129af57600081556001016146b356fe5374616b65644c50546f6b656e3a20494e53554646494349454e545f52455345525645535374616b65644c50546f6b656e3a2052454445454d5f414d4f554e545f5a45524f454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b65644c50546f6b656e3a20464143544f52595f414c52454144595f534554a265627a7a723158208d0d3e6ccd109d8e4ec686db839207747ae4f28c51cb15f788871a8b59efbc6164736f6c63430005100032
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.