Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AmunBasketInteractiveAdapter
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import { ERC20 } from "../../interfaces/ERC20.sol"; import { SafeERC20 } from "../../shared/SafeERC20.sol"; import { TokenAmount } from "../../shared/Structs.sol"; import { ERC20ProtocolAdapter } from "../../adapters/ERC20ProtocolAdapter.sol"; import { InteractiveAdapter } from "../InteractiveAdapter.sol"; import { AmunBasket } from "../../interfaces/AmunBasket.sol"; /** * @title Interactive adapter for AmunBasket. * @dev Implementation of InteractiveAdapter abstract contract. * @author Timo <[email protected]> */ contract AmunBasketInteractiveAdapter is InteractiveAdapter, ERC20ProtocolAdapter { using SafeERC20 for ERC20; uint16 internal constant REFERRAL_CODE = 101; /** * @notice Deposits tokens to the AmunBasket. * @param tokenAmounts Array of underlying TokenAmounts - TokenAmount struct with * underlying tokens addresses, underlying tokens amounts to be deposited, and amount types. * @param data ABI-encoded additional parameters: * - basket - AmunBasket address. * @return tokensToBeWithdrawn Array with one element - AmunBasket address. * @dev Implementation of InteractiveAdapter function. */ function deposit(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable override returns (address[] memory tokensToBeWithdrawn) { address basket = abi.decode(data, (address)); uint256 length = tokenAmounts.length; require( length == AmunBasket(basket).getTokens().length, "LBIA: should be equal tokenAmount" ); tokensToBeWithdrawn = new address[](1); tokensToBeWithdrawn[0] = basket; uint256[] memory absoluteAmounts = new uint256[](length); for (uint256 i = 0; i < length; i++) { absoluteAmounts[i] = getAbsoluteAmountDeposit(tokenAmounts[i]); } uint256 amount = getBasketAmount(basket, tokenAmounts, absoluteAmounts); approveTokens(basket, tokenAmounts, absoluteAmounts); // solhint-disable-next-line no-empty-blocks try AmunBasket(basket).joinPool(amount, REFERRAL_CODE) {} catch Error( string memory reason ) { revert(reason); } catch { revert("LBIA: join fail"); } } /** * @notice Withdraws tokens from the AmunBasket. * @param tokenAmounts Array with one element - TokenAmount struct with * AmunBasket token address, AmunBasket token amount to be redeemed, and amount type. * @return tokensToBeWithdrawn Array with amun token underlying. * @dev Implementation of InteractiveAdapter function. */ function withdraw(TokenAmount[] calldata tokenAmounts, bytes calldata) external payable override returns (address[] memory tokensToBeWithdrawn) { require(tokenAmounts.length == 1, "LBIA: should be 1 tokenAmount"); address basket = tokenAmounts[0].token; tokensToBeWithdrawn = AmunBasket(basket).getTokens(); uint256 amount = getAbsoluteAmountWithdraw(tokenAmounts[0]); // solhint-disable-next-line no-empty-blocks try AmunBasket(basket).exitPool(amount, REFERRAL_CODE) {} catch Error( string memory reason ) { revert(reason); } catch { revert("LBIA: exit fail"); } } function approveTokens( address basket, TokenAmount[] calldata tokenAmounts, uint256[] memory absoluteAmounts ) internal { uint256 length = tokenAmounts.length; for (uint256 i = 0; i < length; i++) { ERC20(tokenAmounts[i].token).safeApproveMax(basket, absoluteAmounts[i], "LBIA[2]"); } } function getBasketAmount( address basket, TokenAmount[] calldata tokenAmounts, uint256[] memory absoluteAmounts ) internal view returns (uint256) { uint256 totalSupply = ERC20(basket).totalSupply() + AmunBasket(basket).calcOutStandingAnnualizedFee(); uint256 entryFee = AmunBasket(basket).getEntryFee(); uint256 minimumBasketAmount = type(uint256).max; uint256 tempAmount; for (uint256 i = 0; i < tokenAmounts.length; i++) { uint256 tokenBalance = ERC20(tokenAmounts[i].token).balanceOf(basket); tempAmount = absoluteAmounts[i] - (mul(absoluteAmounts[i], entryFee) / 10**18); tempAmount = mul(tempAmount, totalSupply) / tokenBalance; if (tempAmount < minimumBasketAmount) { minimumBasketAmount = tempAmount; } } return minimumBasketAmount; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "LBIA: mul overflow"); return c; } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import { ERC20 } from "../interfaces/ERC20.sol"; import { ProtocolAdapter } from "./ProtocolAdapter.sol"; /** * @title Adapter for any protocol with ERC20 interface. * @dev Implementation of ProtocolAdapter abstract contract. * @author Igor Sobolev <[email protected]> */ contract ERC20ProtocolAdapter is ProtocolAdapter { /** * @return Amount of tokens held by the given account. * @dev Implementation of ProtocolAdapter abstract contract function. */ function getBalance(address token, address account) public view override returns (int256) { return int256(ERC20(token).balanceOf(account)); } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; /** * @title Protocol adapter abstract contract. * @dev adapterType(), tokenType(), and getBalance() functions MUST be implemented. * @author Igor Sobolev <[email protected]> */ abstract contract ProtocolAdapter { /** * @dev MUST return amount and type of the given token * locked on the protocol by the given account. */ function getBalance(address token, address account) public virtual returns (int256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import { ProtocolAdapter } from "../adapters/ProtocolAdapter.sol"; import { TokenAmount, AmountType } from "../shared/Structs.sol"; import { ERC20 } from "../interfaces/ERC20.sol"; /** * @title Base contract for interactive protocol adapters. * @dev deposit() and withdraw() functions MUST be implemented * as well as all the functions from ProtocolAdapter abstract contract. * @author Igor Sobolev <[email protected]> */ abstract contract InteractiveAdapter is ProtocolAdapter { uint256 internal constant DELIMITER = 1e18; address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /** * @dev The function must deposit assets to the protocol. * @return MUST return assets to be sent back to the `msg.sender`. */ function deposit(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable virtual returns (address[] memory); /** * @dev The function must withdraw assets from the protocol. * @return MUST return assets to be sent back to the `msg.sender`. */ function withdraw(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable virtual returns (address[] memory); function getAbsoluteAmountDeposit(TokenAmount calldata tokenAmount) internal view virtual returns (uint256) { address token = tokenAmount.token; uint256 amount = tokenAmount.amount; AmountType amountType = tokenAmount.amountType; require( amountType == AmountType.Relative || amountType == AmountType.Absolute, "IA: bad amount type" ); if (amountType == AmountType.Relative) { require(amount <= DELIMITER, "IA: bad amount"); uint256 balance; if (token == ETH) { balance = address(this).balance; } else { balance = ERC20(token).balanceOf(address(this)); } if (amount == DELIMITER) { return balance; } else { return mul_(balance, amount) / DELIMITER; } } else { return amount; } } function getAbsoluteAmountWithdraw(TokenAmount calldata tokenAmount) internal virtual returns (uint256) { address token = tokenAmount.token; uint256 amount = tokenAmount.amount; AmountType amountType = tokenAmount.amountType; require( amountType == AmountType.Relative || amountType == AmountType.Absolute, "IA: bad amount type" ); if (amountType == AmountType.Relative) { require(amount <= DELIMITER, "IA: bad amount"); int256 balanceSigned = getBalance(token, address(this)); uint256 balance = balanceSigned > 0 ? uint256(balanceSigned) : uint256(-balanceSigned); if (amount == DELIMITER) { return balance; } else { return mul_(balance, amount) / DELIMITER; } } else { return amount; } } function mul_(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "IA: mul overflow"); return c; } }
// SPDX-License-Identifier: MIT pragma experimental ABIEncoderV2; pragma solidity ^0.7.1; interface AmunBasket { function getEntryFee() external view returns (uint256); /** @notice Pulls underlying from caller and mints the pool token @param _amount Amount of pool tokens to mint @param _referral Partners may receive rewards with their referral code */ function joinPool(uint256 _amount, uint16 _referral) external; function exitPool(uint256 _amount, uint16 _referral) external; function balance(address _token) external view returns (uint256); function getTokens() external view returns (address[] memory); function getTokenInPool(address _token) external view returns (bool); function calcTokensForAmount(uint256 _amount) external view returns (address[] memory tokens, uint256[] memory amounts); function calcTokensForAmountExit(uint256 _amount) external view returns (address[] memory tokens, uint256[] memory amounts); function calcOutStandingAnnualizedFee() external view returns (uint256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface ERC20 { function approve(address, uint256) external returns (bool); function transfer(address, uint256) external returns (bool); function transferFrom( address, address, uint256 ) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address) external view returns (uint256); function allowance(address, address) external view returns (uint256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; import "../interfaces/ERC20.sol"; /** * @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 ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { function safeTransfer( ERC20 token, address to, uint256 value, string memory location ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value), "transfer", location ); } function safeTransferFrom( ERC20 token, address from, address to, uint256 value, string memory location ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value), "transferFrom", location ); } function safeApprove( ERC20 token, address spender, uint256 value, string memory location ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), string(abi.encodePacked("SafeERC20: bad approve call from ", location)) ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value), "approve", location ); } function safeApproveMax( ERC20 token, address spender, uint256 value, string memory location ) internal { uint256 allowance = ERC20(token).allowance(address(this), spender); if (allowance < value) { if (allowance > 0) { safeApprove(token, spender, 0, location); } safeApprove(token, spender, type(uint256).max, location); } } /** * @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). * @param location Location of the call (for debug). */ function callOptionalReturn( ERC20 token, bytes memory data, string memory functionName, string memory location ) 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 implement two-steps call as callee is a contract is a responsibility of a caller. // 1. The call itself is made, and success asserted // 2. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require( success, string(abi.encodePacked("SafeERC20: ", functionName, " failed in ", location)) ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), string( abi.encodePacked("SafeERC20: ", functionName, " returned false in ", location) ) ); } } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.6; pragma experimental ABIEncoderV2; // The struct consists of TokenBalanceMeta structs for // (base) token and its underlying tokens (if any). struct FullTokenBalance { TokenBalanceMeta base; TokenBalanceMeta[] underlying; } // The struct consists of TokenBalance struct // with token address and absolute amount // and ERC20Metadata struct with ERC20-style metadata. // NOTE: 0xEeee...EEeE address is used for ETH. struct TokenBalanceMeta { TokenBalance tokenBalance; ERC20Metadata erc20metadata; } // The struct consists of ERC20-style token metadata. struct ERC20Metadata { string name; string symbol; uint8 decimals; } // The struct consists of protocol adapter's name // and array of TokenBalance structs // with token addresses and absolute amounts. struct AdapterBalance { bytes32 protocolAdapterName; TokenBalance[] tokenBalances; } // The struct consists of token address // and its absolute amount (may be negative). // 0xEeee...EEeE is used for Ether struct TokenBalance { address token; int256 amount; } // The struct consists of token address, // and price per full share (1e18). // 0xEeee...EEeE is used for Ether struct Component { address token; int256 rate; } //=============================== Interactive Adapters Structs ==================================== // The struct consists of name of the protocol adapter, // action type, array of token amounts, // and some additional data (depends on the protocol). struct Action { bytes32 protocolAdapterName; ActionType actionType; TokenAmount[] tokenAmounts; bytes data; } // The struct consists of token address, // its amount, and amount type, as well as // permit type and calldata. struct Input { TokenAmount tokenAmount; Permit permit; } // The struct consists of // permit type and calldata. struct Permit { PermitType permitType; bytes permitCallData; } // The struct consists of token address, // its amount, and amount type. // 0xEeee...EEeE is used for Ether struct TokenAmount { address token; uint256 amount; AmountType amountType; } // The struct consists of fee share // and beneficiary address. struct Fee { uint256 share; address beneficiary; } // The struct consists of token address // and its absolute amount. // 0xEeee...EEeE is used for Ether struct AbsoluteTokenAmount { address token; uint256 absoluteAmount; } enum ActionType { None, Deposit, Withdraw } enum AmountType { None, Relative, Absolute } enum PermitType { None, EIP2612, DAI, Yearn }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum AmountType","name":"amountType","type":"uint8"}],"internalType":"struct TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deposit","outputs":[{"internalType":"address[]","name":"tokensToBeWithdrawn","type":"address[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getBalance","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum AmountType","name":"amountType","type":"uint8"}],"internalType":"struct TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"withdraw","outputs":[{"internalType":"address[]","name":"tokensToBeWithdrawn","type":"address[]"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611c40806100206000396000f3fe6080604052600436106100345760003560e01c806328ffb83d14610039578063387b817414610062578063d4fac45d14610075575b600080fd5b61004c610047366004611704565b6100a2565b6040516100599190611818565b60405180910390f35b61004c610070366004611704565b6103b6565b34801561008157600080fd5b50610095610090366004611617565b6105a7565b6040516100599190611872565b606060006100b2838501856115fb565b905060008686905090508173ffffffffffffffffffffffffffffffffffffffff1663aa6ca8086040518163ffffffff1660e01b815260040160006040518083038186803b15801561010257600080fd5b505afa158015610116573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261015c919081019061164f565b51811461019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611991565b60405180910390fd5b604080516001808252818301909252906020808301908036833701905050925081836000815181106101cc57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008167ffffffffffffffff8111801561021f57600080fd5b50604051908082528060200260200182016040528015610249578160200160208202803683370190505b50905060005b828110156102905761027189898381811061026657fe5b905060600201610655565b82828151811061027d57fe5b602090810291909101015260010161024f565b50600061029f848a8a85610861565b90506102ad848a8a85610b3d565b6040517fbd4c253600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bd4c253690610302908490606590600401611aca565b600060405180830381600087803b15801561031c57600080fd5b505af192505050801561032d575060015b6103aa57610339611ae2565b806103445750610378565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195919061187b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a5c565b50505050949350505050565b6060600184146103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a25565b60008585600081811061040157fe5b61041792602060609092020190810191506115fb565b90508073ffffffffffffffffffffffffffffffffffffffff1663aa6ca8086040518163ffffffff1660e01b815260040160006040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104b9919081019061164f565b915060006104d8878760008181106104cd57fe5b905060600201610be7565b6040517efdedf000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169062fdedf09061052e908490606590600401611aca565b600060405180830381600087803b15801561054857600080fd5b505af1925050508015610559575060015b61059d57610565611ae2565b8061034457506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101959061195a565b5050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906105fc9085906004016117f7565b60206040518083038186803b15801561061457600080fd5b505afa158015610628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064c91906117df565b90505b92915050565b60008061066560208401846115fb565b90506020830135600061067e60608601604087016117c0565b9050600181600281111561068e57fe5b14806106a5575060028160028111156106a357fe5b145b6106db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906118ec565b60018160028111156106e957fe5b141561085257670de0b6b3a7640000821115610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611923565b600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561076c575047610811565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906370a08231906107be9030906004016117f7565b60206040518083038186803b1580156107d657600080fd5b505afa1580156107ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080e91906117df565b90505b670de0b6b3a764000083141561082c57935061085c92505050565b670de0b6b3a764000061083f8285610d2a565b8161084657fe5b0494505050505061085c565b50915061085c9050565b919050565b6000808573ffffffffffffffffffffffffffffffffffffffff1663ec9c2b396040518163ffffffff1660e01b815260040160206040518083038186803b1580156108aa57600080fd5b505afa1580156108be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e291906117df565b8673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092857600080fd5b505afa15801561093c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096091906117df565b01905060008673ffffffffffffffffffffffffffffffffffffffff1663e586a4f06040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ab57600080fd5b505afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e391906117df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b87811015610b2f576000898983818110610a2057fe5b610a3692602060609092020190810191506115fb565b73ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401610a6e91906117f7565b60206040518083038186803b158015610a8657600080fd5b505afa158015610a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abe91906117df565b9050670de0b6b3a7640000610ae6898481518110610ad857fe5b602002602001015187610d7e565b81610aed57fe5b04888381518110610afa57fe5b602002602001015103925080610b108488610d7e565b81610b1757fe5b04925083831015610b26578293505b50600101610a0a565b509098975050505050505050565b8160005b81811015610bdf57610bd786848381518110610b5957fe5b60200260200101516040518060400160405280600781526020017f4c4249415b325d00000000000000000000000000000000000000000000000000815250888886818110610ba357fe5b610bb992602060609092020190810191506115fb565b73ffffffffffffffffffffffffffffffffffffffff16929190610dd2565b600101610b41565b505050505050565b600080610bf760208401846115fb565b905060208301356000610c1060608601604087016117c0565b90506001816002811115610c2057fe5b1480610c3757506002816002811115610c3557fe5b145b610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906118ec565b6001816002811115610c7b57fe5b141561085257670de0b6b3a7640000821115610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611923565b6000610ccf84306105a7565b90506000808213610ce35781600003610ce5565b815b9050670de0b6b3a7640000841415610d0357945061085c9350505050565b670de0b6b3a7640000610d168286610d2a565b81610d1d57fe5b049550505050505061085c565b600082610d395750600061064f565b82820282848281610d4657fe5b041461064c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a93565b600082610d8d5750600061064f565b82820282848281610d9a57fe5b041461064c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906119ee565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8581166024830152915160009287169163dd62ed3e916044808301926020929190829003018186803b158015610e4957600080fd5b505afa158015610e5d573d6000803e3d6000fd5b505050506040513d6020811015610e7357600080fd5b5051905082811015610ebe578015610e9257610e928585600085610ec5565b610ebe85857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85610ec5565b5050505050565b811580610f715750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff858116602483015291519186169163dd62ed3e91604480820192602092909190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051155b816040516020018080611bea6021913960210182805190602001908083835b60208310610fcd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f90565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052906110a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506040805173ffffffffffffffffffffffffffffffffffffffff8516602482015260448082018590528251808303909101815260649091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790528251808401909352600783527f617070726f76650000000000000000000000000000000000000000000000000090830152611165918691908461116b565b50505050565b6000808573ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b602083106111d357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611196565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611235576040519150601f19603f3d011682016040523d82523d6000602084013e61123a565b606091505b509150915081848460405160200180807f5361666545524332303a20000000000000000000000000000000000000000000815250600b0183805190602001908083835b602083106112ba57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161127d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527f206661696c656420696e20000000000000000000000000000000000000000000919093019081528451600b90910192850191508083835b6020831061136757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161132a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290611402576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611069578181015183820152602001611051565b50805115610bdf5780806020019051602081101561141f57600080fd5b50516040517f5361666545524332303a20000000000000000000000000000000000000000000602082810191825287518893889392602b90910191908501908083835b6020831061149f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611462565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527f2072657475726e65642066616c736520696e2000000000000000000000000000919093019081528451601390910192850191508083835b6020831061154c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161150f565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052906115e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611069578181015183820152602001611051565b50505050505050565b805161085c81611bc4565b60006020828403121561160c578081fd5b813561064c81611bc4565b60008060408385031215611629578081fd5b823561163481611bc4565b9150602083013561164481611bc4565b809150509250929050565b60006020808385031215611661578182fd5b825167ffffffffffffffff80821115611678578384fd5b818501915085601f83011261168b578384fd5b81518181111561169757fe5b838102604051858282010181811085821117156116b057fe5b604052828152858101935084860182860187018a10156116ce578788fd5b8795505b838610156116f7576116e3816115f0565b8552600195909501949386019386016116d2565b5098975050505050505050565b60008060008060408587031215611719578182fd5b843567ffffffffffffffff80821115611730578384fd5b818701915087601f830112611743578384fd5b813581811115611751578485fd5b886020606083028501011115611765578485fd5b60209283019650945090860135908082111561177f578384fd5b818701915087601f830112611792578384fd5b8135818111156117a0578485fd5b8860208285010111156117b1578485fd5b95989497505060200194505050565b6000602082840312156117d1578081fd5b81356003811061064c578182fd5b6000602082840312156117f0578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252825182820181905260009190848201906040850190845b8181101561186657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611834565b50909695505050505050565b90815260200190565b6000602080835283518082850152825b818110156118a75785810183015185820160400152820161188b565b818111156118b85783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526013908201527f49413a2062616420616d6f756e74207479706500000000000000000000000000604082015260600190565b6020808252600e908201527f49413a2062616420616d6f756e74000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4c4249413a2065786974206661696c0000000000000000000000000000000000604082015260600190565b60208082526021908201527f4c4249413a2073686f756c6420626520657175616c20746f6b656e416d6f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f4c4249413a206d756c206f766572666c6f770000000000000000000000000000604082015260600190565b6020808252601d908201527f4c4249413a2073686f756c64206265203120746f6b656e416d6f756e74000000604082015260600190565b6020808252600f908201527f4c4249413a206a6f696e206661696c0000000000000000000000000000000000604082015260600190565b60208082526010908201527f49413a206d756c206f766572666c6f7700000000000000000000000000000000604082015260600190565b91825261ffff16602082015260400190565b60e01c90565b600060443d1015611af257611bc1565b600481823e6308c379a0611b068251611adc565b14611b1057611bc1565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715611b5e5750505050611bc1565b82840192508251915080821115611b785750505050611bc1565b503d83016020828401011115611b9057505050611bc1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b90565b73ffffffffffffffffffffffffffffffffffffffff81168114611be657600080fd5b5056fe5361666545524332303a2062616420617070726f76652063616c6c2066726f6d20a264697066735822122008debd2698eb57c6117660443a5d1b07c002f071ac66bbf2c59c8c7509e8124b64736f6c63430007060033
Deployed Bytecode
0x6080604052600436106100345760003560e01c806328ffb83d14610039578063387b817414610062578063d4fac45d14610075575b600080fd5b61004c610047366004611704565b6100a2565b6040516100599190611818565b60405180910390f35b61004c610070366004611704565b6103b6565b34801561008157600080fd5b50610095610090366004611617565b6105a7565b6040516100599190611872565b606060006100b2838501856115fb565b905060008686905090508173ffffffffffffffffffffffffffffffffffffffff1663aa6ca8086040518163ffffffff1660e01b815260040160006040518083038186803b15801561010257600080fd5b505afa158015610116573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261015c919081019061164f565b51811461019e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611991565b60405180910390fd5b604080516001808252818301909252906020808301908036833701905050925081836000815181106101cc57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060008167ffffffffffffffff8111801561021f57600080fd5b50604051908082528060200260200182016040528015610249578160200160208202803683370190505b50905060005b828110156102905761027189898381811061026657fe5b905060600201610655565b82828151811061027d57fe5b602090810291909101015260010161024f565b50600061029f848a8a85610861565b90506102ad848a8a85610b3d565b6040517fbd4c253600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bd4c253690610302908490606590600401611aca565b600060405180830381600087803b15801561031c57600080fd5b505af192505050801561032d575060015b6103aa57610339611ae2565b806103445750610378565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195919061187b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a5c565b50505050949350505050565b6060600184146103f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a25565b60008585600081811061040157fe5b61041792602060609092020190810191506115fb565b90508073ffffffffffffffffffffffffffffffffffffffff1663aa6ca8086040518163ffffffff1660e01b815260040160006040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526104b9919081019061164f565b915060006104d8878760008181106104cd57fe5b905060600201610be7565b6040517efdedf000000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff83169062fdedf09061052e908490606590600401611aca565b600060405180830381600087803b15801561054857600080fd5b505af1925050508015610559575060015b61059d57610565611ae2565b8061034457506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101959061195a565b5050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906105fc9085906004016117f7565b60206040518083038186803b15801561061457600080fd5b505afa158015610628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064c91906117df565b90505b92915050565b60008061066560208401846115fb565b90506020830135600061067e60608601604087016117c0565b9050600181600281111561068e57fe5b14806106a5575060028160028111156106a357fe5b145b6106db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906118ec565b60018160028111156106e957fe5b141561085257670de0b6b3a7640000821115610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611923565b600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561076c575047610811565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906370a08231906107be9030906004016117f7565b60206040518083038186803b1580156107d657600080fd5b505afa1580156107ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080e91906117df565b90505b670de0b6b3a764000083141561082c57935061085c92505050565b670de0b6b3a764000061083f8285610d2a565b8161084657fe5b0494505050505061085c565b50915061085c9050565b919050565b6000808573ffffffffffffffffffffffffffffffffffffffff1663ec9c2b396040518163ffffffff1660e01b815260040160206040518083038186803b1580156108aa57600080fd5b505afa1580156108be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e291906117df565b8673ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092857600080fd5b505afa15801561093c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096091906117df565b01905060008673ffffffffffffffffffffffffffffffffffffffff1663e586a4f06040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ab57600080fd5b505afa1580156109bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e391906117df565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b87811015610b2f576000898983818110610a2057fe5b610a3692602060609092020190810191506115fb565b73ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401610a6e91906117f7565b60206040518083038186803b158015610a8657600080fd5b505afa158015610a9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abe91906117df565b9050670de0b6b3a7640000610ae6898481518110610ad857fe5b602002602001015187610d7e565b81610aed57fe5b04888381518110610afa57fe5b602002602001015103925080610b108488610d7e565b81610b1757fe5b04925083831015610b26578293505b50600101610a0a565b509098975050505050505050565b8160005b81811015610bdf57610bd786848381518110610b5957fe5b60200260200101516040518060400160405280600781526020017f4c4249415b325d00000000000000000000000000000000000000000000000000815250888886818110610ba357fe5b610bb992602060609092020190810191506115fb565b73ffffffffffffffffffffffffffffffffffffffff16929190610dd2565b600101610b41565b505050505050565b600080610bf760208401846115fb565b905060208301356000610c1060608601604087016117c0565b90506001816002811115610c2057fe5b1480610c3757506002816002811115610c3557fe5b145b610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906118ec565b6001816002811115610c7b57fe5b141561085257670de0b6b3a7640000821115610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611923565b6000610ccf84306105a7565b90506000808213610ce35781600003610ce5565b815b9050670de0b6b3a7640000841415610d0357945061085c9350505050565b670de0b6b3a7640000610d168286610d2a565b81610d1d57fe5b049550505050505061085c565b600082610d395750600061064f565b82820282848281610d4657fe5b041461064c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019590611a93565b600082610d8d5750600061064f565b82820282848281610d9a57fe5b041461064c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610195906119ee565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8581166024830152915160009287169163dd62ed3e916044808301926020929190829003018186803b158015610e4957600080fd5b505afa158015610e5d573d6000803e3d6000fd5b505050506040513d6020811015610e7357600080fd5b5051905082811015610ebe578015610e9257610e928585600085610ec5565b610ebe85857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85610ec5565b5050505050565b811580610f715750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff858116602483015291519186169163dd62ed3e91604480820192602092909190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051155b816040516020018080611bea6021913960210182805190602001908083835b60208310610fcd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f90565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052906110a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506040805173ffffffffffffffffffffffffffffffffffffffff8516602482015260448082018590528251808303909101815260649091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790528251808401909352600783527f617070726f76650000000000000000000000000000000000000000000000000090830152611165918691908461116b565b50505050565b6000808573ffffffffffffffffffffffffffffffffffffffff16856040518082805190602001908083835b602083106111d357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611196565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611235576040519150601f19603f3d011682016040523d82523d6000602084013e61123a565b606091505b509150915081848460405160200180807f5361666545524332303a20000000000000000000000000000000000000000000815250600b0183805190602001908083835b602083106112ba57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161127d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527f206661696c656420696e20000000000000000000000000000000000000000000919093019081528451600b90910192850191508083835b6020831061136757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161132a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290611402576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611069578181015183820152602001611051565b50805115610bdf5780806020019051602081101561141f57600080fd5b50516040517f5361666545524332303a20000000000000000000000000000000000000000000602082810191825287518893889392602b90910191908501908083835b6020831061149f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611462565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527f2072657475726e65642066616c736520696e2000000000000000000000000000919093019081528451601390910192850191508083835b6020831061154c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161150f565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052906115e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611069578181015183820152602001611051565b50505050505050565b805161085c81611bc4565b60006020828403121561160c578081fd5b813561064c81611bc4565b60008060408385031215611629578081fd5b823561163481611bc4565b9150602083013561164481611bc4565b809150509250929050565b60006020808385031215611661578182fd5b825167ffffffffffffffff80821115611678578384fd5b818501915085601f83011261168b578384fd5b81518181111561169757fe5b838102604051858282010181811085821117156116b057fe5b604052828152858101935084860182860187018a10156116ce578788fd5b8795505b838610156116f7576116e3816115f0565b8552600195909501949386019386016116d2565b5098975050505050505050565b60008060008060408587031215611719578182fd5b843567ffffffffffffffff80821115611730578384fd5b818701915087601f830112611743578384fd5b813581811115611751578485fd5b886020606083028501011115611765578485fd5b60209283019650945090860135908082111561177f578384fd5b818701915087601f830112611792578384fd5b8135818111156117a0578485fd5b8860208285010111156117b1578485fd5b95989497505060200194505050565b6000602082840312156117d1578081fd5b81356003811061064c578182fd5b6000602082840312156117f0578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6020808252825182820181905260009190848201906040850190845b8181101561186657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611834565b50909695505050505050565b90815260200190565b6000602080835283518082850152825b818110156118a75785810183015185820160400152820161188b565b818111156118b85783604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60208082526013908201527f49413a2062616420616d6f756e74207479706500000000000000000000000000604082015260600190565b6020808252600e908201527f49413a2062616420616d6f756e74000000000000000000000000000000000000604082015260600190565b6020808252600f908201527f4c4249413a2065786974206661696c0000000000000000000000000000000000604082015260600190565b60208082526021908201527f4c4249413a2073686f756c6420626520657175616c20746f6b656e416d6f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f4c4249413a206d756c206f766572666c6f770000000000000000000000000000604082015260600190565b6020808252601d908201527f4c4249413a2073686f756c64206265203120746f6b656e416d6f756e74000000604082015260600190565b6020808252600f908201527f4c4249413a206a6f696e206661696c0000000000000000000000000000000000604082015260600190565b60208082526010908201527f49413a206d756c206f766572666c6f7700000000000000000000000000000000604082015260600190565b91825261ffff16602082015260400190565b60e01c90565b600060443d1015611af257611bc1565b600481823e6308c379a0611b068251611adc565b14611b1057611bc1565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715611b5e5750505050611bc1565b82840192508251915080821115611b785750505050611bc1565b503d83016020828401011115611b9057505050611bc1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b90565b73ffffffffffffffffffffffffffffffffffffffff81168114611be657600080fd5b5056fe5361666545524332303a2062616420617070726f76652063616c6c2066726f6d20a264697066735822122008debd2698eb57c6117660443a5d1b07c002f071ac66bbf2c59c8c7509e8124b64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.