Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LinearTrueDistributor
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-19 */ /* .'''''''''''.. ..''''''''''''''''.. ..'''''''''''''''.. .;;;;;;;;;;;'. .';;;;;;;;;;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;,. .;;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;,. .;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;;;,. .;;;;;;;;;;;;;;;;;;;;,. ';;;;;;;;'. .';;;;;;;;;;;;;;;;;;;;;;,. .';;;;;;;;;;;;;;;;;;;;;,. ';;;;;,.. .';;;;;;;;;;;;;;;;;;;;;;;,..';;;;;;;;;;;;;;;;;;;;;;,. ...... .';;;;;;;;;;;;;,'''''''''''.,;;;;;;;;;;;;;,'''''''''.. .,;;;;;;;;;;;;;. .,;;;;;;;;;;;;;. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;,. .;;;;;;;;;;;;;,. ..... .;;;;;;;;;;;;;'. ..';;;;;;;;;;;;;'. .',;;;;,'. .';;;;;;;;;;;;;'. .';;;;;;;;;;;;;;'. .';;;;;;;;;;. .';;;;;;;;;;;;;'. .';;;;;;;;;;;;;;'. .;;;;;;;;;;;,. .,;;;;;;;;;;;;;'...........,;;;;;;;;;;;;;;. .;;;;;;;;;;;,. .,;;;;;;;;;;;;,..,;;;;;;;;;;;;;;;;;;;;;;;,. ..;;;;;;;;;,. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;;;;;,. .',;;;,,.. .,;;;;;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;;;;,. .... ..',;;;;;;;;,. .,;;;;;;;;;;;;;;;;;;;;,. ..',;;;;'. .,;;;;;;;;;;;;;;;;;;;'. ...'.. .';;;;;;;;;;;;;;,,,'. ............... */ // https://github.com/trusttoken/smart-contracts // Dependency file: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT // pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Dependency file: @openzeppelin/contracts/GSN/Context.sol // pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // Dependency file: contracts/truefi/common/Initializable.sol // Copied from https://github.com/OpenZeppelin/openzeppelin-contracts-ethereum-package/blob/v3.0.0/contracts/Initializable.sol // pragma solidity 0.6.10; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // Dependency file: contracts/truefi/common/UpgradeableOwnable.sol // pragma solidity 0.6.10; // import {Context} from "@openzeppelin/contracts/GSN/Context.sol"; // import {Initializable} from "contracts/truefi/common/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Initializable, Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function initialize() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * // importANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: contracts/truefi/interface/ITrueDistributor.sol // pragma solidity 0.6.10; // import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface ITrueDistributor { function trustToken() external view returns (IERC20); function farm() external view returns (address); function distribute() external; function nextDistribution() external view returns (uint256); function empty() external; } // Root file: contracts/truefi/distributors/LinearTrueDistributor.sol pragma solidity 0.6.10; // import {SafeMath} from "@openzeppelin/contracts/math/SafeMath.sol"; // import {Ownable} from "contracts/truefi/common/UpgradeableOwnable.sol"; // import {ITrueDistributor, IERC20} from "contracts/truefi/interface/ITrueDistributor.sol"; /** * @title LinearTrueDistributor * @notice Distribute TRU in a linear fashion * @dev Distributor contract which uses a linear distribution * * Contracts are registered to receive distributions. Once registered, * a farm contract can claim TRU from the distributor. * - Distributions are based on time. * - Owner can withdraw funds in case distribution need to be re-allocated */ contract LinearTrueDistributor is ITrueDistributor, Ownable { using SafeMath for uint256; // ================ WARNING ================== // ===== THIS CONTRACT IS INITIALIZABLE ====== // === STORAGE VARIABLES ARE DECLARED BELOW == // REMOVAL OR REORDER OF VARIABLES WILL RESULT // ========= IN STORAGE CORRUPTION =========== IERC20 public override trustToken; uint256 public distributionStart; uint256 public duration; uint256 public totalAmount; uint256 public lastDistribution; uint256 public distributed; // contract which claim tokens from distributor address public override farm; // ======= STORAGE DECLARATION END ============ /** * @dev Emitted when the farm address is changed * @param newFarm new farm contract */ event FarmChanged(address newFarm); /** * @dev Emitted when the total distributed amount is changed * @param newTotalAmount new totalAmount value */ event TotalAmountChanged(uint256 newTotalAmount); /** * @dev Emitted when a distribution occurs * @param amount Amount of TRU distributed to farm */ event Distributed(uint256 amount); /** * @dev Initialize distributor * @param _distributionStart Start time for distribution * @param _duration Length of distribution * @param _amount Amount to distribute * @param _trustToken TRU address */ function initialize( uint256 _distributionStart, uint256 _duration, uint256 _amount, IERC20 _trustToken ) public initializer { Ownable.initialize(); distributionStart = _distributionStart; lastDistribution = _distributionStart; duration = _duration; totalAmount = _amount; trustToken = _trustToken; } /** * @dev Set contract to receive distributions * Will distribute to previous contract if farm already exists * @param newFarm New farm for distribution */ function setFarm(address newFarm) external onlyOwner { distribute(); farm = newFarm; emit FarmChanged(newFarm); } /** * @dev Distribute tokens to farm in linear fashion based on time */ function distribute() public override { // cannot distribute until distribution start uint256 amount = nextDistribution(); if (amount == 0) { return; } // transfer tokens & update state lastDistribution = block.timestamp; distributed = distributed.add(amount); require(trustToken.transfer(farm, amount)); emit Distributed(amount); } /** * @dev Calculate next distribution amount * @return amount of tokens for next distribution */ function nextDistribution() public override view returns (uint256) { // return 0 if before distribution or farm is not set if (block.timestamp < distributionStart || farm == address(0)) { return 0; } // calculate distribution amount uint256 amount = totalAmount.sub(distributed); if (block.timestamp < distributionStart.add(duration)) { amount = block.timestamp.sub(lastDistribution).mul(totalAmount).div(duration); } return amount; } /** * @dev Withdraw funds (for instance if owner decides to create a new distribution) * Distributes remaining funds before withdrawing * Ends current distribution */ function empty() public override onlyOwner { distribute(); distributed = 0; totalAmount = 0; require(trustToken.transfer(msg.sender, trustToken.balanceOf(address(this)))); } /** * @dev Change amount of tokens distributed daily by changing total distributed amount * @param dailyDistribution New daily distribution */ function setDailyDistribution(uint256 dailyDistribution) public onlyOwner { distribute(); uint256 timeLeft = distributionStart.add(duration).sub(block.timestamp); if (timeLeft > duration) { timeLeft = duration; } else { distributionStart = block.timestamp; duration = timeLeft; } totalAmount = dailyDistribution.mul(timeLeft).div(1 days); distributed = 0; emit TotalAmountChanged(totalAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Distributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newFarm","type":"address"}],"name":"FarmChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTotalAmount","type":"uint256"}],"name":"TotalAmountChanged","type":"event"},{"inputs":[],"name":"distribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"empty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributionStart","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"contract IERC20","name":"_trustToken","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dailyDistribution","type":"uint256"}],"name":"setDailyDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFarm","type":"address"}],"name":"setFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506111cd806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063e4fc6b6d11610066578063e4fc6b6d1461021f578063f2a75fe414610227578063f2fde38b1461022f578063f84b903e1461026257610100565b80638da5cb5b146101d4578063a717639c146101dc578063d13deb2f146101e4578063d4f26c51146101ec57610100565b806336e9332d116100d357806336e9332d1461018b57806338b0789d146101bc578063715018a6146101c45780637bbc101b146101cc57610100565b80630fb5a6b4146101055780631a39d8ef1461011f5780631f8d519d146101275780632911360a1461016e575b600080fd5b61010d61026a565b60408051918252519081900360200190f35b61010d610270565b61016c6004803603608081101561013d57600080fd5b508035906020810135906040810135906060013573ffffffffffffffffffffffffffffffffffffffff16610276565b005b61016c6004803603602081101561018457600080fd5b50356103ea565b61019361052e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010d61054a565b61016c6105ee565b61010d6106ee565b6101936106f4565b61010d610710565b610193610716565b61016c6004803603602081101561020257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610732565b61016c610844565b61016c610960565b61016c6004803603602081101561024557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b52565b61010d610cdd565b60365481565b60375481565b600054610100900460ff168061028f575061028f610ce3565b8061029d575060005460ff16155b6102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061116a602e913960400191505060405180910390fd5b600054610100900460ff1615801561035857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b610360610ce9565b6035859055603885905560368490556037839055603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156103e357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050505050565b6103f2610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461047b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610483610844565b60006104ac426104a0603654603554610e7e90919063ffffffff16565b9063ffffffff610efb16565b90506036548111156104c157506036546104cb565b4260355560368190555b6104ee620151806104e2848463ffffffff610f3d16565b9063ffffffff610fb016565b6037819055600060395560408051918252517f1caad7d33cfc518fd9b724878731c04ca569952cfc1401483a2068b82a8cec2e9181900360200190a15050565b603a5473ffffffffffffffffffffffffffffffffffffffff1681565b60006035544210806105725750603a5473ffffffffffffffffffffffffffffffffffffffff16155b1561057f575060006105eb565b6000610598603954603754610efb90919063ffffffff16565b90506105b1603654603554610e7e90919063ffffffff16565b4210156105e8576105e56036546104e26037546105d960385442610efb90919063ffffffff16565b9063ffffffff610f3d16565b90505b90505b90565b6105f6610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461067f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60335460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60355481565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b60385481565b60345473ffffffffffffffffffffffffffffffffffffffff1681565b61073a610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff9081169116146107c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6107cb610844565b603a805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fe8d79c9831b9b25abf1785ab7027993c1cca203c617c418d316776b3c980ec8a9181900360200190a150565b600061084e61054a565b90508061085b575061095e565b42603855603954610872908263ffffffff610e7e16565b603955603454603a54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108f457600080fd5b505af1158015610908573d6000803e3d6000fd5b505050506040513d602081101561091e57600080fd5b505161092957600080fd5b6040805182815290517fddc9c30275a04c48091f24199f9c405765de34d979d6847f5b9798a57232d2e59181900360200190a1505b565b610968610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff9081169116146109f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6109f9610844565b60006039819055603755603454604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b505161095e57600080fd5b610b5a610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610be357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610c4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806111236026913960400191505060405180910390fd5b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60395481565b303b1590565b600054610100900460ff1680610d025750610d02610ce3565b80610d10575060005460ff16155b610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061116a602e913960400191505060405180910390fd5b600054610100900460ff16158015610dcb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000610dd5610e7a565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610e7757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b3390565b600082820183811015610ef257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610ef283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610ff2565b600082610f4c57506000610ef5565b82820282848281610f5957fe5b0414610ef2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806111496021913960400191505060405180910390fd5b6000610ef283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506110a3565b6000818484111561109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611060578181015183820152602001611048565b50505050905090810190601f16801561108d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611060578181015183820152602001611048565b50600083858161111857fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a26469706673582212202d2728ac8d15aeda758292713912e62585711a488090193e05fe8b2d6f26932864736f6c634300060a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063e4fc6b6d11610066578063e4fc6b6d1461021f578063f2a75fe414610227578063f2fde38b1461022f578063f84b903e1461026257610100565b80638da5cb5b146101d4578063a717639c146101dc578063d13deb2f146101e4578063d4f26c51146101ec57610100565b806336e9332d116100d357806336e9332d1461018b57806338b0789d146101bc578063715018a6146101c45780637bbc101b146101cc57610100565b80630fb5a6b4146101055780631a39d8ef1461011f5780631f8d519d146101275780632911360a1461016e575b600080fd5b61010d61026a565b60408051918252519081900360200190f35b61010d610270565b61016c6004803603608081101561013d57600080fd5b508035906020810135906040810135906060013573ffffffffffffffffffffffffffffffffffffffff16610276565b005b61016c6004803603602081101561018457600080fd5b50356103ea565b61019361052e565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61010d61054a565b61016c6105ee565b61010d6106ee565b6101936106f4565b61010d610710565b610193610716565b61016c6004803603602081101561020257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610732565b61016c610844565b61016c610960565b61016c6004803603602081101561024557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b52565b61010d610cdd565b60365481565b60375481565b600054610100900460ff168061028f575061028f610ce3565b8061029d575060005460ff16155b6102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061116a602e913960400191505060405180910390fd5b600054610100900460ff1615801561035857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b610360610ce9565b6035859055603885905560368490556037839055603480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156103e357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b5050505050565b6103f2610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461047b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610483610844565b60006104ac426104a0603654603554610e7e90919063ffffffff16565b9063ffffffff610efb16565b90506036548111156104c157506036546104cb565b4260355560368190555b6104ee620151806104e2848463ffffffff610f3d16565b9063ffffffff610fb016565b6037819055600060395560408051918252517f1caad7d33cfc518fd9b724878731c04ca569952cfc1401483a2068b82a8cec2e9181900360200190a15050565b603a5473ffffffffffffffffffffffffffffffffffffffff1681565b60006035544210806105725750603a5473ffffffffffffffffffffffffffffffffffffffff16155b1561057f575060006105eb565b6000610598603954603754610efb90919063ffffffff16565b90506105b1603654603554610e7e90919063ffffffff16565b4210156105e8576105e56036546104e26037546105d960385442610efb90919063ffffffff16565b9063ffffffff610f3d16565b90505b90505b90565b6105f6610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff90811691161461067f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60335460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60355481565b60335473ffffffffffffffffffffffffffffffffffffffff1690565b60385481565b60345473ffffffffffffffffffffffffffffffffffffffff1681565b61073a610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff9081169116146107c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6107cb610844565b603a805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fe8d79c9831b9b25abf1785ab7027993c1cca203c617c418d316776b3c980ec8a9181900360200190a150565b600061084e61054a565b90508061085b575061095e565b42603855603954610872908263ffffffff610e7e16565b603955603454603a54604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108f457600080fd5b505af1158015610908573d6000803e3d6000fd5b505050506040513d602081101561091e57600080fd5b505161092957600080fd5b6040805182815290517fddc9c30275a04c48091f24199f9c405765de34d979d6847f5b9798a57232d2e59181900360200190a1505b565b610968610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff9081169116146109f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6109f9610844565b60006039819055603755603454604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9092169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b158015610a7d57600080fd5b505afa158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b505161095e57600080fd5b610b5a610e7a565b60335473ffffffffffffffffffffffffffffffffffffffff908116911614610be357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610c4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806111236026913960400191505060405180910390fd5b60335460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60395481565b303b1590565b600054610100900460ff1680610d025750610d02610ce3565b80610d10575060005460ff16155b610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061116a602e913960400191505060405180910390fd5b600054610100900460ff16158015610dcb57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116610100171660011790555b6000610dd5610e7a565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610e7757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50565b3390565b600082820183811015610ef257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610ef283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610ff2565b600082610f4c57506000610ef5565b82820282848281610f5957fe5b0414610ef2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806111496021913960400191505060405180910390fd5b6000610ef283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506110a3565b6000818484111561109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611060578181015183820152602001611048565b50505050905090810190601f16801561108d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361110c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611060578181015183820152602001611048565b50600083858161111857fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564a26469706673582212202d2728ac8d15aeda758292713912e62585711a488090193e05fe8b2d6f26932864736f6c634300060a0033
Deployed Bytecode Sourcemap
16819:4531:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17262:23;;;:::i;:::-;;;;;;;;;;;;;;;;17292:26;;;:::i;18303:400::-;;;;;;;;;;;;;;;;-1:-1:-1;18303:400:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;20836:511;;;;;;;;;;;;;;;;-1:-1:-1;20836:511:0;;:::i;17451:28::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19705:539;;;:::i;12226:148::-;;;:::i;17223:32::-;;;:::i;11584:79::-;;;:::i;17325:31::-;;;:::i;17183:33::-;;;:::i;18897:145::-;;;;;;;;;;;;;;;;-1:-1:-1;18897:145:0;;;;:::i;19139:437::-;;;:::i;20448:214::-;;;:::i;12529:244::-;;;;;;;;;;;;;;;;-1:-1:-1;12529:244:0;;;;:::i;17363:26::-;;;:::i;17262:23::-;;;;:::o;17292:26::-;;;;:::o;18303:400::-;9154:12;;;;;;;;:31;;;9170:15;:13;:15::i;:::-;9154:47;;;-1:-1:-1;9190:11:0;;;;9189:12;9154:47;9146:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9265:19;9288:12;;;;;;9287:13;9311:99;;;;9346:12;:19;;9380:18;9346:19;;;;;;9380:18;9361:4;9380:18;;;9311:99;18480:20:::1;:18;:20::i;:::-;18511:17;:38:::0;;;18560:16:::1;:37:::0;;;18608:8:::1;:20:::0;;;18639:11:::1;:21:::0;;;18671:10:::1;:24:::0;;;::::1;;::::0;::::1;;::::0;;9436:67;;;;9486:5;9471:20;;;;;;9436:67;18303:400;;;;;:::o;20836:511::-;11806:12;:10;:12::i;:::-;11796:6;;:22;:6;;;:22;;;11788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20921:12:::1;:10;:12::i;:::-;20944:16;20963:52;20999:15;20963:31;20985:8;;20963:17;;:21;;:31;;;;:::i;:::-;:35:::0;:52:::1;:35;:52;:::i;:::-;20944:71;;21041:8;;21030;:19;21026:173;;;-1:-1:-1::0;21077:8:0::1;::::0;21026:173:::1;;;21138:15;21118:17;:35:::0;21168:8:::1;:19:::0;;;21026:173:::1;21223:43;21259:6;21223:31;:17:::0;21245:8;21223:31:::1;:21;:31;:::i;:::-;:35:::0;:43:::1;:35;:43;:::i;:::-;21209:11;:57:::0;;;21291:1:::1;21277:11;:15:::0;21308:31:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;11866:1;20836:511:::0;:::o;17451:28::-;;;;;;:::o;19705:539::-;19763:7;19868:17;;19850:15;:35;:57;;;-1:-1:-1;19889:4:0;;:18;:4;:18;19850:57;19846:98;;;-1:-1:-1;19931:1:0;19924:8;;19846:98;19998:14;20015:28;20031:11;;20015;;:15;;:28;;;;:::i;:::-;19998:45;;20076:31;20098:8;;20076:17;;:21;;:31;;;;:::i;:::-;20058:15;:49;20054:159;;;20133:68;20192:8;;20133:54;20175:11;;20133:37;20153:16;;20133:15;:19;;:37;;;;:::i;:::-;:41;:54;:41;:54;:::i;:68::-;20124:77;;20054:159;20230:6;-1:-1:-1;19705:539:0;;:::o;12226:148::-;11806:12;:10;:12::i;:::-;11796:6;;:22;:6;;;:22;;;11788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12317:6:::1;::::0;12296:40:::1;::::0;12333:1:::1;::::0;12296:40:::1;12317:6;::::0;12296:40:::1;::::0;12333:1;;12296:40:::1;12347:6;:19:::0;;;::::1;::::0;;12226:148::o;17223:32::-;;;;:::o;11584:79::-;11649:6;;;;11584:79;:::o;17325:31::-;;;;:::o;17183:33::-;;;;;;:::o;18897:145::-;11806:12;:10;:12::i;:::-;11796:6;;:22;:6;;;:22;;;11788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18961:12:::1;:10;:12::i;:::-;18984:4;:14:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;19014:20:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;18897:145:::0;:::o;19139:437::-;19243:14;19260:18;:16;:18::i;:::-;19243:35;-1:-1:-1;19295:11:0;19291:50;;19323:7;;;19291:50;19415:15;19396:16;:34;19455:11;;:23;;19471:6;19455:23;:15;:23;:::i;:::-;19441:11;:37;19497:10;;19517:4;;19497:33;;;;;;:10;19517:4;;;19497:33;;;;;;;;;;;;:10;;;;;:19;;:33;;;;;;;;;;;;;;:10;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19497:33:0;19489:42;;;;;;19549:19;;;;;;;;;;;;;;;;;19139:437;;:::o;20448:214::-;11806:12;:10;:12::i;:::-;11796:6;;:22;:6;;;:22;;;11788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20502:12:::1;:10;:12::i;:::-;20539:1;20525:11;:15:::0;;;20551:11:::1;:15:::0;20585:10:::1;::::0;20617:35:::1;::::0;;;;;20646:4:::1;20617:35;::::0;::::1;::::0;;;20585:10:::1;::::0;;::::1;::::0;:19:::1;::::0;20605:10:::1;::::0;20585;;20617:20:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;20585:10;20617:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20617:35:0;20585:68:::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;20617:35:::1;::::0;20585:68;;;;;;;-1:-1:-1;20585:68:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20585:68:0;20577:77:::1;;;::::0;::::1;12529:244:::0;11806:12;:10;:12::i;:::-;11796:6;;:22;:6;;;:22;;;11788:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12618:22:::1;::::0;::::1;12610:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12720:6;::::0;12699:38:::1;::::0;::::1;::::0;;::::1;::::0;12720:6:::1;::::0;12699:38:::1;::::0;12720:6:::1;::::0;12699:38:::1;12748:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;12529:244::o;17363:26::-;;;;:::o;9603:568::-;10044:4;10111:17;10156:7;9603:568;:::o;11321:182::-;9154:12;;;;;;;;:31;;;9170:15;:13;:15::i;:::-;9154:47;;;-1:-1:-1;9190:11:0;;;;9189:12;9154:47;9146:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9265:19;9288:12;;;;;;9287:13;9311:99;;;;9346:12;:19;;9380:18;9346:19;;;;;;9380:18;9361:4;9380:18;;;9311:99;11375:17:::1;11395:12;:10;:12::i;:::-;11418:6;:18:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;11452:43:::1;::::0;11418:18;;-1:-1:-1;11418:18:0;-1:-1:-1;;11452:43:0::1;::::0;-1:-1:-1;;11452:43:0::1;9422:1;9440:14:::0;9436:67;;;9486:5;9471:20;;;;;;9436:67;11321:182;:::o;7530:106::-;7618:10;7530:106;:::o;2430:181::-;2488:7;2520:5;;;2544:6;;;;2536:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2602:1;-1:-1:-1;2430:181:0;;;;;:::o;2894:136::-;2952:7;2979:43;2983:1;2986;2979:43;;;;;;;;;;;;;;;;;:3;:43::i;3784:471::-;3842:7;4087:6;4083:47;;-1:-1:-1;4117:1:0;4110:8;;4083:47;4154:5;;;4158:1;4154;:5;:1;4178:5;;;;;:10;4170:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4731:132;4789:7;4816:39;4820:1;4823;4816:39;;;;;;;;;;;;;;;;;:3;:39::i;3333:192::-;3419:7;3455:12;3447:6;;;;3439:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3491:5:0;;;3333:192::o;5359:278::-;5445:7;5480:12;5473:5;5465:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5504:9;5520:1;5516;:5;;;;;;;5359:278;-1:-1:-1;;;;;5359:278:0:o
Swarm Source
ipfs://2d2728ac8d15aeda758292713912e62585711a488090193e05fe8b2d6f269328
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 33 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.