Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,376 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 16963879 | 582 days ago | IN | 0 ETH | 0.00051035 | ||||
Unstake | 15226453 | 831 days ago | IN | 0 ETH | 0.00295096 | ||||
Unstake | 15209514 | 834 days ago | IN | 0 ETH | 0.00064859 | ||||
Unstake | 15192192 | 836 days ago | IN | 0 ETH | 0.00118868 | ||||
Unstake | 15119125 | 848 days ago | IN | 0 ETH | 0.00163627 | ||||
Unstake | 15082530 | 853 days ago | IN | 0 ETH | 0.001234 | ||||
Unstake | 14825253 | 897 days ago | IN | 0 ETH | 0.00124886 | ||||
Unstake | 14634449 | 927 days ago | IN | 0 ETH | 0.00267578 | ||||
Unstake | 14547573 | 941 days ago | IN | 0 ETH | 0.00310723 | ||||
Unstake | 14493035 | 949 days ago | IN | 0 ETH | 0.00309382 | ||||
Unstake | 14467564 | 953 days ago | IN | 0 ETH | 0.00168672 | ||||
Unstake | 14426894 | 960 days ago | IN | 0 ETH | 0.0013158 | ||||
Unstake | 14406310 | 963 days ago | IN | 0 ETH | 0.00598908 | ||||
Unstake | 14388585 | 966 days ago | IN | 0 ETH | 0.00173964 | ||||
Unstake | 14384531 | 966 days ago | IN | 0 ETH | 0.00087272 | ||||
Unstake | 14336488 | 974 days ago | IN | 0 ETH | 0.00323006 | ||||
Unstake | 14301456 | 979 days ago | IN | 0 ETH | 0.00351329 | ||||
Unstake | 14091740 | 1012 days ago | IN | 0 ETH | 0.00600817 | ||||
Unstake | 13906820 | 1040 days ago | IN | 0 ETH | 0.00528678 | ||||
Swap | 13671302 | 1077 days ago | IN | 0 ETH | 0.01096998 | ||||
Unstake | 13659304 | 1079 days ago | IN | 0 ETH | 0.00817655 | ||||
Remove Liquidity... | 13655805 | 1080 days ago | IN | 0 ETH | 0.00965531 | ||||
Unstake | 13645153 | 1081 days ago | IN | 0 ETH | 0.00684703 | ||||
Unstake | 13596455 | 1089 days ago | IN | 0 ETH | 0.01622319 | ||||
Unstake | 13569192 | 1093 days ago | IN | 0 ETH | 0.00650879 |
Latest 8 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12613195 | 1242 days ago | Contract Creation | 0 ETH | |||
12324699 | 1287 days ago | Contract Creation | 0 ETH | |||
12247415 | 1299 days ago | Contract Creation | 0 ETH | |||
12247395 | 1299 days ago | Contract Creation | 0 ETH | |||
12247380 | 1299 days ago | Contract Creation | 0 ETH | |||
12030987 | 1332 days ago | Contract Creation | 0 ETH | |||
12030977 | 1332 days ago | Contract Creation | 0 ETH | |||
12030885 | 1332 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
FlashApp
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-08 */ // File contracts/interfaces/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity 0.7.4; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function burn(uint256 value) external returns (bool); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } // File contracts/interfaces/IFlashReceiver.sol pragma solidity 0.7.4; interface IFlashReceiver { function receiveFlash( bytes32 _id, uint256 _amountIn, uint256 _expireAfter, uint256 _mintedAmount, address _staker, bytes calldata _data ) external returns (uint256); } // File contracts/interfaces/IFlashProtocol.sol pragma solidity 0.7.4; interface IFlashProtocol { function stake( uint256 _amountIn, uint256 _days, address _receiver, bytes calldata _data ) external returns ( uint256 mintedAmount, uint256 matchedAmount, bytes32 id ); function unstake(bytes32 _id) external returns (uint256 withdrawAmount); function getFPY(uint256 _amountIn) external view returns (uint256); } // File contracts/libraries/SafeMath.sol pragma solidity 0.7.4; // A library for performing overflow-safe math, courtesy of DappHub: https://github.com/dapphub/ds-math/blob/d0ef6d6a5f/src/math.sol // Modified to include only the essentials library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "MATH:: ADD_OVERFLOW"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "MATH:: SUB_UNDERFLOW"); } 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, "MATH:: MUL_OVERFLOW"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "MATH:: DIVISION_BY_ZERO"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File contracts/libraries/Address.sol pragma solidity 0.7.4; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/libraries/Create2.sol pragma solidity 0.7.4; /** * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * `CREATE2` can be used to compute in advance the address where a smart * contract will be deployed, which allows for interesting new mechanisms known * as 'counterfactual interactions'. * * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more * information. */ library Create2 { /** * @dev Deploys a contract using `CREATE2`. The address where the contract * will be deployed can be known in advance via {computeAddress}. * * The bytecode for a contract can be obtained from Solidity with * `type(contractName).creationCode`. * * Requirements: * * - `bytecode` must not be empty. * - `salt` must have not been used for `bytecode` already. * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ function deploy( uint256 amount, bytes32 salt, bytes memory bytecode ) internal returns (address) { address addr; require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); // solhint-disable-next-line no-inline-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); return addr; } /** * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the * `bytecodeHash` or `salt` will result in a new destination address. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { return computeAddress(salt, bytecodeHash, address(this)); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ function computeAddress( bytes32 salt, bytes32 bytecodeHash, address deployer ) internal pure returns (address) { bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)); return address(uint256(_data)); } } // File contracts/libraries/SafeERC20.sol pragma solidity 0.7.4; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/pool/interfaces/IPool.sol pragma solidity 0.7.4; interface IPool { function initialize(address _token) external; function stakeWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) external returns (uint256 result); function addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _maker ) external returns ( uint256, uint256, uint256 ); function removeLiquidity(address _maker) external returns (uint256, uint256); function swapWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) external returns (uint256 result); } // File contracts/pool/contracts/PoolERC20.sol pragma solidity 0.7.4; // Lightweight token modelled after UNI-LP: // https://github.com/Uniswap/uniswap-v2-core/blob/v1.0.1/contracts/UniswapV2ERC20.sol // Adds: // - An exposed `mint()` with minting role // - An exposed `burn()` // - ERC-3009 (`transferWithAuthorization()`) // - flashMint() - allows to flashMint an arbitrary amount of FLASH, with the // condition that it is burned before the end of the transaction. contract PoolERC20 is IERC20 { using SafeMath for uint256; // bytes32 private constant EIP712DOMAIN_HASH = // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") bytes32 private constant EIP712DOMAIN_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; // bytes32 private constant NAME_HASH = keccak256("FLASH-ALT-LP Token") bytes32 private constant NAME_HASH = 0xfdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c; // bytes32 private constant VERSION_HASH = keccak256("2") bytes32 private constant VERSION_HASH = 0xad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a5; // bytes32 public constant PERMIT_TYPEHASH = // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)"); bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267; string public constant name = "FLASH-ALT-LP Token"; string public constant symbol = "FLASH-ALT-LP"; uint8 public constant decimals = 18; uint256 public override totalSupply; address public minter; mapping(address => uint256) public override balanceOf; mapping(address => mapping(address => uint256)) public override allowance; // ERC-2612, ERC-3009 state mapping(address => uint256) public nonces; mapping(address => mapping(bytes32 => bool)) public authorizationState; event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); function _validateSignedData( address signer, bytes32 encodeData, uint8 v, bytes32 r, bytes32 s ) internal view { bytes32 digest = keccak256(abi.encodePacked("\x19\x01", getDomainSeparator(), encodeData)); address recoveredAddress = ecrecover(digest, v, r, s); // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages require(recoveredAddress != address(0) && recoveredAddress == signer, "FLASH-ALT-LP Token:: INVALID_SIGNATURE"); } function _mint(address to, uint256 value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint256 value) internal { // Balance is implicitly checked with SafeMath's underflow protection balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve( address owner, address spender, uint256 value ) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer( address from, address to, uint256 value ) private { require(to != address(0), "FLASH-ALT-LP Token:: RECEIVER_IS_TOKEN_OR_ZERO"); // Balance is implicitly checked with SafeMath's underflow protection balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function getChainId() public pure returns (uint256 chainId) { // solhint-disable-next-line no-inline-assembly assembly { chainId := chainid() } } function getDomainSeparator() public view returns (bytes32) { return keccak256(abi.encode(EIP712DOMAIN_HASH, NAME_HASH, VERSION_HASH, getChainId(), address(this))); } function burn(uint256 value) external override returns (bool) { _burn(msg.sender, value); return true; } function approve(address spender, uint256 value) external override returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint256 value) external override returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom( address from, address to, uint256 value ) external override returns (bool) { uint256 fromAllowance = allowance[from][msg.sender]; if (fromAllowance != uint256(-1)) { // Allowance is implicitly checked with SafeMath's underflow protection allowance[from][msg.sender] = fromAllowance.sub(value); } _transfer(from, to, value); return true; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { require(deadline >= block.timestamp, "FLASH-ALT-LP Token:: AUTH_EXPIRED"); bytes32 encodeData = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner], deadline)); nonces[owner] = nonces[owner].add(1); _validateSignedData(owner, encodeData, v, r, s); _approve(owner, spender, value); } function transferWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) external { require(block.timestamp > validAfter, "FLASH-ALT-LP Token:: AUTH_NOT_YET_VALID"); require(block.timestamp < validBefore, "FLASH-ALT-LP Token:: AUTH_EXPIRED"); require(!authorizationState[from][nonce], "FLASH-ALT-LP Token:: AUTH_ALREADY_USED"); bytes32 encodeData = keccak256( abi.encode(TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce) ); _validateSignedData(from, encodeData, v, r, s); authorizationState[from][nonce] = true; emit AuthorizationUsed(from, nonce); _transfer(from, to, value); } } // File contracts/pool/contracts/Pool.sol pragma solidity 0.7.4; contract Pool is PoolERC20, IPool { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public constant MINIMUM_LIQUIDITY = 10**3; address public constant FLASH_TOKEN = 0x20398aD62bb2D930646d45a6D4292baa0b860C1f; address public constant FLASH_PROTOCOL = 0x15EB0c763581329C921C8398556EcFf85Cc48275; uint256 public reserveFlashAmount; uint256 public reserveAltAmount; uint256 private unlocked = 1; address public token; address public factory; modifier lock() { require(unlocked == 1, "Pool: LOCKED"); unlocked = 0; _; unlocked = 1; } modifier onlyFactory() { require(msg.sender == factory, "Pool:: ONLY_FACTORY"); _; } constructor() { factory = msg.sender; } function initialize(address _token) public override onlyFactory { token = _token; } function swapWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) public override lock onlyFactory returns (uint256 result) { result = getAPYSwap(_amountIn); require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER"); calcNewReserveSwap(_amountIn, result); IERC20(FLASH_TOKEN).safeTransfer(_staker, result); } function stakeWithFeeRewardDistribution( uint256 _amountIn, address _staker, uint256 _expectedOutput ) public override lock onlyFactory returns (uint256 result) { result = getAPYStake(_amountIn); require(_expectedOutput <= result, "Pool:: EXPECTED_IS_GREATER"); calcNewReserveStake(_amountIn, result); IERC20(token).safeTransfer(_staker, result); } function addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _maker ) public override onlyFactory returns ( uint256 amountFLASH, uint256 amountALT, uint256 liquidity ) { (amountFLASH, amountALT) = _addLiquidity(_amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin); liquidity = mintLiquidityTokens(_maker, amountFLASH, amountALT); calcNewReserveAddLiquidity(amountFLASH, amountALT); } function removeLiquidity(address _maker) public override onlyFactory returns (uint256 amountFLASH, uint256 amountALT) { (amountFLASH, amountALT) = burn(_maker); } function getAPYStake(uint256 _amountIn) public view returns (uint256 result) { uint256 amountInWithFee = _amountIn.mul(getLPFee()); uint256 num = amountInWithFee.mul(reserveAltAmount); uint256 den = (reserveFlashAmount.mul(1000)).add(amountInWithFee); result = num.div(den); } function getAPYSwap(uint256 _amountIn) public view returns (uint256 result) { uint256 amountInWithFee = _amountIn.mul(getLPFee()); uint256 num = amountInWithFee.mul(reserveFlashAmount); uint256 den = (reserveAltAmount.mul(1000)).add(amountInWithFee); result = num.div(den); } function getLPFee() public view returns (uint256) { uint256 fpy = IFlashProtocol(FLASH_PROTOCOL).getFPY(0); return uint256(1000).sub(fpy.div(5e15)); } function quote( uint256 _amountA, uint256 _reserveA, uint256 _reserveB ) public pure returns (uint256 amountB) { require(_amountA > 0, "Pool:: INSUFFICIENT_AMOUNT"); require(_reserveA > 0 && _reserveB > 0, "Pool:: INSUFFICIENT_LIQUIDITY"); amountB = _amountA.mul(_reserveB).div(_reserveA); } function burn(address to) private lock returns (uint256 amountFLASH, uint256 amountALT) { uint256 balanceFLASH = IERC20(FLASH_TOKEN).balanceOf(address(this)); uint256 balanceALT = IERC20(token).balanceOf(address(this)); uint256 liquidity = balanceOf[address(this)]; amountFLASH = liquidity.mul(balanceFLASH) / totalSupply; amountALT = liquidity.mul(balanceALT) / totalSupply; require(amountFLASH > 0 && amountALT > 0, "Pool:: INSUFFICIENT_LIQUIDITY_BURNED"); _burn(address(this), liquidity); IERC20(FLASH_TOKEN).safeTransfer(to, amountFLASH); IERC20(token).safeTransfer(to, amountALT); balanceFLASH = balanceFLASH.sub(IERC20(FLASH_TOKEN).balanceOf(address(this))); balanceALT = balanceALT.sub(IERC20(token).balanceOf(address(this))); calcNewReserveRemoveLiquidity(balanceFLASH, balanceALT); } function _addLiquidity( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin ) private view returns (uint256 amountFLASH, uint256 amountALT) { if (reserveAltAmount == 0 && reserveFlashAmount == 0) { (amountFLASH, amountALT) = (_amountFLASH, _amountALT); } else { uint256 amountALTQuote = quote(_amountFLASH, reserveFlashAmount, reserveAltAmount); if (amountALTQuote <= _amountALT) { require(amountALTQuote >= _amountALTMin, "Pool:: INSUFFICIENT_B_AMOUNT"); (amountFLASH, amountALT) = (_amountFLASH, amountALTQuote); } else { uint256 amountFLASHQuote = quote(_amountALT, reserveAltAmount, reserveFlashAmount); require( (amountFLASHQuote <= _amountFLASH) && (amountFLASHQuote >= _amountFLASHMin), "Pool:: INSUFFICIENT_A_AMOUNT" ); (amountFLASH, amountALT) = (amountFLASHQuote, _amountALT); } } } function mintLiquidityTokens( address _to, uint256 _flashAmount, uint256 _altAmount ) private returns (uint256 liquidity) { if (totalSupply == 0) { liquidity = SafeMath.sqrt(_flashAmount.mul(_altAmount)).sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); } else { liquidity = SafeMath.min( _flashAmount.mul(totalSupply) / reserveFlashAmount, _altAmount.mul(totalSupply) / reserveAltAmount ); } require(liquidity > 0, "Pool:: INSUFFICIENT_LIQUIDITY_MINTED"); _mint(_to, liquidity); } function calcNewReserveStake(uint256 _amountIn, uint256 _amountOut) private { reserveFlashAmount = reserveFlashAmount.add(_amountIn); reserveAltAmount = reserveAltAmount.sub(_amountOut); } function calcNewReserveSwap(uint256 _amountIn, uint256 _amountOut) private { reserveFlashAmount = reserveFlashAmount.sub(_amountOut); reserveAltAmount = reserveAltAmount.add(_amountIn); } function calcNewReserveAddLiquidity(uint256 _amountFLASH, uint256 _amountALT) private { reserveFlashAmount = reserveFlashAmount.add(_amountFLASH); reserveAltAmount = reserveAltAmount.add(_amountALT); } function calcNewReserveRemoveLiquidity(uint256 _amountFLASH, uint256 _amountALT) private { reserveFlashAmount = reserveFlashAmount.sub(_amountFLASH); reserveAltAmount = reserveAltAmount.sub(_amountALT); } } // File contracts/FlashApp.sol pragma solidity 0.7.4; contract FlashApp is IFlashReceiver { using SafeMath for uint256; using SafeERC20 for IERC20; address public constant FLASH_TOKEN = 0x20398aD62bb2D930646d45a6D4292baa0b860C1f; address public constant FLASH_PROTOCOL = 0x15EB0c763581329C921C8398556EcFf85Cc48275; mapping(bytes32 => uint256) public stakerReward; mapping(address => address) public pools; // token -> pools event PoolCreated(address _pool, address _token); event Staked(bytes32 _id, uint256 _rewardAmount, address _pool); event LiquidityAdded(address _pool, uint256 _amountFLASH, uint256 _amountALT, uint256 _liquidity, address _sender); event LiquidityRemoved( address _pool, uint256 _amountFLASH, uint256 _amountALT, uint256 _liquidity, address _sender ); event Swapped(address _sender, uint256 _swapAmount, uint256 _flashReceived, address _pool); modifier onlyProtocol() { require(msg.sender == FLASH_PROTOCOL, "FlashApp:: ONLY_PROTOCOL"); _; } function createPool(address _token) external returns (address poolAddress) { require(_token != address(0), "FlashApp:: INVALID_TOKEN_ADDRESS"); require(pools[_token] == address(0), "FlashApp:: POOL_ALREADY_EXISTS"); bytes memory bytecode = type(Pool).creationCode; bytes32 salt = keccak256(abi.encodePacked(block.timestamp, msg.sender)); poolAddress = Create2.deploy(0, salt, bytecode); pools[_token] = poolAddress; IPool(poolAddress).initialize(_token); emit PoolCreated(poolAddress, _token); } function receiveFlash( bytes32 _id, uint256 _amountIn, //unused uint256 _expireAfter, //unused uint256 _mintedAmount, address _staker, bytes calldata _data ) external override onlyProtocol returns (uint256) { (address token, uint256 expectedOutput) = abi.decode(_data, (address, uint256)); address pool = pools[token]; IERC20(FLASH_TOKEN).safeTransfer(pool, _mintedAmount); uint256 reward = IPool(pool).stakeWithFeeRewardDistribution(_mintedAmount, _staker, expectedOutput); stakerReward[_id] = reward; emit Staked(_id, reward, pool); } function unstake(bytes32[] memory _expiredIds) public { for (uint256 i = 0; i < _expiredIds.length; i = i.add(1)) { IFlashProtocol(FLASH_PROTOCOL).unstake(_expiredIds[i]); } } function swap( uint256 _altQuantity, address _token, uint256 _expectedOutput ) public returns (uint256 result) { address user = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); require(_altQuantity > 0, "FlashApp:: INVALID_AMOUNT"); IERC20(_token).safeTransferFrom(user, address(this), _altQuantity); IERC20(_token).safeTransfer(pool, _altQuantity); result = IPool(pool).swapWithFeeRewardDistribution(_altQuantity, user, _expectedOutput); emit Swapped(user, _altQuantity, result, pool); } function addLiquidityInPool( uint256 _amountFLASH, uint256 _amountALT, uint256 _amountFLASHMin, uint256 _amountALTMin, address _token ) public { address maker = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); require(_amountFLASH > 0 && _amountALT > 0, "FlashApp:: INVALID_AMOUNT"); (uint256 amountFLASH, uint256 amountALT, uint256 liquidity) = IPool(pool).addLiquidity( _amountFLASH, _amountALT, _amountFLASHMin, _amountALTMin, maker ); IERC20(FLASH_TOKEN).safeTransferFrom(maker, address(this), amountFLASH); IERC20(FLASH_TOKEN).safeTransfer(pool, amountFLASH); IERC20(_token).safeTransferFrom(maker, address(this), amountALT); IERC20(_token).safeTransfer(pool, amountALT); emit LiquidityAdded(pool, amountFLASH, amountALT, liquidity, maker); } function removeLiquidityInPool(uint256 _liquidity, address _token) public { address maker = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); IERC20(pool).safeTransferFrom(maker, address(this), _liquidity); IERC20(pool).safeTransfer(pool, _liquidity); (uint256 amountFLASH, uint256 amountALT) = IPool(pool).removeLiquidity(maker); emit LiquidityRemoved(pool, amountFLASH, amountALT, _liquidity, maker); } function removeLiquidityInPoolWithPermit( uint256 _liquidity, address _token, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) public { address maker = msg.sender; address pool = pools[_token]; require(pool != address(0), "FlashApp:: POOL_DOESNT_EXIST"); IERC20(pool).permit(maker, pool, type(uint256).max, _deadline, _v, _r, _s); IERC20(pool).safeTransferFrom(maker, pool, _liquidity); (uint256 amountFLASH, uint256 amountALT) = IPool(pool).removeLiquidity(maker); emit LiquidityRemoved(pool, amountFLASH, amountALT, _liquidity, maker); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amountALT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_liquidity","type":"uint256"},{"indexed":false,"internalType":"address","name":"_sender","type":"address"}],"name":"LiquidityRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_rewardAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_swapAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_flashReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"FLASH_PROTOCOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountFLASH","type":"uint256"},{"internalType":"uint256","name":"_amountALT","type":"uint256"},{"internalType":"uint256","name":"_amountFLASHMin","type":"uint256"},{"internalType":"uint256","name":"_amountALTMin","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"addLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"createPool","outputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_expireAfter","type":"uint256"},{"internalType":"uint256","name":"_mintedAmount","type":"uint256"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"receiveFlash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"removeLiquidityInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"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":"removeLiquidityInPoolWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"stakerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_altQuantity","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_expectedOutput","type":"uint256"}],"name":"swap","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_expiredIds","type":"bytes32[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613700806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80639049f9d2116100715780639049f9d214610223578063a4063dbc14610249578063a7f0e9031461026f578063b12c10f714610277578063d959d8bc1461031a578063eb1ce22114610358576100a9565b80631d994a53146100ae57806323c6e14c146100dc5780632cbff4461461010057806343264349146101aa5780635a284656146101dc575b600080fd5b6100da600480360360408110156100c457600080fd5b50803590602001356001600160a01b0316610375565b005b6100e46104e3565b604080516001600160a01b039092168252519081900360200190f35b610198600480360360c081101561011657600080fd5b8135916020810135916040820135916060810135916001600160a01b03608083013516919081019060c0810160a082013564010000000081111561015957600080fd5b82018360208201111561016b57600080fd5b8035906020019184600183028401116401000000008311171561018d57600080fd5b5090925090506104fb565b60408051918252519081900360200190f35b610198600480360360608110156101c057600080fd5b508035906001600160a01b0360208201351690604001356106b8565b6100da600480360360c08110156101f257600080fd5b508035906001600160a01b036020820135169060408101359060ff6060820135169060808101359060a0013561087a565b6100e46004803603602081101561023957600080fd5b50356001600160a01b0316610a67565b6100e46004803603602081101561025f57600080fd5b50356001600160a01b0316610c60565b6100e4610c7b565b6100da6004803603602081101561028d57600080fd5b8101906020810181356401000000008111156102a857600080fd5b8201836020820111156102ba57600080fd5b803590602001918460208302840111640100000000831117156102dc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c93945050505050565b6100da600480360360a081101561033057600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610d4f565b6101986004803603602081101561036e57600080fd5b5035610f89565b6001600160a01b03808216600090815260016020526040902054339116806103d2576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b6103e76001600160a01b038216833087610f9b565b6103fb6001600160a01b0382168286610ffb565b600080826001600160a01b031663d798f86e856040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d604081101561047657600080fd5b508051602091820151604080516001600160a01b038089168252948101849052808201839052606081018b905293881660808501525191945092507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e9181900360a00190a1505050505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b6000337315eb0c763581329c921c8398556ecff85cc4827514610565576040805162461bcd60e51b815260206004820152601860248201527f466c6173684170703a3a204f4e4c595f50524f544f434f4c0000000000000000604482015290519081900360640190fd5b6000808484604081101561057857600080fd5b506001600160a01b0381358116600081815260016020908152604090912054919550909201359250166105c07320398ad62bb2d930646d45a6d4292baa0b860c1f828a610ffb565b6000816001600160a01b031663687fbed88a8a866040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561062157600080fd5b505af1158015610635573d6000803e3d6000fd5b505050506040513d602081101561064b57600080fd5b505160008d8152602081815260409182902083905581518f81529081018390526001600160a01b0385168183015290519192507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc52919081900360600190a150505050979650505050505050565b6001600160a01b03808316600090815260016020526040812054909133911680610717576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b60008611610768576040805162461bcd60e51b8152602060048201526019602482015278119b185cda105c1c0e8e881253959053125117d05353d55395603a1b604482015290519081900360640190fd5b61077d6001600160a01b038616833089610f9b565b6107916001600160a01b0386168288610ffb565b806001600160a01b03166350b814a08784876040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156107f057600080fd5b505af1158015610804573d6000803e3d6000fd5b505050506040513d602081101561081a57600080fd5b5051604080516001600160a01b038086168252602082018a90528183018490528416606082015290519194507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc0919081900360800190a150509392505050565b6001600160a01b03808616600090815260016020526040902054339116806108d7576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b6040805163d505accf60e01b81526001600160a01b03848116600483015283166024820181905260001960448301526064820189905260ff8816608483015260a4820187905260c48201869052915163d505accf9160e48082019260009290919082900301818387803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b5061097b925050506001600160a01b03821683838b610f9b565b600080826001600160a01b031663d798f86e856040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b505050506040513d60408110156109f657600080fd5b508051602091820151604080516001600160a01b038089168252948101849052808201839052606081018f905293881660808501525191945092507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e9181900360a00190a150505050505050505050565b60006001600160a01b038216610ac4576040805162461bcd60e51b815260206004820181905260248201527f466c6173684170703a3a20494e56414c49445f544f4b454e5f41444452455353604482015290519081900360640190fd5b6001600160a01b038281166000908152600160205260409020541615610b31576040805162461bcd60e51b815260206004820152601e60248201527f466c6173684170703a3a20504f4f4c5f414c52454144595f4558495354530000604482015290519081900360640190fd5b606060405180602001610b4390611442565b601f1982820381018352601f909101166040818152426020838101919091523360601b828401528151603481850301815260549093019091528151910120909150610b9060008284611052565b6001600160a01b0385811660008181526001602052604080822080546001600160a01b0319169486169485179055805163189acdbd60e31b8152600481019390935251939650919263c4d66de89260248084019391929182900301818387803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528816602082015281517f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48969450908190039091019150a15050919050565b6001602052600090815260409020546001600160a01b031681565b7315eb0c763581329c921c8398556ecff85cc4827581565b60005b8151811015610d4b577315eb0c763581329c921c8398556ecff85cc482756001600160a01b03166371ed5d1a838381518110610cce57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d0c57600080fd5b505af1158015610d20573d6000803e3d6000fd5b505050506040513d6020811015610d3657600080fd5b50610d44905081600161116d565b9050610c96565b5050565b6001600160a01b0380821660009081526001602052604090205433911680610dac576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b600087118015610dbc5750600086115b610e09576040805162461bcd60e51b8152602060048201526019602482015278119b185cda105c1c0e8e881253959053125117d05353d55395603a1b604482015290519081900360640190fd5b6000806000836001600160a01b031663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b815260040180868152602001858152602001848152602001838152602001826001600160a01b0316815260200195505050505050606060405180830381600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b505050506040513d6060811015610ea757600080fd5b50805160208201516040909201519094509092509050610edd7320398ad62bb2d930646d45a6d4292baa0b860c1f863086610f9b565b610efc7320398ad62bb2d930646d45a6d4292baa0b860c1f8585610ffb565b610f116001600160a01b038716863085610f9b565b610f256001600160a01b0387168584610ffb565b604080516001600160a01b03808716825260208201869052818301859052606082018490528716608082015290517f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d419181900360a00190a150505050505050505050565b60006020819052908152604090205481565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ff59085906111c1565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261104d9084906111c1565b505050565b600080844710156110aa576040805162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b82516110fd576040805162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015290519081900360640190fd5b8383516020850187f590506001600160a01b038116611163576040805162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015290519081900360640190fd5b90505b9392505050565b808201828110156111bb576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b92915050565b6060611216826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112729092919063ffffffff16565b80519091501561104d5780806020019051602081101561123557600080fd5b505161104d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806136a1602a913960400191505060405180910390fd5b606061116384846000858561128685611398565b6112d7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106113165780518252601f1990920191602091820191016112f7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611378576040519150601f19603f3d011682016040523d82523d6000602084013e61137d565b606091505b509150915061138d82828661139e565b979650505050505050565b3b151590565b606083156113ad575081611166565b8251156113bd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156114075781810151838201526020016113ef565b50505050905090810190601f1680156114345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b612231806114508339019056fe6080604052600160085534801561001557600080fd5b50600a80546001600160a01b031916331790556121fa806100376000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab0772146105ff578063e3ee160e1461065b578063e94a0102146106ba578063ed24911d146106e6578063fc0c546a146106ee57610211565b8063c4d66de814610519578063d505accf14610541578063d798f86e14610592578063dd62ed3e146105d157610211565b8063a9059cbb116100f4578063a9059cbb146104ac578063ad615dec146104d8578063ba9a7a5614610501578063c0bd9f1614610509578063c45a01551461051157610211565b806395d89b4114610477578063a0cc6a681461047f578063a10adb1714610487578063a7f0e903146104a457610211565b80633408e470116101a85780634d861ece116101775780634d861ece146103bf57806350b814a0146103c7578063687fbed8146103f957806370a082311461042b5780637ecebe001461045157610211565b80633408e470146103755780633750a8bd1461037d578063411542701461038557806342966c68146103a257610211565b806323b872dd116101e457806323b872dd1461031157806323c6e14c1461034757806330adf81f1461034f578063313ce5671461035757610211565b806306fdde03146102165780630754617214610293578063095ea7b3146102b757806318160ddd146102f7575b600080fd5b61021e6106f6565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029b610724565b604080516001600160a01b039092168252519081900360200190f35b6102e3600480360360408110156102cd57600080fd5b506001600160a01b038135169060200135610733565b604080519115158252519081900360200190f35b6102ff61074a565b60408051918252519081900360200190f35b6102e36004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610750565b61029b6107c4565b6102ff6107dc565b61035f610800565b6040805160ff9092168252519081900360200190f35b6102ff610805565b6102ff610809565b6102ff6004803603602081101561039b57600080fd5b50356108b6565b6102e3600480360360208110156103b857600080fd5b503561091e565b6102ff610933565b6102ff600480360360608110156103dd57600080fd5b508035906001600160a01b036020820135169060400135610939565b6102ff6004803603606081101561040f57600080fd5b508035906001600160a01b036020820135169060400135610a70565b6102ff6004803603602081101561044157600080fd5b50356001600160a01b0316610b93565b6102ff6004803603602081101561046757600080fd5b50356001600160a01b0316610ba5565b61021e610bb7565b6102ff610bdf565b6102ff6004803603602081101561049d57600080fd5b5035610c03565b61029b610c49565b6102e3600480360360408110156104c257600080fd5b506001600160a01b038135169060200135610c61565b6102ff600480360360608110156104ee57600080fd5b5080359060208101359060400135610c6e565b6102ff610d41565b6102ff610d47565b61029b610d4d565b61053f6004803603602081101561052f57600080fd5b50356001600160a01b0316610d5c565b005b61053f600480360360e081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610dd3565b6105b8600480360360208110156105a857600080fd5b50356001600160a01b0316610ee2565b6040805192835260208301919091528051918290030190f35b6102ff600480360360408110156105e757600080fd5b506001600160a01b0381358116916020013516610f4f565b61063d600480360360a081101561061557600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610f6c565b60408051938452602084019290925282820152519081900360600190f35b61053f600480360361012081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ffb565b6102e3600480360360408110156106d057600080fd5b506001600160a01b0381351690602001356111cd565b6102ff6111ed565b61029b6112ab565b60405180604001604052806012815260200171232620a9a416a0a62a16a628102a37b5b2b760711b81525081565b6001546001600160a01b031681565b60006107403384846112ba565b5060015b92915050565b60005481565b6001600160a01b038316600090815260036020908152604080832033845290915281205460001981146107ac57610787818461131c565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b6107b785858561136b565b60019150505b9392505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b4690565b6000807315eb0c763581329c921c8398556ecff85cc482756001600160a01b031663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b505190506108b06108a7826611c37937e0800061145e565b6103e89061131c565b91505090565b6000806108cb6108c4610809565b84906114c8565b905060006108e4600754836114c890919063ffffffff16565b90506000610909836109036103e86006546114c890919063ffffffff16565b9061152d565b9050610915828261145e565b95945050505050565b600061092a338361157b565b5060015b919050565b60065481565b6000600854600114610981576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b031633146109db576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b6109e484610c03565b905080821115610a3b576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610a45848261160d565b610a647320398ad62bb2d930646d45a6d4292baa0b860c1f8483611631565b60016008559392505050565b6000600854600114610ab8576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b03163314610b12576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610b1b846108b6565b905080821115610b72576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610b7c8482611688565b600954610a64906001600160a01b03168483611631565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600c81526020016b0464c4153482d414c542d4c560a41b81525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b600080610c116108c4610809565b90506000610c2a600654836114c890919063ffffffff16565b90506000610909836109036103e86007546114c890919063ffffffff16565b7315eb0c763581329c921c8398556ecff85cc4827581565b600061074033848461136b565b6000808411610cc4576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a20494e53554646494349454e545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015610cd45750600082115b610d25576040805162461bcd60e51b815260206004820152601d60248201527f506f6f6c3a3a20494e53554646494349454e545f4c4951554944495459000000604482015290519081900360640190fd5b610d3983610d3386856114c8565b9061145e565b949350505050565b6103e881565b60075481565b600a546001600160a01b031681565b600a546001600160a01b03163314610db1576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b42841015610e125760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b0380881660008181526004602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968d166060880152608087018c905260a0870181905260c08088018c90528251808903909101815260e090970190915285519582019590952093909252905290610ea790600161152d565b6001600160a01b038916600090815260046020526040902055610ecd88828686866116a5565b610ed88888886112ba565b5050505050505050565b600a5460009081906001600160a01b03163314610f3c576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610f45836117c2565b9094909350915050565b600360209081526000928352604080842090915290825290205481565b600a54600090819081906001600160a01b03163314610fc8576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610fd488888888611b03565b9093509150610fe4848484611c26565b9050610ff08383611cf4565b955095509592505050565b8542116110395760405162461bcd60e51b815260040180806020018281038252602781526020018061212c6027913960400191505060405180910390fd5b8442106110775760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b038916600090815260056020908152604080832087845290915290205460ff16156110da5760405162461bcd60e51b81526004018080602001828103825260268152602001806120916026913960400191505060405180910390fd5b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22676020808301919091526001600160a01b03808d16838501528b166060830152608082018a905260a0820189905260c0820188905260e08083018890528351808403909101815261010090920190925280519101206111608a828686866116a5565b6001600160a01b038a166000818152600560209081526040808320898452909152808220805460ff19166001179055518792917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36111c18a8a8a61136b565b50505050505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c7fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a561125a610805565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b6009546001600160a01b031681565b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610744576040805162461bcd60e51b81526020600482015260146024820152734d4154483a3a205355425f554e444552464c4f5760601b604482015290519081900360640190fd5b6001600160a01b0382166113b05760405162461bcd60e51b815260040180806020018281038252602e8152602001806120b7602e913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546113d3908261131c565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611402908261152d565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008082116114b4576040805162461bcd60e51b815260206004820152601760248201527f4d4154483a3a204449564953494f4e5f42595f5a45524f000000000000000000604482015290519081900360640190fd5b60008284816114bf57fe5b04949350505050565b6000826114d757506000610744565b828202828482816114e457fe5b04146107bd576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204d554c5f4f564552464c4f5760681b604482015290519081900360640190fd5b80820182811015610744576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090205461159e908261131c565b6001600160a01b038316600090815260026020526040812091909155546115c5908261131c565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b60065461161a908261131c565b60065560075461162a908361152d565b6007555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611683908490611d11565b505050565b600654611695908361152d565b60065560075461162a908261131c565b60006116af6111ed565b85604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611748573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061177e5750866001600160a01b0316816001600160a01b0316145b6117b95760405162461bcd60e51b81526004018080602001828103825260268152602001806121066026913960400191505060405180910390fd5b50505050505050565b60008060085460011461180b576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b60006008819055604080516370a0823160e01b815230600482015290517320398ad62bb2d930646d45a6d4292baa0b860c1f916370a08231916024808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b5051600954604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50513060009081526002602052604081205490549192509061192c82856114c8565b8161193357fe5b600054919004955061194582846114c8565b8161194c57fe5b04935060008511801561195f5750600084115b61199a5760405162461bcd60e51b81526004018080602001828103825260248152602001806121536024913960400191505060405180910390fd5b6119a4308261157b565b6119c37320398ad62bb2d930646d45a6d4292baa0b860c1f8787611631565b6009546119da906001600160a01b03168786611631565b604080516370a0823160e01b81523060048201529051611a63917320398ad62bb2d930646d45a6d4292baa0b860c1f916370a0823191602480820192602092909190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051849061131c565b600954604080516370a0823160e01b81523060048201529051929550611ae8926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d6020811015611adf57600080fd5b5051839061131c565b9150611af48383611dc2565b50506001600855509092909150565b6000806007546000148015611b185750600654155b15611b27575084905083611c1d565b6000611b3887600654600754610c6e565b9050858111611ba15783811015611b96576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e5400000000604482015290519081900360640190fd5b869250905080611c1b565b6000611bb287600754600654610c6e565b9050878111158015611bc45750858110155b611c15576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e5400000000604482015290519081900360640190fd5b92508591505b505b94509492505050565b60008054611c6057611c4c6103e8611c46611c4186866114c8565b611dcf565b9061131c565b9050611c5b60006103e8611e20565b611cab565b611ca8600654611c7b600054866114c890919063ffffffff16565b81611c8257fe5b04600754611c9b600054866114c890919063ffffffff16565b81611ca257fe5b04611eaa565b90505b60008111611cea5760405162461bcd60e51b81526004018080602001828103825260248152602001806121776024913960400191505060405180910390fd5b6107bd8482611e20565b600654611d01908361152d565b60065560075461162a908261152d565b6060611d66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ec09092919063ffffffff16565b80519091501561168357808060200190516020811015611d8557600080fd5b50516116835760405162461bcd60e51b815260040180806020018281038252602a81526020018061219b602a913960400191505060405180910390fd5b600654611695908361131c565b60006003821115611e12575080600160028204015b81811015611e0c57809150600281828581611dfb57fe5b040181611e0457fe5b049050611de4565b5061092e565b811561092e57506001919050565b600054611e2d908261152d565b60009081556001600160a01b038316815260026020526040902054611e52908261152d565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310611eb957816107bd565b5090919050565b6060610d39848460008585611ed485611fe6565b611f25576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611f645780518252601f199092019160209182019101611f45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdb828286611fec565b979650505050505050565b3b151590565b60608315611ffb5750816107bd565b82511561200b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205557818101518382015260200161203d565b50505050905090810190601f1680156120825780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e5445445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209683472579f7daa8f010c335cb11c4719f0438a7518f90532d9eeb74d4a6858464736f6c63430007040033466c6173684170703a3a20504f4f4c5f444f45534e545f4558495354000000005361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205dffa766be744d3a011ee3800e932c9bec0273bb71723bbc5ea28f9cb42f4c5964736f6c63430007040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80639049f9d2116100715780639049f9d214610223578063a4063dbc14610249578063a7f0e9031461026f578063b12c10f714610277578063d959d8bc1461031a578063eb1ce22114610358576100a9565b80631d994a53146100ae57806323c6e14c146100dc5780632cbff4461461010057806343264349146101aa5780635a284656146101dc575b600080fd5b6100da600480360360408110156100c457600080fd5b50803590602001356001600160a01b0316610375565b005b6100e46104e3565b604080516001600160a01b039092168252519081900360200190f35b610198600480360360c081101561011657600080fd5b8135916020810135916040820135916060810135916001600160a01b03608083013516919081019060c0810160a082013564010000000081111561015957600080fd5b82018360208201111561016b57600080fd5b8035906020019184600183028401116401000000008311171561018d57600080fd5b5090925090506104fb565b60408051918252519081900360200190f35b610198600480360360608110156101c057600080fd5b508035906001600160a01b0360208201351690604001356106b8565b6100da600480360360c08110156101f257600080fd5b508035906001600160a01b036020820135169060408101359060ff6060820135169060808101359060a0013561087a565b6100e46004803603602081101561023957600080fd5b50356001600160a01b0316610a67565b6100e46004803603602081101561025f57600080fd5b50356001600160a01b0316610c60565b6100e4610c7b565b6100da6004803603602081101561028d57600080fd5b8101906020810181356401000000008111156102a857600080fd5b8201836020820111156102ba57600080fd5b803590602001918460208302840111640100000000831117156102dc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c93945050505050565b6100da600480360360a081101561033057600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610d4f565b6101986004803603602081101561036e57600080fd5b5035610f89565b6001600160a01b03808216600090815260016020526040902054339116806103d2576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b6103e76001600160a01b038216833087610f9b565b6103fb6001600160a01b0382168286610ffb565b600080826001600160a01b031663d798f86e856040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d604081101561047657600080fd5b508051602091820151604080516001600160a01b038089168252948101849052808201839052606081018b905293881660808501525191945092507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e9181900360a00190a1505050505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b6000337315eb0c763581329c921c8398556ecff85cc4827514610565576040805162461bcd60e51b815260206004820152601860248201527f466c6173684170703a3a204f4e4c595f50524f544f434f4c0000000000000000604482015290519081900360640190fd5b6000808484604081101561057857600080fd5b506001600160a01b0381358116600081815260016020908152604090912054919550909201359250166105c07320398ad62bb2d930646d45a6d4292baa0b860c1f828a610ffb565b6000816001600160a01b031663687fbed88a8a866040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561062157600080fd5b505af1158015610635573d6000803e3d6000fd5b505050506040513d602081101561064b57600080fd5b505160008d8152602081815260409182902083905581518f81529081018390526001600160a01b0385168183015290519192507f23581b9afdc2170a53868d0b64508f096844aa55c3ad98caf14032a91c41cc52919081900360600190a150505050979650505050505050565b6001600160a01b03808316600090815260016020526040812054909133911680610717576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b60008611610768576040805162461bcd60e51b8152602060048201526019602482015278119b185cda105c1c0e8e881253959053125117d05353d55395603a1b604482015290519081900360640190fd5b61077d6001600160a01b038616833089610f9b565b6107916001600160a01b0386168288610ffb565b806001600160a01b03166350b814a08784876040518463ffffffff1660e01b815260040180848152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156107f057600080fd5b505af1158015610804573d6000803e3d6000fd5b505050506040513d602081101561081a57600080fd5b5051604080516001600160a01b038086168252602082018a90528183018490528416606082015290519194507f50994f8bcf54474cf3e35793e3537d1f44ec39d92f19a3d7a01b36723b886fc0919081900360800190a150509392505050565b6001600160a01b03808616600090815260016020526040902054339116806108d7576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b6040805163d505accf60e01b81526001600160a01b03848116600483015283166024820181905260001960448301526064820189905260ff8816608483015260a4820187905260c48201869052915163d505accf9160e48082019260009290919082900301818387803b15801561094d57600080fd5b505af1158015610961573d6000803e3d6000fd5b5061097b925050506001600160a01b03821683838b610f9b565b600080826001600160a01b031663d798f86e856040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506040805180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b505050506040513d60408110156109f657600080fd5b508051602091820151604080516001600160a01b038089168252948101849052808201839052606081018f905293881660808501525191945092507f941e65c2e86e52e4d4bf73adc9a87775f81da9fa2aff39eda7322e562b08fd6e9181900360a00190a150505050505050505050565b60006001600160a01b038216610ac4576040805162461bcd60e51b815260206004820181905260248201527f466c6173684170703a3a20494e56414c49445f544f4b454e5f41444452455353604482015290519081900360640190fd5b6001600160a01b038281166000908152600160205260409020541615610b31576040805162461bcd60e51b815260206004820152601e60248201527f466c6173684170703a3a20504f4f4c5f414c52454144595f4558495354530000604482015290519081900360640190fd5b606060405180602001610b4390611442565b601f1982820381018352601f909101166040818152426020838101919091523360601b828401528151603481850301815260549093019091528151910120909150610b9060008284611052565b6001600160a01b0385811660008181526001602052604080822080546001600160a01b0319169486169485179055805163189acdbd60e31b8152600481019390935251939650919263c4d66de89260248084019391929182900301818387803b158015610bfc57600080fd5b505af1158015610c10573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528816602082015281517f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48969450908190039091019150a15050919050565b6001602052600090815260409020546001600160a01b031681565b7315eb0c763581329c921c8398556ecff85cc4827581565b60005b8151811015610d4b577315eb0c763581329c921c8398556ecff85cc482756001600160a01b03166371ed5d1a838381518110610cce57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d0c57600080fd5b505af1158015610d20573d6000803e3d6000fd5b505050506040513d6020811015610d3657600080fd5b50610d44905081600161116d565b9050610c96565b5050565b6001600160a01b0380821660009081526001602052604090205433911680610dac576040805162461bcd60e51b815260206004820152601c6024820152600080516020613681833981519152604482015290519081900360640190fd5b600087118015610dbc5750600086115b610e09576040805162461bcd60e51b8152602060048201526019602482015278119b185cda105c1c0e8e881253959053125117d05353d55395603a1b604482015290519081900360640190fd5b6000806000836001600160a01b031663e0ab07728b8b8b8b8a6040518663ffffffff1660e01b815260040180868152602001858152602001848152602001838152602001826001600160a01b0316815260200195505050505050606060405180830381600087803b158015610e7d57600080fd5b505af1158015610e91573d6000803e3d6000fd5b505050506040513d6060811015610ea757600080fd5b50805160208201516040909201519094509092509050610edd7320398ad62bb2d930646d45a6d4292baa0b860c1f863086610f9b565b610efc7320398ad62bb2d930646d45a6d4292baa0b860c1f8585610ffb565b610f116001600160a01b038716863085610f9b565b610f256001600160a01b0387168584610ffb565b604080516001600160a01b03808716825260208201869052818301859052606082018490528716608082015290517f42199b399eec9bceda8511afd1d6412eb81c0cc2fdbfcaf1892164387c964d419181900360a00190a150505050505050505050565b60006020819052908152604090205481565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ff59085906111c1565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261104d9084906111c1565b505050565b600080844710156110aa576040805162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b82516110fd576040805162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015290519081900360640190fd5b8383516020850187f590506001600160a01b038116611163576040805162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015290519081900360640190fd5b90505b9392505050565b808201828110156111bb576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b92915050565b6060611216826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112729092919063ffffffff16565b80519091501561104d5780806020019051602081101561123557600080fd5b505161104d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806136a1602a913960400191505060405180910390fd5b606061116384846000858561128685611398565b6112d7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106113165780518252601f1990920191602091820191016112f7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611378576040519150601f19603f3d011682016040523d82523d6000602084013e61137d565b606091505b509150915061138d82828661139e565b979650505050505050565b3b151590565b606083156113ad575081611166565b8251156113bd5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156114075781810151838201526020016113ef565b50505050905090810190601f1680156114345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b612231806114508339019056fe6080604052600160085534801561001557600080fd5b50600a80546001600160a01b031916331790556121fa806100376000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806395d89b4111610125578063c4d66de8116100ad578063e0ab07721161007c578063e0ab0772146105ff578063e3ee160e1461065b578063e94a0102146106ba578063ed24911d146106e6578063fc0c546a146106ee57610211565b8063c4d66de814610519578063d505accf14610541578063d798f86e14610592578063dd62ed3e146105d157610211565b8063a9059cbb116100f4578063a9059cbb146104ac578063ad615dec146104d8578063ba9a7a5614610501578063c0bd9f1614610509578063c45a01551461051157610211565b806395d89b4114610477578063a0cc6a681461047f578063a10adb1714610487578063a7f0e903146104a457610211565b80633408e470116101a85780634d861ece116101775780634d861ece146103bf57806350b814a0146103c7578063687fbed8146103f957806370a082311461042b5780637ecebe001461045157610211565b80633408e470146103755780633750a8bd1461037d578063411542701461038557806342966c68146103a257610211565b806323b872dd116101e457806323b872dd1461031157806323c6e14c1461034757806330adf81f1461034f578063313ce5671461035757610211565b806306fdde03146102165780630754617214610293578063095ea7b3146102b757806318160ddd146102f7575b600080fd5b61021e6106f6565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610258578181015183820152602001610240565b50505050905090810190601f1680156102855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61029b610724565b604080516001600160a01b039092168252519081900360200190f35b6102e3600480360360408110156102cd57600080fd5b506001600160a01b038135169060200135610733565b604080519115158252519081900360200190f35b6102ff61074a565b60408051918252519081900360200190f35b6102e36004803603606081101561032757600080fd5b506001600160a01b03813581169160208101359091169060400135610750565b61029b6107c4565b6102ff6107dc565b61035f610800565b6040805160ff9092168252519081900360200190f35b6102ff610805565b6102ff610809565b6102ff6004803603602081101561039b57600080fd5b50356108b6565b6102e3600480360360208110156103b857600080fd5b503561091e565b6102ff610933565b6102ff600480360360608110156103dd57600080fd5b508035906001600160a01b036020820135169060400135610939565b6102ff6004803603606081101561040f57600080fd5b508035906001600160a01b036020820135169060400135610a70565b6102ff6004803603602081101561044157600080fd5b50356001600160a01b0316610b93565b6102ff6004803603602081101561046757600080fd5b50356001600160a01b0316610ba5565b61021e610bb7565b6102ff610bdf565b6102ff6004803603602081101561049d57600080fd5b5035610c03565b61029b610c49565b6102e3600480360360408110156104c257600080fd5b506001600160a01b038135169060200135610c61565b6102ff600480360360608110156104ee57600080fd5b5080359060208101359060400135610c6e565b6102ff610d41565b6102ff610d47565b61029b610d4d565b61053f6004803603602081101561052f57600080fd5b50356001600160a01b0316610d5c565b005b61053f600480360360e081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610dd3565b6105b8600480360360208110156105a857600080fd5b50356001600160a01b0316610ee2565b6040805192835260208301919091528051918290030190f35b6102ff600480360360408110156105e757600080fd5b506001600160a01b0381358116916020013516610f4f565b61063d600480360360a081101561061557600080fd5b50803590602081013590604081013590606081013590608001356001600160a01b0316610f6c565b60408051938452602084019290925282820152519081900360600190f35b61053f600480360361012081101561067257600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060ff60c0820135169060e0810135906101000135610ffb565b6102e3600480360360408110156106d057600080fd5b506001600160a01b0381351690602001356111cd565b6102ff6111ed565b61029b6112ab565b60405180604001604052806012815260200171232620a9a416a0a62a16a628102a37b5b2b760711b81525081565b6001546001600160a01b031681565b60006107403384846112ba565b5060015b92915050565b60005481565b6001600160a01b038316600090815260036020908152604080832033845290915281205460001981146107ac57610787818461131c565b6001600160a01b03861660009081526003602090815260408083203384529091529020555b6107b785858561136b565b60019150505b9392505050565b7320398ad62bb2d930646d45a6d4292baa0b860c1f81565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b4690565b6000807315eb0c763581329c921c8398556ecff85cc482756001600160a01b031663cc704d5460006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d602081101561088f57600080fd5b505190506108b06108a7826611c37937e0800061145e565b6103e89061131c565b91505090565b6000806108cb6108c4610809565b84906114c8565b905060006108e4600754836114c890919063ffffffff16565b90506000610909836109036103e86006546114c890919063ffffffff16565b9061152d565b9050610915828261145e565b95945050505050565b600061092a338361157b565b5060015b919050565b60065481565b6000600854600114610981576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b031633146109db576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b6109e484610c03565b905080821115610a3b576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610a45848261160d565b610a647320398ad62bb2d930646d45a6d4292baa0b860c1f8483611631565b60016008559392505050565b6000600854600114610ab8576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b6000600855600a546001600160a01b03163314610b12576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610b1b846108b6565b905080821115610b72576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a2045585045435445445f49535f47524541544552000000000000604482015290519081900360640190fd5b610b7c8482611688565b600954610a64906001600160a01b03168483611631565b60026020526000908152604090205481565b60046020526000908152604090205481565b6040518060400160405280600c81526020016b0464c4153482d414c542d4c560a41b81525081565b7f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226781565b600080610c116108c4610809565b90506000610c2a600654836114c890919063ffffffff16565b90506000610909836109036103e86007546114c890919063ffffffff16565b7315eb0c763581329c921c8398556ecff85cc4827581565b600061074033848461136b565b6000808411610cc4576040805162461bcd60e51b815260206004820152601a60248201527f506f6f6c3a3a20494e53554646494349454e545f414d4f554e54000000000000604482015290519081900360640190fd5b600083118015610cd45750600082115b610d25576040805162461bcd60e51b815260206004820152601d60248201527f506f6f6c3a3a20494e53554646494349454e545f4c4951554944495459000000604482015290519081900360640190fd5b610d3983610d3386856114c8565b9061145e565b949350505050565b6103e881565b60075481565b600a546001600160a01b031681565b600a546001600160a01b03163314610db1576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b42841015610e125760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b0380881660008181526004602081815260408084205481517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981850152808301879052968d166060880152608087018c905260a0870181905260c08088018c90528251808903909101815260e090970190915285519582019590952093909252905290610ea790600161152d565b6001600160a01b038916600090815260046020526040902055610ecd88828686866116a5565b610ed88888886112ba565b5050505050505050565b600a5460009081906001600160a01b03163314610f3c576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610f45836117c2565b9094909350915050565b600360209081526000928352604080842090915290825290205481565b600a54600090819081906001600160a01b03163314610fc8576040805162461bcd60e51b8152602060048201526013602482015272506f6f6c3a3a204f4e4c595f464143544f525960681b604482015290519081900360640190fd5b610fd488888888611b03565b9093509150610fe4848484611c26565b9050610ff08383611cf4565b955095509592505050565b8542116110395760405162461bcd60e51b815260040180806020018281038252602781526020018061212c6027913960400191505060405180910390fd5b8442106110775760405162461bcd60e51b81526004018080602001828103825260218152602001806120e56021913960400191505060405180910390fd5b6001600160a01b038916600090815260056020908152604080832087845290915290205460ff16156110da5760405162461bcd60e51b81526004018080602001828103825260268152602001806120916026913960400191505060405180910390fd5b604080517f7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a22676020808301919091526001600160a01b03808d16838501528b166060830152608082018a905260a0820189905260c0820188905260e08083018890528351808403909101815261010090920190925280519101206111608a828686866116a5565b6001600160a01b038a166000818152600560209081526040808320898452909152808220805460ff19166001179055518792917f98de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a591a36111c18a8a8a61136b565b50505050505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ffdde3a7807889787f51ab17062704a0d81341ba7debe5a9773b58a1b5e5f422c7fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a561125a610805565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b6009546001600160a01b031681565b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610744576040805162461bcd60e51b81526020600482015260146024820152734d4154483a3a205355425f554e444552464c4f5760601b604482015290519081900360640190fd5b6001600160a01b0382166113b05760405162461bcd60e51b815260040180806020018281038252602e8152602001806120b7602e913960400191505060405180910390fd5b6001600160a01b0383166000908152600260205260409020546113d3908261131c565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611402908261152d565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008082116114b4576040805162461bcd60e51b815260206004820152601760248201527f4d4154483a3a204449564953494f4e5f42595f5a45524f000000000000000000604482015290519081900360640190fd5b60008284816114bf57fe5b04949350505050565b6000826114d757506000610744565b828202828482816114e457fe5b04146107bd576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204d554c5f4f564552464c4f5760681b604482015290519081900360640190fd5b80820182811015610744576040805162461bcd60e51b81526020600482015260136024820152724d4154483a3a204144445f4f564552464c4f5760681b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090205461159e908261131c565b6001600160a01b038316600090815260026020526040812091909155546115c5908261131c565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b60065461161a908261131c565b60065560075461162a908361152d565b6007555050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611683908490611d11565b505050565b600654611695908361152d565b60065560075461162a908261131c565b60006116af6111ed565b85604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018286868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611748573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061177e5750866001600160a01b0316816001600160a01b0316145b6117b95760405162461bcd60e51b81526004018080602001828103825260268152602001806121066026913960400191505060405180910390fd5b50505050505050565b60008060085460011461180b576040805162461bcd60e51b815260206004820152600c60248201526b141bdbdb0e881313d0d2d15160a21b604482015290519081900360640190fd5b60006008819055604080516370a0823160e01b815230600482015290517320398ad62bb2d930646d45a6d4292baa0b860c1f916370a08231916024808301926020929190829003018186803b15801561186357600080fd5b505afa158015611877573d6000803e3d6000fd5b505050506040513d602081101561188d57600080fd5b5051600954604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b50513060009081526002602052604081205490549192509061192c82856114c8565b8161193357fe5b600054919004955061194582846114c8565b8161194c57fe5b04935060008511801561195f5750600084115b61199a5760405162461bcd60e51b81526004018080602001828103825260248152602001806121536024913960400191505060405180910390fd5b6119a4308261157b565b6119c37320398ad62bb2d930646d45a6d4292baa0b860c1f8787611631565b6009546119da906001600160a01b03168786611631565b604080516370a0823160e01b81523060048201529051611a63917320398ad62bb2d930646d45a6d4292baa0b860c1f916370a0823191602480820192602092909190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051849061131c565b600954604080516370a0823160e01b81523060048201529051929550611ae8926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d6020811015611adf57600080fd5b5051839061131c565b9150611af48383611dc2565b50506001600855509092909150565b6000806007546000148015611b185750600654155b15611b27575084905083611c1d565b6000611b3887600654600754610c6e565b9050858111611ba15783811015611b96576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f425f414d4f554e5400000000604482015290519081900360640190fd5b869250905080611c1b565b6000611bb287600754600654610c6e565b9050878111158015611bc45750858110155b611c15576040805162461bcd60e51b815260206004820152601c60248201527f506f6f6c3a3a20494e53554646494349454e545f415f414d4f554e5400000000604482015290519081900360640190fd5b92508591505b505b94509492505050565b60008054611c6057611c4c6103e8611c46611c4186866114c8565b611dcf565b9061131c565b9050611c5b60006103e8611e20565b611cab565b611ca8600654611c7b600054866114c890919063ffffffff16565b81611c8257fe5b04600754611c9b600054866114c890919063ffffffff16565b81611ca257fe5b04611eaa565b90505b60008111611cea5760405162461bcd60e51b81526004018080602001828103825260248152602001806121776024913960400191505060405180910390fd5b6107bd8482611e20565b600654611d01908361152d565b60065560075461162a908261152d565b6060611d66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ec09092919063ffffffff16565b80519091501561168357808060200190516020811015611d8557600080fd5b50516116835760405162461bcd60e51b815260040180806020018281038252602a81526020018061219b602a913960400191505060405180910390fd5b600654611695908361131c565b60006003821115611e12575080600160028204015b81811015611e0c57809150600281828581611dfb57fe5b040181611e0457fe5b049050611de4565b5061092e565b811561092e57506001919050565b600054611e2d908261152d565b60009081556001600160a01b038316815260026020526040902054611e52908261152d565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310611eb957816107bd565b5090919050565b6060610d39848460008585611ed485611fe6565b611f25576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611f645780518252601f199092019160209182019101611f45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b5091509150611fdb828286611fec565b979650505050505050565b3b151590565b60608315611ffb5750816107bd565b82511561200b5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561205557818101518382015260200161203d565b50505050905090810190601f1680156120825780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe464c4153482d414c542d4c5020546f6b656e3a3a20415554485f414c52454144595f55534544464c4153482d414c542d4c5020546f6b656e3a3a2052454345495645525f49535f544f4b454e5f4f525f5a45524f464c4153482d414c542d4c5020546f6b656e3a3a20415554485f45585049524544464c4153482d414c542d4c5020546f6b656e3a3a20494e56414c49445f5349474e4154555245464c4153482d414c542d4c5020546f6b656e3a3a20415554485f4e4f545f5945545f56414c4944506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4255524e4544506f6f6c3a3a20494e53554646494349454e545f4c49515549444954595f4d494e5445445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209683472579f7daa8f010c335cb11c4719f0438a7518f90532d9eeb74d4a6858464736f6c63430007040033466c6173684170703a3a20504f4f4c5f444f45534e545f4558495354000000005361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212205dffa766be744d3a011ee3800e932c9bec0273bb71723bbc5ea28f9cb42f4c5964736f6c63430007040033
Deployed Bytecode Sourcemap
32409:5462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36642:535;;;;;;;;;;;;;;;;-1:-1:-1;36642:535:0;;;;;;-1:-1:-1;;;;;36642:535:0;;:::i;:::-;;32520:80;;;:::i;:::-;;;;-1:-1:-1;;;;;32520:80:0;;;;;;;;;;;;;;34056:654;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34056:654:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34056:654:0;;-1:-1:-1;34056:654:0;-1:-1:-1;34056:654:0;:::i;:::-;;;;;;;;;;;;;;;;34937:659;;;;;;;;;;;;;;;;-1:-1:-1;34937:659:0;;;-1:-1:-1;;;;;34937:659:0;;;;;;;;;;:::i;37185:683::-;;;;;;;;;;;;;;;;-1:-1:-1;37185:683:0;;;-1:-1:-1;;;;;37185:683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33476:572::-;;;;;;;;;;;;;;;;-1:-1:-1;33476:572:0;-1:-1:-1;;;;;33476:572:0;;:::i;32753:40::-;;;;;;;;;;;;;;;;-1:-1:-1;32753:40:0;-1:-1:-1;;;;;32753:40:0;;:::i;32607:83::-;;;:::i;34718:211::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34718:211:0;;-1:-1:-1;34718:211:0;;-1:-1:-1;;;;;34718:211:0:i;35604:1030::-;;;;;;;;;;;;;;;;-1:-1:-1;35604:1030:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35604:1030:0;;:::i;32699:47::-;;;;;;;;;;;;;;;;-1:-1:-1;32699:47:0;;:::i;36642:535::-;-1:-1:-1;;;;;36781:13:0;;;36727;36781;;;:5;:13;;;;;;36743:10;;36781:13;36815:18;36807:59;;;;;-1:-1:-1;;;36807:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36807:59:0;;;;;;;;;;;;;;;36879:63;-1:-1:-1;;;;;36879:29:0;;36909:5;36924:4;36931:10;36879:29;:63::i;:::-;36953:43;-1:-1:-1;;;;;36953:25:0;;36979:4;36985:10;36953:25;:43::i;:::-;37010:19;37031:17;37058:4;-1:-1:-1;;;;;37052:27:0;;37080:5;37052:34;;;;;;;;;;;;;-1:-1:-1;;;;;37052:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37052:34:0;;;;;;;;37104:65;;-1:-1:-1;;;;;37104:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37052:34;;-1:-1:-1;37052:34:0;-1:-1:-1;37104:65:0;;;;;;;;;36642:535;;;;;;:::o;32520:80::-;32558:42;32520:80;:::o;34056:654::-;34313:7;33391:10;32648:42;33391:28;33383:65;;;;;-1:-1:-1;;;33383:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34334:13:::1;34349:22:::0;34386:5:::1;;34375:37;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;34375:37:0;::::1;::::0;::::1;34423:12;34438::::0;;;:5:::1;34375:37;34438:12:::0;;;34375:37;34438:12;;;;34375:37;;-1:-1:-1;34375:37:0;;::::1;;::::0;-1:-1:-1;34438:12:0::1;34461:53;32558:42;34438:12:::0;34500:13;34461:32:::1;:53::i;:::-;34525:14;34548:4;-1:-1:-1::0;;;;;34542:42:0::1;;34585:13;34600:7;34609:14;34542:82;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34542:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34542:82:0;34635:12:::1;:17:::0;;;34542:82:::1;34635:17:::0;;;;;;;;:26;;;34677:25;;;;;;;::::1;::::0;;;-1:-1:-1;;;;;34677:25:0;::::1;::::0;;;;;;34542:82;;-1:-1:-1;34677:25:0::1;::::0;;;;;;;;::::1;33459:1;;;;34056:654:::0;;;;;;;;;:::o;34937:659::-;-1:-1:-1;;;;;35142:13:0;;;35064:14;35142:13;;;:5;:13;;;;;;35064:14;;35106:10;;35142:13;35176:18;35168:59;;;;;-1:-1:-1;;;35168:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35168:59:0;;;;;;;;;;;;;;;35261:1;35246:12;:16;35238:54;;;;;-1:-1:-1;;;35238:54:0;;;;;;;;;;;;-1:-1:-1;;;35238:54:0;;;;;;;;;;;;;;;35305:66;-1:-1:-1;;;;;35305:31:0;;35337:4;35351;35358:12;35305:31;:66::i;:::-;35382:47;-1:-1:-1;;;;;35382:27:0;;35410:4;35416:12;35382:27;:47::i;:::-;35457:4;-1:-1:-1;;;;;35451:41:0;;35493:12;35507:4;35513:15;35451:78;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35451:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35451:78:0;35547:41;;;-1:-1:-1;;;;;35547:41:0;;;;;35451:78;35547:41;;;;;;;;;;;;;;;;;;;35451:78;;-1:-1:-1;35547:41:0;;;;;;;;;;34937:659;;;;;;;:::o;37185:683::-;-1:-1:-1;;;;;37448:13:0;;;37394;37448;;;:5;:13;;;;;;37410:10;;37448:13;37482:18;37474:59;;;;;-1:-1:-1;;;37474:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37474:59:0;;;;;;;;;;;;;;;37546:74;;;-1:-1:-1;;;37546:74:0;;-1:-1:-1;;;;;37546:74:0;;;;;;;:19;;:74;;;;;;-1:-1:-1;;37546:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;;:74;;;;;-1:-1:-1;;37546:74:0;;;;;;;;-1:-1:-1;37546:19:0;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37633:54:0;;-1:-1:-1;;;;;;;;37633:29:0;;37663:5;37633:29;37676:10;37633:29;:54::i;:::-;37701:19;37722:17;37749:4;-1:-1:-1;;;;;37743:27:0;;37771:5;37743:34;;;;;;;;;;;;;-1:-1:-1;;;;;37743:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37743:34:0;;;;;;;;37795:65;;-1:-1:-1;;;;;37795:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37743:34;;-1:-1:-1;37743:34:0;-1:-1:-1;37795:65:0;;;;;;;;;37185:683;;;;;;;;;;:::o;33476:572::-;33530:19;-1:-1:-1;;;;;33570:20:0;;33562:65;;;;;-1:-1:-1;;;33562:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33646:13:0;;;33671:1;33646:13;;;:5;:13;;;;;;;:27;33638:70;;;;;-1:-1:-1;;;33638:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33719:21;33743:23;;;;;;;;:::i;:::-;-1:-1:-1;;33743:23:0;;;;;;;;;;;;;;;;33819:15;33743:23;33802:45;;;;;;;33836:10;33802:45;;;;;;;;;;;;;;;;;;;;;;33792:56;;;;;33743:23;;-1:-1:-1;33873:33:0;33777:12;33792:56;33743:23;33873:14;:33::i;:::-;-1:-1:-1;;;;;33917:13:0;;;;;;;:5;:13;;;;;;:27;;-1:-1:-1;;;;;;33917:27:0;;;;;;;;;33955:37;;-1:-1:-1;;;33955:37:0;;;;;;;;;;33917:27;;-1:-1:-1;33917:27:0;;33955:29;;:37;;;;;33917:13;;33955:37;;;;;;33917:13;:27;33955:37;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34008:32:0;;;-1:-1:-1;;;;;34008:32:0;;;;;;;;;;;;;;;-1:-1:-1;34008:32:0;;;;;;;;-1:-1:-1;34008:32:0;33476:572;;;;;:::o;32753:40::-;;;;;;;;;;;;-1:-1:-1;;;;;32753:40:0;;:::o;32607:83::-;32648:42;32607:83;:::o;34718:211::-;34788:9;34783:139;34807:11;:18;34803:1;:22;34783:139;;;32648:42;-1:-1:-1;;;;;34856:38:0;;34895:11;34907:1;34895:14;;;;;;;;;;;;;;34856:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34831:8:0;;-1:-1:-1;34831:1:0;34837;34831:5;:8::i;:::-;34827:12;;34783:139;;;;34718:211;:::o;35604:1030::-;-1:-1:-1;;;;;35860:13:0;;;35808;35860;;;:5;:13;;;;;;35824:10;;35860:13;35894:18;35886:59;;;;;-1:-1:-1;;;35886:59:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35886:59:0;;;;;;;;;;;;;;;35979:1;35964:12;:16;:34;;;;;35997:1;35984:10;:14;35964:34;35956:72;;;;;-1:-1:-1;;;35956:72:0;;;;;;;;;;;;-1:-1:-1;;;35956:72:0;;;;;;;;;;;;;;;36042:19;36063:17;36082;36109:4;-1:-1:-1;;;;;36103:24:0;;36142:12;36169:10;36194:15;36224:13;36252:5;36103:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36103:165:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36103:165:0;;;;;;;;;;;;;-1:-1:-1;36103:165:0;;-1:-1:-1;36103:165:0;-1:-1:-1;36281:71:0;32558:42;36318:5;36333:4;36103:165;36281:36;:71::i;:::-;36363:51;32558:42;36396:4;36402:11;36363:32;:51::i;:::-;36427:64;-1:-1:-1;;;;;36427:31:0;;36459:5;36474:4;36481:9;36427:31;:64::i;:::-;36502:44;-1:-1:-1;;;;;36502:27:0;;36530:4;36536:9;36502:27;:44::i;:::-;36564:62;;;-1:-1:-1;;;;;36564:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35604:1030;;;;;;;;;;:::o;32699:47::-;;;;;;;;;;;;;;:::o;15326:248::-;15497:68;;;-1:-1:-1;;;;;15497:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15497:68:0;-1:-1:-1;;;15497:68:0;;;15470:96;;15490:5;;15470:19;:96::i;:::-;15326:248;;;;:::o;15107:211::-;15251:58;;;-1:-1:-1;;;;;15251:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15251:58:0;-1:-1:-1;;;15251:58:0;;;15224:86;;15244:5;;15224:19;:86::i;:::-;15107:211;;;:::o;12966:579::-;13087:7;13107:12;13163:6;13138:21;:31;;13130:73;;;;;-1:-1:-1;;;13130:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13222:15;;13214:65;;;;;-1:-1:-1;;;13214:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13433:4;13422:8;13416:15;13409:4;13399:8;13395:19;13387:6;13379:59;13371:67;-1:-1:-1;;;;;;13467:18:0;;13459:56;;;;;-1:-1:-1;;;13459:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13533:4;-1:-1:-1;12966:579:0;;;;;;:::o;2096:136::-;2189:5;;;2184:16;;;;2176:48;;;;;-1:-1:-1;;;2176:48:0;;;;;;;;;;;;-1:-1:-1;;;2176:48:0;;;;;;;;;;;;;;;2096:136;;;;:::o;15965:774::-;16389:23;16415:69;16443:4;16415:69;;;;;;;;;;;;;;;;;16423:5;-1:-1:-1;;;;;16415:27:0;;;:69;;;;;:::i;:::-;16499:17;;16389:95;;-1:-1:-1;16499:21:0;16495:237;;16654:10;16643:30;;;;;;;;;;;;;;;-1:-1:-1;16643:30:0;16635:85;;;;-1:-1:-1;;;16635:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:229;7496:12;7528:52;7550:6;7558:4;7564:1;7567:12;7496;8774:18;8785:6;8774:10;:18::i;:::-;8766:60;;;;;-1:-1:-1;;;8766:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8900:12;8914:23;8941:6;-1:-1:-1;;;;;8941:11:0;8961:5;8969:4;8941:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8941:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8899:75;;;;8992:52;9010:7;9019:10;9031:12;8992:17;:52::i;:::-;8985:59;8479:573;-1:-1:-1;;;;;;;8479:573:0:o;4417:444::-;4797:20;4845:8;;;4417:444::o;11130:777::-;11280:12;11309:7;11305:595;;;-1:-1:-1;11340:10:0;11333:17;;11305:595;11454:17;;:21;11450:439;;11717:10;11711:17;11778:15;11765:10;11761:2;11757:19;11750:44;11665:148;11860:12;11853:20;;-1:-1:-1;;;11853:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;:::o
Swarm Source
ipfs://5dffa766be744d3a011ee3800e932c9bec0273bb71723bbc5ea28f9cb42f4c59
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.