More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 593 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Dev Fee | 21682152 | 27 days ago | IN | 0 ETH | 0.00020517 | ||||
Withdraw All | 21426125 | 62 days ago | IN | 0 ETH | 0.00155601 | ||||
Withdraw All | 21426125 | 62 days ago | IN | 0 ETH | 0.00172828 | ||||
Emergency Withdr... | 16726237 | 721 days ago | IN | 0 ETH | 0.00107329 | ||||
Withdraw All | 16726169 | 721 days ago | IN | 0 ETH | 0.00101007 | ||||
Deposit All | 16726163 | 721 days ago | IN | 0 ETH | 0.00142126 | ||||
Transfer Dev Fee | 16726153 | 721 days ago | IN | 0 ETH | 0.00043601 | ||||
Deposit All | 16366035 | 771 days ago | IN | 0 ETH | 0.00120643 | ||||
Deposit | 16365976 | 771 days ago | IN | 0 ETH | 0.00294231 | ||||
Transfer Dev Fee | 16365855 | 771 days ago | IN | 0 ETH | 0.00047773 | ||||
Deposit | 15395532 | 910 days ago | IN | 0 ETH | 0.00046951 | ||||
Deposit | 15395532 | 910 days ago | IN | 0 ETH | 0.0010855 | ||||
Deposit | 15337284 | 919 days ago | IN | 0 ETH | 0.00077783 | ||||
Deposit | 14978319 | 977 days ago | IN | 0 ETH | 0.00483742 | ||||
Deposit All | 14665414 | 1028 days ago | IN | 0 ETH | 0.00349125 | ||||
Withdraw All | 14665393 | 1028 days ago | IN | 0 ETH | 0.00269549 | ||||
Deposit | 14665383 | 1028 days ago | IN | 0 ETH | 0.00377989 | ||||
Deposit | 14504603 | 1053 days ago | IN | 0 ETH | 0.00608068 | ||||
Withdraw All | 14504468 | 1053 days ago | IN | 0 ETH | 0.0081906 | ||||
Withdraw All | 14493229 | 1055 days ago | IN | 0 ETH | 0.00245885 | ||||
Withdraw All | 14466001 | 1059 days ago | IN | 0 ETH | 0.00313526 | ||||
Withdraw All | 14417331 | 1067 days ago | IN | 0 ETH | 0.001979 | ||||
Deposit | 14417327 | 1067 days ago | IN | 0 ETH | 0.00352768 | ||||
Deposit | 14402280 | 1069 days ago | IN | 0 ETH | 0.00262563 | ||||
Deposit All | 14401720 | 1069 days ago | IN | 0 ETH | 0.00283995 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TcoreVaultV1
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-19 */ /** *Submitted for verification at Etherscan.io on 2020-10-24 */ pragma solidity 0.6.12; /** * @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); } /** * @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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } /** * @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 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @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; } /* * @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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } 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; } uint256[50] private __gap; } /** * @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 OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() 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; } uint256[49] private __gap; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface INBUNIERC20 { /** * @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); event Log(string log); } // Tcore Vault distributes fees equally amongst staked pools // Have fun reading it. Hopefully it's bug-free. God bless. contract TcoreVaultV1 is OwnableUpgradeSafe { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of TCOREs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accTcorePerShare) - user.rewardDebt // // Whenever a user deposits or withdraws tokens to a pool. Here's what happens: // 1. The pool's `accTcorePerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 token; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. TCOREs to distribute per block. uint256 accTcorePerShare; // Accumulated TCOREs per share, times 1e12. See below. bool withdrawable; // Is this pool withdrawable? mapping(address => mapping(address => uint256)) allowance; } // The TCORE TOKEN! INBUNIERC20 public tcore; // Dev address. address public devaddr; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; //// pending rewards awaiting anyone to massUpdate uint256 public pendingRewards; uint256 public contractStartBlock; uint256 public epochCalculationStartBlock; uint256 public cumulativeRewardsSinceStart; uint256 public rewardsInThisEpoch; uint public epoch; // Returns fees generated since start of this contract function averageFeesPerBlockSinceStart() external view returns (uint averagePerBlock) { averagePerBlock = cumulativeRewardsSinceStart.add(rewardsInThisEpoch).div(block.number.sub(contractStartBlock)); } // Returns average fees in this epoch function averageFeesPerBlockEpoch() external view returns (uint256 averagePerBlock) { averagePerBlock = rewardsInThisEpoch.div(block.number.sub(epochCalculationStartBlock)); } // For easy graphing historical epoch rewards mapping(uint => uint256) public epochRewards; // Starts a new calculation epoch // Because average since start will not be accurate function startNewEpoch() public { require(epochCalculationStartBlock + 50000 < block.number, "New epoch not ready yet"); // About a week epochRewards[epoch] = rewardsInThisEpoch; cumulativeRewardsSinceStart = cumulativeRewardsSinceStart.add(rewardsInThisEpoch); rewardsInThisEpoch = 0; epochCalculationStartBlock = block.number; ++epoch; } event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event Approval(address indexed owner, address indexed spender, uint256 _pid, uint256 value); function initialize( INBUNIERC20 _tcore ) public initializer { OwnableUpgradeSafe.__Ownable_init(); DEV_FEE = 724; tcore = _tcore; devaddr = msg.sender; contractStartBlock = block.number; _superAdmin = msg.sender; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new token pool. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing TCORE governance consensus function add( uint256 _allocPoint, IERC20 _token, bool _withUpdate, bool _withdrawable ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].token != _token,"Error pool already added"); } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ token: _token, allocPoint: _allocPoint, accTcorePerShare: 0, withdrawable : _withdrawable }) ); } // Update the given pool's TCOREs allocation point. Can only be called by the owner. // Note contract owner is meant to be a governance contract allowing TCORE governance consensus function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Update the given pool's ability to withdraw tokens // Note contract owner is meant to be a governance contract allowing TCORE governance consensus function setPoolWithdrawable( uint256 _pid, bool _withdrawable ) public onlyOwner { poolInfo[_pid].withdrawable = _withdrawable; } // Sets the dev fee for this contract // defaults at 7.24% // Note contract owner is meant to be a governance contract allowing TCORE governance consensus uint16 DEV_FEE; function setDevFee(uint16 _DEV_FEE) public onlyOwner { require(_DEV_FEE <= 1000, 'Dev fee clamped at 10%'); DEV_FEE = _DEV_FEE; } uint256 pending_DEV_rewards; // View function to see pending TCOREs on frontend. function pendingTcore(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accTcorePerShare = pool.accTcorePerShare; return user.amount.mul(accTcorePerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; uint allRewards; for (uint256 pid = 0; pid < length; ++pid) { allRewards = allRewards.add(updatePool(pid)); } pendingRewards = pendingRewards.sub(allRewards); } // ---- // Function that adds pending rewards, called by the TCORE token. // ---- uint256 private tcoreBalance; function addPendingRewards(uint256 _) public { uint256 newRewards = tcore.balanceOf(address(this)).sub(tcoreBalance); if(newRewards > 0) { tcoreBalance = tcore.balanceOf(address(this)); // If there is no change the balance didn't change pendingRewards = pendingRewards.add(newRewards); rewardsInThisEpoch = rewardsInThisEpoch.add(newRewards); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal returns (uint256 tcoreRewardWhole) { PoolInfo storage pool = poolInfo[_pid]; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (tokenSupply == 0) { // avoids division by 0 errors return 0; } tcoreRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 tcoreRewardFee = tcoreRewardWhole.mul(DEV_FEE).div(10000); uint256 tcoreRewardToDistribute = tcoreRewardWhole.sub(tcoreRewardFee); pending_DEV_rewards = pending_DEV_rewards.add(tcoreRewardFee); pool.accTcorePerShare = pool.accTcorePerShare.add( tcoreRewardToDistribute.mul(1e12).div(tokenSupply) ); } function depositAll(uint256 _pid) external { PoolInfo storage pool = poolInfo[_pid]; deposit(_pid, pool.token.balanceOf(msg.sender)); } // Deposit tokens to TcoreVault for TCORE allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, pool, user, msg.sender); //Transfer in the amounts from user // save gas if(_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accTcorePerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Test coverage // [x] Does user get the deposited amount? // [x] Does user that deposited updated correcty? // [x] Does the depositor get its tokens decreased function depositFor(address depositFor, uint256 _pid, uint256 _amount) public { // requires no allowances PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][depositFor]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, pool, user, depositFor); // Update the balances of person that amount is being deposited for if(_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); // This is depositedFor address } user.rewardDebt = user.amount.mul(pool.accTcorePerShare).div(1e12); /// This is deposited for address emit Deposit(depositFor, _pid, _amount); } // Test coverage // [x] Does allowance update correctly? function setAllowanceForPoolToken(address spender, uint256 _pid, uint256 value) public { PoolInfo storage pool = poolInfo[_pid]; pool.allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender, _pid, value); } // Test coverage // [x] Does allowance decrease? // [x] Do you need allowance // [x] Withdraw to correct address function withdrawFrom(address owner, uint256 _pid, uint256 _amount) public{ PoolInfo storage pool = poolInfo[_pid]; require(pool.allowance[owner][msg.sender] >= _amount, "withdraw: insufficient allowance"); pool.allowance[owner][msg.sender] = pool.allowance[owner][msg.sender].sub(_amount); _withdraw(_pid, _amount, owner, msg.sender); } function withdrawAll(uint256 _pid) external { UserInfo storage user = userInfo[_pid][msg.sender]; withdraw(_pid, user.amount); } // Withdraw tokens from TcoreVault. function withdraw(uint256 _pid, uint256 _amount) public { _withdraw(_pid, _amount, msg.sender, msg.sender); } // Low level withdraw function function _withdraw(uint256 _pid, uint256 _amount, address from, address to) internal { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][from]; require(user.amount >= _amount, "withdraw: not good"); massUpdatePools(); updateAndPayOutPending(_pid, pool, user, from); // Update balances of from this is not withdrawal but claiming TCORE farmed if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.token.safeTransfer(address(to), _amount); } user.rewardDebt = user.amount.mul(pool.accTcorePerShare).div(1e12); emit Withdraw(to, _pid, _amount); } function updateAndPayOutPending(uint256 _pid, PoolInfo storage pool, UserInfo storage user, address from) internal { if(user.amount == 0) return; uint256 pending = user .amount .mul(pool.accTcorePerShare) .div(1e12) .sub(user.rewardDebt); if(pending > 0) { safeTcoreTransfer(from, pending); } } // function that let owner/governance contract // approve allowance for any token inside this contract // This means all future UNI like airdrops are covered // And at the same time allows us to give allowance to strategy contracts. // Upcoming cYFI etc vaults strategy contracts will use this function to manage and farm yield on value locked function setStrategyContractOrDistributionContractAllowance(address tokenAddress, uint256 _amount, address contractAddress) public onlySuperAdmin { require(isContract(contractAddress), "Recipent is not a smart contract, BAD"); require(block.number > contractStartBlock.add(95_000), "Governance setup grace period not over"); // about 2weeks IERC20(tokenAddress).approve(contractAddress, _amount); } function isContract(address addr) public returns (bool) { uint size; assembly { size := extcodesize(addr) } return size > 0; } // Withdraw without caring about rewards. EMERGENCY ONLY. // !Caution this will remove all your pending rewards! function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][msg.sender]; pool.token.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; // No mass update dont update pending rewards } // Safe tcore transfer function, just in case if rounding error causes pool to not have enough TCOREs. function safeTcoreTransfer(address _to, uint256 _amount) internal { if(_amount == 0) return; uint256 tcoreBal = tcore.balanceOf(address(this)); if (_amount > tcoreBal) { tcore.transfer(_to, tcoreBal); tcoreBalance = tcore.balanceOf(address(this)); } else { tcore.transfer(_to, _amount); tcoreBalance = tcore.balanceOf(address(this)); } //Avoids possible recursion loop transferDevFee(); } function transferDevFee() public { if(pending_DEV_rewards == 0) return; uint256 tcoreBal = tcore.balanceOf(address(this)); if (pending_DEV_rewards > tcoreBal) { tcore.transfer(devaddr, tcoreBal); tcoreBalance = tcore.balanceOf(address(this)); } else { tcore.transfer(devaddr, pending_DEV_rewards); tcoreBalance = tcore.balanceOf(address(this)); } pending_DEV_rewards = 0; } // Update dev address by the previous dev. // Note onlyOwner functions are meant for the governance contract // allowing TCORE governance token holders to do this functions. function setDevFeeReciever(address _devaddr) public onlyOwner { devaddr = _devaddr; } address private _superAdmin; event SuperAdminTransfered(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the current super admin */ function superAdmin() public view returns (address) { return _superAdmin; } /** * @dev Throws if called by any account other than the superAdmin */ modifier onlySuperAdmin() { require(_superAdmin == _msgSender(), "Super admin : caller is not super admin."); _; } // Assigns super admin to address 0, making it unreachable forever function burnSuperAdmin() public virtual onlySuperAdmin { emit SuperAdminTransfered(_superAdmin, address(0)); _superAdmin = address(0); } // Super admin can transfer its powers to another address function newSuperAdmin(address newOwner) public virtual onlySuperAdmin { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit SuperAdminTransfered(_superAdmin, newOwner); _superAdmin = newOwner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SuperAdminTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_","type":"uint256"}],"name":"addPendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"averageFeesPerBlockEpoch","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"averageFeesPerBlockSinceStart","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeRewardsSinceStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositFor","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochCalculationStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract INBUNIERC20","name":"_tcore","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"newSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTcore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"accTcorePerShare","type":"uint256"},{"internalType":"bool","name":"withdrawable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsInThisEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setAllowanceForPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_DEV_FEE","type":"uint16"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevFeeReciever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"setPoolWithdrawable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setStrategyContractOrDistributionContractAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startNewEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tcore","outputs":[{"internalType":"contract INBUNIERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061471e806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c8063643a81dc11610146578063c4014588116100c3578063d49e77cd11610087578063d49e77cd146109d3578063dbe0901f14610a07578063e18cb4fe14610a5f578063e2bbb15814610a91578063eded3fda14610ac9578063f2fde38b14610ae75761025e565b8063c40145881461086f578063c4d66de8146108dd578063c507aeaa14610921578063c6f678bd14610987578063c8ffb873146109b55761025e565b8063934eaa501161010a578063934eaa501461076c57806393f1a40b14610776578063958e2d31146107df5780639dbc2d901461080d578063a676860a1461082b5761025e565b8063643a81dc1461069857806364482f79146106cc578063715018a6146107105780638da5cb5b1461071a578063900cf0cf1461074e5761025e565b8063434339f3116101df5780635207cc0d116101a35780635207cc0d146105885780635312ea8e146105c25780635d577c18146105f0578063608c8d3a1461060e5780636145a5841461062c578063630b5ba11461068e5761025e565b8063434339f31461048e578063441a3e701461049857806349c5468d146104d05780634cf5fbf5146104ee5780634dc47d34146105465761025e565b806329575f6a1161022657806329575f6a146103865780632d6754e5146103ba5780633a0967cd146103fe5780633aab0a6214610456578063423d6fa0146104605761025e565b806303dec00914610263578063081e3eda146102815780631526fe271461029f578063162790551461030e57806317caf6f114610368575b600080fd5b61026b610b2b565b6040518082815260200191505060405180910390f35b610289610b5b565b6040518082815260200191505060405180910390f35b6102cb600480360360208110156102b557600080fd5b8101908080359060200190929190505050610b68565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b6103506004803603602081101561032457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bd2565b60405180821515815260200191505060405180910390f35b610370610be5565b6040518082815260200191505060405180910390f35b61038e610beb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103fc600480360360208110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c15565b005b6104546004803603606081101561041457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610d23565b005b61045e610f5b565b005b61048c6004803603602081101561047657600080fd5b8101908080359060200190929190505050611030565b005b61049661121a565b005b6104ce600480360360408110156104ae57600080fd5b810190808035906020019092919080359060200190929190505050611686565b005b6104d8611696565b6040518082815260200191505060405180910390f35b6105446004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061169c565b005b6105726004803603602081101561055c57600080fd5b810190808035906020019092919050505061182d565b6040518082815260200191505060405180910390f35b6105c06004803603604081101561059e57600080fd5b8101908080359060200190929190803515159060200190929190505050611845565b005b6105ee600480360360208110156105d857600080fd5b8101908080359060200190929190505050611949565b005b6105f8611ae2565b6040518082815260200191505060405180910390f35b610616611ae8565b6040518082815260200191505060405180910390f35b6106786004803603604081101561064257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aee565b6040518082815260200191505060405180910390f35b610696611bba565b005b6106a0611c1c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61070e600480360360608110156106e257600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611c42565b005b610718611d8e565b005b610722611f19565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610756611f43565b6040518082815260200191505060405180910390f35b610774611f49565b005b6107c26004803603604081101561078c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b7565b604051808381526020018281526020019250505060405180910390f35b61080b600480360360208110156107f557600080fd5b81019080803590602001909291905050506120e8565b005b61081561214e565b6040518082815260200191505060405180910390f35b61086d6004803603602081101561084157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b005b6108db6004803603606081101561088557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612385565b005b61091f600480360360208110156108f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125b1565b005b6109856004803603608081101561093757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291908035151590602001909291905050506127a1565b005b6109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050612a7f565b005b6109bd612b71565b6040518082815260200191505060405180910390f35b6109db612b77565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5d60048036036060811015610a1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612b9d565b005b610a8f60048036036020811015610a7557600080fd5b81019080803561ffff169060200190929190505050612cb2565b005b610ac760048036036040811015610aa757600080fd5b810190808035906020019092919080359060200190929190505050612e18565b005b610ad1612fa8565b6040518082815260200191505060405180910390f35b610b2960048036036020811015610afd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fae565b005b6000610b56610b45609e54436131be90919063ffffffff16565b60a05461320890919063ffffffff16565b905090565b6000609980549050905090565b60998181548110610b7557fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b609b5481565b600060a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c1d613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060998381548110610d3257fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b610ec7828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131be90919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f558383863361325a565b50505050565b4361c350609e540110610fd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b60a05460a2600060a15481526020019081526020016000208190555061100960a054609f546134cb90919063ffffffff16565b609f81905550600060a08190555043609e8190555060a16000815460010191905081905550565b600061110a60a554609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b81019080805190602001909291905050506131be90919063ffffffff16565b9050600081111561121657609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d60208110156111c857600080fd5b810190808051906020019092919050505060a5819055506111f481609c546134cb90919063ffffffff16565b609c8190555061120f8160a0546134cb90919063ffffffff16565b60a0819055505b5050565b600060a454141561122a57611684565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b810190808051906020019092919050505090508060a45411156114bc57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b505050506040513d60208110156113db57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b810190808051906020019092919050505060a58190555061167a565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660a4546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b505050506040513d602081101561159d57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b810190808051906020019092919050505060a5819055505b600060a481905550505b565b6116928282333361325a565b5050565b609d5481565b6000609983815481106116ab57fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611717611bba565b61172384838388613553565b600083111561179d5761177d3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166135cd909392919063ffffffff16565b6117948382600001546134cb90919063ffffffff16565b81600001819055505b6117cf64e8d4a510006117c18460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b60a26020528060005260406000206000915090505481565b61184d613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806099838154811061191d57fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b60006099828154811061195857fe5b906000526020600020906005020190508060030160009054906101000a900460ff166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146736026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a763382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137149092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b609e5481565b60a05481565b60008060998481548110611afe57fe5b906000526020600020906005020190506000609a600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050611baf8260010154611ba164e8d4a51000611b9385876000015461368e90919063ffffffff16565b61320890919063ffffffff16565b6131be90919063ffffffff16565b935050505092915050565b60006099805490509050600080600090505b82811015611bfc57611bef611be0826137b6565b836134cb90919063ffffffff16565b9150806001019050611bcc565b50611c1281609c546131be90919063ffffffff16565b609c819055505050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c4a613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611d1b57611d1a611bba565b5b611d6082611d5260998681548110611d2f57fe5b906000526020600020906005020160010154609b546131be90919063ffffffff16565b6134cb90919063ffffffff16565b609b819055508160998481548110611d7457fe5b906000526020600020906005020160010181905550505050565b611d96613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a15481565b611f51613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a3600060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b609a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000609a600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061214a828260000154611686565b5050565b600061218d612168609d54436131be90919063ffffffff16565b61217f60a054609f546134cb90919063ffffffff16565b61320890919063ffffffff16565b905090565b61219a613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145b16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a38060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238d613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b61243b81610bd2565b612490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806145d76025913960400191505060405180910390fd5b6124a862017318609d546134cb90919063ffffffff16565b43116124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146996026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257057600080fd5b505af1158015612584573d6000803e3d6000fd5b505050506040513d602081101561259a57600080fd5b810190808051906020019092919050505050505050565b600060019054906101000a900460ff16806125d057506125cf6139a6565b5b806125e6575060008054906101000a900460ff16155b61263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561268b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6126936139bd565b6102d460a360006101000a81548161ffff021916908361ffff16021790555081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043609d819055503360a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550801561279d5760008060016101000a81548160ff0219169083151502179055505b5050565b6127a9613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461286b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561287a57612879611bba565b5b6000609980549050905060005b8181101561297a578473ffffffffffffffffffffffffffffffffffffffff16609982815481106128b357fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561296f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b806001019050612887565b5061299085609b546134cb90919063ffffffff16565b609b81905550609960405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b600060998281548110612a8e57fe5b90600052602060002090600502019050612b6d828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b2d57600080fd5b505afa158015612b41573d6000803e3d6000fd5b505050506040513d6020811015612b5757600080fd5b8101908080519060200190929190505050612e18565b5050565b609f5481565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060998381548110612bac57fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b612cba613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff161115612df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b8060a360006101000a81548161ffff021916908361ffff16021790555050565b600060998381548110612e2757fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612e93611bba565b612e9f84838333613553565b6000831115612f1957612ef93330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166135cd909392919063ffffffff16565b612f108382600001546134cb90919063ffffffff16565b81600001819055505b612f4b64e8d4a51000612f3d8460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b609c5481565b612fb6613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613078576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145b16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061320083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613acb565b905092915050565b600061324a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b8b565b905092915050565b600033905090565b60006099858154811061326957fe5b906000526020600020906005020190508060030160009054906101000a900460ff166132e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146736026913960400191505060405180910390fd5b6000609a600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905084816000015410156133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b6133b6611bba565b6133c286838387613553565b600085111561343a576133e28582600001546131be90919063ffffffff16565b816000018190555061343983868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137149092919063ffffffff16565b5b61346c64e8d4a5100061345e8460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600082600001541415613565576135c7565b60006135af83600101546135a164e8d4a510006135938860020154886000015461368e90919063ffffffff16565b61320890919063ffffffff16565b6131be90919063ffffffff16565b905060008111156135c5576135c48282613c51565b5b505b50505050565b613688846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614075565b50505050565b6000808314156136a1576000905061370e565b60008284029050828482816136b257fe5b0414613709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146246021913960400191505060405180910390fd5b809150505b92915050565b6137b18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614075565b505050565b600080609983815481106137c657fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d602081101561388d57600080fd5b8101908080519060200190929190505050905060008114156138b4576000925050506139a1565b6138e1609b546138d38460010154609c5461368e90919063ffffffff16565b61320890919063ffffffff16565b9250600061392061271061391260a360009054906101000a900461ffff1661ffff168761368e90919063ffffffff16565b61320890919063ffffffff16565b9050600061393782866131be90919063ffffffff16565b905061394e8260a4546134cb90919063ffffffff16565b60a4819055506139946139818461397364e8d4a510008561368e90919063ffffffff16565b61320890919063ffffffff16565b85600201546134cb90919063ffffffff16565b8460020181905550505050505b919050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff16806139dc57506139db6139a6565b5b806139f2575060008054906101000a900460ff16155b613a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613a97576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613a9f6142c0565b613aa76143be565b8015613ac85760008060016101000a81548160ff0219169083151502179055505b50565b6000838311158290613b78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3d578082015181840152602081019050613b22565b50505050905090810190601f168015613b6a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613c37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613bfc578082015181840152602081019050613be1565b50505050905090810190601f168015613c295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c4357fe5b049050809150509392505050565b6000811415613c5f57614071565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d6020811015613d1457600080fd5b8101908080519060200190929190505050905080821115613ecd57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613dc257600080fd5b505af1158015613dd6573d6000803e3d6000fd5b505050506040513d6020811015613dec57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e8757600080fd5b505afa158015613e9b573d6000803e3d6000fd5b505050506040513d6020811015613eb157600080fd5b810190808051906020019092919050505060a581905550614067565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f6057600080fd5b505af1158015613f74573d6000803e3d6000fd5b505050506040513d6020811015613f8a57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b810190808051906020019092919050505060a5819055505b61406f61121a565b505b5050565b6140948273ffffffffffffffffffffffffffffffffffffffff16614565565b614106576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106141555780518252602082019150602081019050602083039250614132565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141b7576040519150601f19603f3d011682016040523d82523d6000602084013e6141bc565b606091505b509150915081614234576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b6000815111156142ba5780806020019051602081101561425357600080fd5b81019080805190602001909291905050506142b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806146bf602a913960400191505060405180910390fd5b5b50505050565b600060019054906101000a900460ff16806142df57506142de6139a6565b5b806142f5575060008054906101000a900460ff16155b61434a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561439a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156143bb5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806143dd57506143dc6139a6565b5b806143f3575060008054906101000a900460ff16155b614448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015614498576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60006144a2613252565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156145625760008060016101000a81548160ff0219169083151502179055505b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156145a757506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220af412c565996d0f3f0166e99722712d371b4a7981f297962d6d9d34da33419fb64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c8063643a81dc11610146578063c4014588116100c3578063d49e77cd11610087578063d49e77cd146109d3578063dbe0901f14610a07578063e18cb4fe14610a5f578063e2bbb15814610a91578063eded3fda14610ac9578063f2fde38b14610ae75761025e565b8063c40145881461086f578063c4d66de8146108dd578063c507aeaa14610921578063c6f678bd14610987578063c8ffb873146109b55761025e565b8063934eaa501161010a578063934eaa501461076c57806393f1a40b14610776578063958e2d31146107df5780639dbc2d901461080d578063a676860a1461082b5761025e565b8063643a81dc1461069857806364482f79146106cc578063715018a6146107105780638da5cb5b1461071a578063900cf0cf1461074e5761025e565b8063434339f3116101df5780635207cc0d116101a35780635207cc0d146105885780635312ea8e146105c25780635d577c18146105f0578063608c8d3a1461060e5780636145a5841461062c578063630b5ba11461068e5761025e565b8063434339f31461048e578063441a3e701461049857806349c5468d146104d05780634cf5fbf5146104ee5780634dc47d34146105465761025e565b806329575f6a1161022657806329575f6a146103865780632d6754e5146103ba5780633a0967cd146103fe5780633aab0a6214610456578063423d6fa0146104605761025e565b806303dec00914610263578063081e3eda146102815780631526fe271461029f578063162790551461030e57806317caf6f114610368575b600080fd5b61026b610b2b565b6040518082815260200191505060405180910390f35b610289610b5b565b6040518082815260200191505060405180910390f35b6102cb600480360360208110156102b557600080fd5b8101908080359060200190929190505050610b68565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b6103506004803603602081101561032457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bd2565b60405180821515815260200191505060405180910390f35b610370610be5565b6040518082815260200191505060405180910390f35b61038e610beb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103fc600480360360208110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c15565b005b6104546004803603606081101561041457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610d23565b005b61045e610f5b565b005b61048c6004803603602081101561047657600080fd5b8101908080359060200190929190505050611030565b005b61049661121a565b005b6104ce600480360360408110156104ae57600080fd5b810190808035906020019092919080359060200190929190505050611686565b005b6104d8611696565b6040518082815260200191505060405180910390f35b6105446004803603606081101561050457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061169c565b005b6105726004803603602081101561055c57600080fd5b810190808035906020019092919050505061182d565b6040518082815260200191505060405180910390f35b6105c06004803603604081101561059e57600080fd5b8101908080359060200190929190803515159060200190929190505050611845565b005b6105ee600480360360208110156105d857600080fd5b8101908080359060200190929190505050611949565b005b6105f8611ae2565b6040518082815260200191505060405180910390f35b610616611ae8565b6040518082815260200191505060405180910390f35b6106786004803603604081101561064257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aee565b6040518082815260200191505060405180910390f35b610696611bba565b005b6106a0611c1c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61070e600480360360608110156106e257600080fd5b810190808035906020019092919080359060200190929190803515159060200190929190505050611c42565b005b610718611d8e565b005b610722611f19565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610756611f43565b6040518082815260200191505060405180910390f35b610774611f49565b005b6107c26004803603604081101561078c57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b7565b604051808381526020018281526020019250505060405180910390f35b61080b600480360360208110156107f557600080fd5b81019080803590602001909291905050506120e8565b005b61081561214e565b6040518082815260200191505060405180910390f35b61086d6004803603602081101561084157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612192565b005b6108db6004803603606081101561088557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612385565b005b61091f600480360360208110156108f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125b1565b005b6109856004803603608081101561093757600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291908035151590602001909291905050506127a1565b005b6109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050612a7f565b005b6109bd612b71565b6040518082815260200191505060405180910390f35b6109db612b77565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a5d60048036036060811015610a1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612b9d565b005b610a8f60048036036020811015610a7557600080fd5b81019080803561ffff169060200190929190505050612cb2565b005b610ac760048036036040811015610aa757600080fd5b810190808035906020019092919080359060200190929190505050612e18565b005b610ad1612fa8565b6040518082815260200191505060405180910390f35b610b2960048036036020811015610afd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612fae565b005b6000610b56610b45609e54436131be90919063ffffffff16565b60a05461320890919063ffffffff16565b905090565b6000609980549050905090565b60998181548110610b7557fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b609b5481565b600060a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c1d613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060998381548110610d3257fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b610ec7828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131be90919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f558383863361325a565b50505050565b4361c350609e540110610fd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b60a05460a2600060a15481526020019081526020016000208190555061100960a054609f546134cb90919063ffffffff16565b609f81905550600060a08190555043609e8190555060a16000815460010191905081905550565b600061110a60a554609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110c157600080fd5b505afa1580156110d5573d6000803e3d6000fd5b505050506040513d60208110156110eb57600080fd5b81019080805190602001909291905050506131be90919063ffffffff16565b9050600081111561121657609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561119e57600080fd5b505afa1580156111b2573d6000803e3d6000fd5b505050506040513d60208110156111c857600080fd5b810190808051906020019092919050505060a5819055506111f481609c546134cb90919063ffffffff16565b609c8190555061120f8160a0546134cb90919063ffffffff16565b60a0819055505b5050565b600060a454141561122a57611684565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112b557600080fd5b505afa1580156112c9573d6000803e3d6000fd5b505050506040513d60208110156112df57600080fd5b810190808051906020019092919050505090508060a45411156114bc57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156113b157600080fd5b505af11580156113c5573d6000803e3d6000fd5b505050506040513d60208110156113db57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b810190808051906020019092919050505060a58190555061167a565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660a4546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b505050506040513d602081101561159d57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b810190808051906020019092919050505060a5819055505b600060a481905550505b565b6116928282333361325a565b5050565b609d5481565b6000609983815481106116ab57fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611717611bba565b61172384838388613553565b600083111561179d5761177d3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166135cd909392919063ffffffff16565b6117948382600001546134cb90919063ffffffff16565b81600001819055505b6117cf64e8d4a510006117c18460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b60a26020528060005260406000206000915090505481565b61184d613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806099838154811061191d57fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b60006099828154811061195857fe5b906000526020600020906005020190508060030160009054906101000a900460ff166119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146736026913960400191505060405180910390fd5b6000609a600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611a763382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137149092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b609e5481565b60a05481565b60008060998481548110611afe57fe5b906000526020600020906005020190506000609a600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050611baf8260010154611ba164e8d4a51000611b9385876000015461368e90919063ffffffff16565b61320890919063ffffffff16565b6131be90919063ffffffff16565b935050505092915050565b60006099805490509050600080600090505b82811015611bfc57611bef611be0826137b6565b836134cb90919063ffffffff16565b9150806001019050611bcc565b50611c1281609c546131be90919063ffffffff16565b609c819055505050565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c4a613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d0c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015611d1b57611d1a611bba565b5b611d6082611d5260998681548110611d2f57fe5b906000526020600020906005020160010154609b546131be90919063ffffffff16565b6134cb90919063ffffffff16565b609b819055508160998481548110611d7457fe5b906000526020600020906005020160010181905550505050565b611d96613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60a15481565b611f51613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a3600060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b609a602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b6000609a600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061214a828260000154611686565b5050565b600061218d612168609d54436131be90919063ffffffff16565b61217f60a054609f546134cb90919063ffffffff16565b61320890919063ffffffff16565b905090565b61219a613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461223f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145b16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a38060a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61238d613252565b73ffffffffffffffffffffffffffffffffffffffff1660a660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806145fc6028913960400191505060405180910390fd5b61243b81610bd2565b612490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806145d76025913960400191505060405180910390fd5b6124a862017318609d546134cb90919063ffffffff16565b43116124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146996026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561257057600080fd5b505af1158015612584573d6000803e3d6000fd5b505050506040513d602081101561259a57600080fd5b810190808051906020019092919050505050505050565b600060019054906101000a900460ff16806125d057506125cf6139a6565b5b806125e6575060008054906101000a900460ff16155b61263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561268b576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6126936139bd565b6102d460a360006101000a81548161ffff021916908361ffff16021790555081609760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033609860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043609d819055503360a660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550801561279d5760008060016101000a81548160ff0219169083151502179055505b5050565b6127a9613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461286b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b811561287a57612879611bba565b5b6000609980549050905060005b8181101561297a578473ffffffffffffffffffffffffffffffffffffffff16609982815481106128b357fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561296f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b806001019050612887565b5061299085609b546134cb90919063ffffffff16565b609b81905550609960405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b600060998281548110612a8e57fe5b90600052602060002090600502019050612b6d828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b2d57600080fd5b505afa158015612b41573d6000803e3d6000fd5b505050506040513d6020811015612b5757600080fd5b8101908080519060200190929190505050612e18565b5050565b609f5481565b609860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060998381548110612bac57fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b612cba613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff161115612df8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b8060a360006101000a81548161ffff021916908361ffff16021790555050565b600060998381548110612e2757fe5b906000526020600020906005020190506000609a600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612e93611bba565b612e9f84838333613553565b6000831115612f1957612ef93330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166135cd909392919063ffffffff16565b612f108382600001546134cb90919063ffffffff16565b81600001819055505b612f4b64e8d4a51000612f3d8460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b609c5481565b612fb6613252565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613078576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806145b16026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061320083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613acb565b905092915050565b600061324a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613b8b565b905092915050565b600033905090565b60006099858154811061326957fe5b906000526020600020906005020190508060030160009054906101000a900460ff166132e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806146736026913960400191505060405180910390fd5b6000609a600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905084816000015410156133ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b6133b6611bba565b6133c286838387613553565b600085111561343a576133e28582600001546131be90919063ffffffff16565b816000018190555061343983868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166137149092919063ffffffff16565b5b61346c64e8d4a5100061345e8460020154846000015461368e90919063ffffffff16565b61320890919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600082600001541415613565576135c7565b60006135af83600101546135a164e8d4a510006135938860020154886000015461368e90919063ffffffff16565b61320890919063ffffffff16565b6131be90919063ffffffff16565b905060008111156135c5576135c48282613c51565b5b505b50505050565b613688846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614075565b50505050565b6000808314156136a1576000905061370e565b60008284029050828482816136b257fe5b0414613709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806146246021913960400191505060405180910390fd5b809150505b92915050565b6137b18363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614075565b505050565b600080609983815481106137c657fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d602081101561388d57600080fd5b8101908080519060200190929190505050905060008114156138b4576000925050506139a1565b6138e1609b546138d38460010154609c5461368e90919063ffffffff16565b61320890919063ffffffff16565b9250600061392061271061391260a360009054906101000a900461ffff1661ffff168761368e90919063ffffffff16565b61320890919063ffffffff16565b9050600061393782866131be90919063ffffffff16565b905061394e8260a4546134cb90919063ffffffff16565b60a4819055506139946139818461397364e8d4a510008561368e90919063ffffffff16565b61320890919063ffffffff16565b85600201546134cb90919063ffffffff16565b8460020181905550505050505b919050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff16806139dc57506139db6139a6565b5b806139f2575060008054906101000a900460ff16155b613a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015613a97576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b613a9f6142c0565b613aa76143be565b8015613ac85760008060016101000a81548160ff0219169083151502179055505b50565b6000838311158290613b78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3d578082015181840152602081019050613b22565b50505050905090810190601f168015613b6a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008083118290613c37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613bfc578082015181840152602081019050613be1565b50505050905090810190601f168015613c295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613c4357fe5b049050809150509392505050565b6000811415613c5f57614071565b6000609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d6020811015613d1457600080fd5b8101908080519060200190929190505050905080821115613ecd57609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613dc257600080fd5b505af1158015613dd6573d6000803e3d6000fd5b505050506040513d6020811015613dec57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e8757600080fd5b505afa158015613e9b573d6000803e3d6000fd5b505050506040513d6020811015613eb157600080fd5b810190808051906020019092919050505060a581905550614067565b609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613f6057600080fd5b505af1158015613f74573d6000803e3d6000fd5b505050506040513d6020811015613f8a57600080fd5b810190808051906020019092919050505050609760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402557600080fd5b505afa158015614039573d6000803e3d6000fd5b505050506040513d602081101561404f57600080fd5b810190808051906020019092919050505060a5819055505b61406f61121a565b505b5050565b6140948273ffffffffffffffffffffffffffffffffffffffff16614565565b614106576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e74726163740081525060200191505060405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b602083106141555780518252602082019150602081019050602083039250614132565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141b7576040519150601f19603f3d011682016040523d82523d6000602084013e6141bc565b606091505b509150915081614234576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525060200191505060405180910390fd5b6000815111156142ba5780806020019051602081101561425357600080fd5b81019080805190602001909291905050506142b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806146bf602a913960400191505060405180910390fd5b5b50505050565b600060019054906101000a900460ff16806142df57506142de6139a6565b5b806142f5575060008054906101000a900460ff16155b61434a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff16159050801561439a576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b80156143bb5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff16806143dd57506143dc6139a6565b5b806143f3575060008054906101000a900460ff16155b614448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614645602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015614498576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b60006144a2613252565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156145625760008060016101000a81548160ff0219169083151502179055505b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156145a757506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65645769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220af412c565996d0f3f0166e99722712d371b4a7981f297962d6d9d34da33419fb64736f6c634300060c0033
Deployed Bytecode Sourcemap
31105:17156:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33533:189;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35016:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32632:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44946:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32870:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47369:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47052:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42178:382;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33930:398;;;:::i;:::-;;38249:419;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46371:484;;;:::i;:::-;;42769:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33003:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40879:827;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33781:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36737:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45243:488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33043:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33140:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37360:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37814:295;;;:::i;:::-;;32522:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36205:364;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27642:148;;;:::i;:::-;;27000:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33180:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47772:160;;;:::i;:::-;;32711:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;42568:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33266:216;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48003:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44508:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34720:288;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35287:717;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39765:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33091:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32574:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41781:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37107:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39991:699;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32965:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27945:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33533:189;33592:23;33646:68;33669:44;33686:26;;33669:12;:16;;:44;;;;:::i;:::-;33646:18;;:22;;:68;;;;:::i;:::-;33628:86;;33533:189;:::o;35016:95::-;35061:7;35088:8;:15;;;;35081:22;;35016:95;:::o;32632:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44946:158::-;44996:4;45013:9;45064:4;45052:17;45044:25;;45095:1;45088:4;:8;45081:15;;;44946:158;;;:::o;32870:30::-;;;;:::o;47369:89::-;47412:7;47439:11;;;;;;;;;;;47432:18;;47369:89;:::o;47052:99::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47135:8:::1;47125:7;;:18;;;;;;;;;;;;;;;;;;47052:99:::0;:::o;42178:382::-;42265:21;42289:8;42298:4;42289:14;;;;;;;;;;;;;;;;;;42265:38;;42359:7;42322:4;:14;;:21;42337:5;42322:21;;;;;;;;;;;;;;;:33;42344:10;42322:33;;;;;;;;;;;;;;;;:44;;42314:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42450:46;42488:7;42450:4;:14;;:21;42465:5;42450:21;;;;;;;;;;;;;;;:33;42472:10;42450:33;;;;;;;;;;;;;;;;:37;;:46;;;;:::i;:::-;42414:4;:14;;:21;42429:5;42414:21;;;;;;;;;;;;;;;:33;42436:10;42414:33;;;;;;;;;;;;;;;:82;;;;42507:43;42517:4;42523:7;42532:5;42539:10;42507:9;:43::i;:::-;42178:382;;;;:::o;33930:398::-;34018:12;34010:5;33981:26;;:34;:49;33973:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34107:18;;34085:12;:19;34098:5;;34085:19;;;;;;;;;;;:40;;;;34166:51;34198:18;;34166:27;;:31;;:51;;;;:::i;:::-;34136:27;:81;;;;34249:1;34228:18;:22;;;;34290:12;34261:26;:41;;;;34315:5;;34313:7;;;;;;;;;;;33930:398::o;38249:419::-;38305:18;38326:48;38361:12;;38326:5;;;;;;;;;;;:15;;;38350:4;38326:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;:48;;;;:::i;:::-;38305:69;;38403:1;38390:10;:14;38387:274;;;38436:5;;;;;;;;;;;:15;;;38460:4;38436:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38421:12;:45;;;;38549:30;38568:10;38549:14;;:18;;:30;;;;:::i;:::-;38532:14;:47;;;;38615:34;38638:10;38615:18;;:22;;:34;;;;:::i;:::-;38594:18;:55;;;;38387:274;38249:419;;:::o;46371:484::-;46441:1;46418:19;;:24;46415:36;;;46444:7;;46415:36;46461:16;46480:5;;;;;;;;;;;:15;;;46504:4;46480:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:49;;46547:8;46525:19;;:30;46521:293;;;46572:5;;;;;;;;;;;:14;;;46587:7;;;;;;;;;;;46596:8;46572:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46635:5;;;;;;;;;;;:15;;;46659:4;46635:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46620:12;:45;;;;46521:293;;;46698:5;;;;;;;;;;;:14;;;46713:7;;;;;;;;;;;46722:19;;46698:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46772:5;;;;;;;;;;;:15;;;46796:4;46772:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46757:12;:45;;;;46521:293;46846:1;46824:19;:23;;;;46371:484;;:::o;42769:123::-;42836:48;42846:4;42852:7;42861:10;42873;42836:9;:48::i;:::-;42769:123;;:::o;33003:33::-;;;;:::o;40879:827::-;41003:21;41027:8;41036:4;41027:14;;;;;;;;;;;;;;;;;;41003:38;;41052:21;41076:8;:14;41085:4;41076:14;;;;;;;;;;;:26;41091:10;41076:26;;;;;;;;;;;;;;;41052:50;;41115:17;:15;:17::i;:::-;41201:52;41224:4;41230;41236;41242:10;41201:22;:52::i;:::-;41347:1;41337:7;:11;41334:200;;;41365:72;41401:10;41422:4;41429:7;41365:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;41466:24;41482:7;41466:4;:11;;;:15;;:24;;;;:::i;:::-;41452:4;:11;;:38;;;;41334:200;41564:48;41607:4;41564:38;41580:4;:21;;;41564:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;41546:4;:15;;:66;;;;41682:4;41670:10;41662:34;;;41688:7;41662:34;;;;;;;;;;;;;;;;;;40879:827;;;;;:::o;33781:44::-;;;;;;;;;;;;;;;;;:::o;36737:167::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36883:13:::1;36853:8;36862:4;36853:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;36737:167:::0;;:::o;45243:488::-;45302:21;45326:8;45335:4;45326:14;;;;;;;;;;;;;;;;;;45302:38;;45359:4;:17;;;;;;;;;;;;45351:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45430:21;45454:8;:14;45463:4;45454:14;;;;;;;;;;;:26;45469:10;45454:26;;;;;;;;;;;;;;;45430:50;;45491:57;45523:10;45536:4;:11;;;45491:4;:10;;;;;;;;;;;;:23;;;;:57;;;;;:::i;:::-;45594:4;45582:10;45564:48;;;45600:4;:11;;;45564:48;;;;;;;;;;;;;;;;;;45637:1;45623:4;:11;;:15;;;;45667:1;45649:4;:15;;:19;;;;45243:488;;;:::o;33043:41::-;;;;:::o;33140:33::-;;;;:::o;37360:371::-;37461:7;37486:21;37510:8;37519:4;37510:14;;;;;;;;;;;;;;;;;;37486:38;;37535:21;37559:8;:14;37568:4;37559:14;;;;;;;;;;;:21;37574:5;37559:21;;;;;;;;;;;;;;;37535:45;;37591:24;37618:4;:21;;;37591:48;;37659:64;37707:4;:15;;;37659:43;37697:4;37659:33;37675:16;37659:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;37652:71;;;;;37360:371;;;;:::o;37814:295::-;37859:14;37876:8;:15;;;;37859:32;;37902:15;37933:11;37947:1;37933:15;;37928:114;37956:6;37950:3;:12;37928:114;;;37999:31;38014:15;38025:3;38014:10;:15::i;:::-;37999:10;:14;;:31;;;;:::i;:::-;37986:44;;37964:5;;;;;37928:114;;;;38071:30;38090:10;38071:14;;:18;;:30;;;;:::i;:::-;38054:14;:47;;;;37814:295;;:::o;32522:24::-;;;;;;;;;;;;;:::o;36205:364::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36337:11:::1;36333:61;;;36365:17;:15;:17::i;:::-;36333:61;36424:87;36489:11;36424:46;36444:8;36453:4;36444:14;;;;;;;;;;;;;;;;;;:25;;;36424:15;;:19;;:46;;;;:::i;:::-;:50;;:87;;;;:::i;:::-;36406:15;:105;;;;36550:11;36522:8;36531:4;36522:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;36205:364:::0;;;:::o;27642:148::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27749:1:::1;27712:40;;27733:6;;;;;;;;;;;27712:40;;;;;;;;;;;;27780:1;27763:6;;:19;;;;;;;;;;;;;;;;;;27642:148::o:0;27000:79::-;27038:7;27065:6;;;;;;;;;;;27058:13;;27000:79;:::o;33180:17::-;;;;:::o;47772:160::-;47615:12;:10;:12::i;:::-;47600:27;;:11;;;;;;;;;;;:27;;;47592:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47886:1:::1;47844:45;;47865:11;;;;;;;;;;;47844:45;;;;;;;;;;;;47922:1;47900:11;;:24;;;;;;;;;;;;;;;;;;47772:160::o:0;32711:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42568:151::-;42623:21;42647:8;:14;42656:4;42647:14;;;;;;;;;;;:26;42662:10;42647:26;;;;;;;;;;;;;;;42623:50;;42684:27;42693:4;42699;:11;;;42684:8;:27::i;:::-;42568:151;;:::o;33266:216::-;33330:20;33381:93;33437:36;33454:18;;33437:12;:16;;:36;;;;:::i;:::-;33381:51;33413:18;;33381:27;;:31;;:51;;;;:::i;:::-;:55;;:93;;;;:::i;:::-;33363:111;;33266:216;:::o;48003:255::-;47615:12;:10;:12::i;:::-;47600:27;;:11;;;;;;;;;;;:27;;;47592:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48113:1:::1;48093:22;;:8;:22;;;;48085:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48208:8;48174:43;;48195:11;;;;;;;;;;;48174:43;;;;;;;;;;;;48242:8;48228:11;;:22;;;;;;;;;;;;;;;;;;48003:255:::0;:::o;44508:430::-;47615:12;:10;:12::i;:::-;47600:27;;:11;;;;;;;;;;;:27;;;47592:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44673:27:::1;44684:15;44673:10;:27::i;:::-;44665:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44776:30;44799:6;44776:18;;:22;;:30;;;;:::i;:::-;44761:12;:45;44753:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44883:12;44876:28;;;44905:15;44922:7;44876:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;44508:430:::0;;;:::o;34720:288::-;23464:12;;;;;;;;;;;:31;;;;23480:15;:13;:15::i;:::-;23464:31;:47;;;;23500:11;;;;;;;;;;23499:12;23464:47;23456:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:19;23594:12;;;;;;;;;;;23593:13;23571:35;;23617:14;23613:83;;;23657:4;23642:12;;:19;;;;;;;;;;;;;;;;;;23684:4;23670:11;;:18;;;;;;;;;;;;;;;;;;23613:83;34806:35:::1;:33;:35::i;:::-;34862:3;34852:7;;:13;;;;;;;;;;;;;;;;;;34884:6;34876:5;;:14;;;;;;;;;;;;;;;;;;34911:10;34901:7;;:20;;;;;;;;;;;;;;;;;;34953:12;34932:18;:33;;;;34990:10;34976:11;;:24;;;;;;;;;;;;;;;;;;23718:14:::0;23714:57;;;23758:5;23743:12;;:20;;;;;;;;;;;;;;;;;;23714:57;34720:288;;:::o;35287:717::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35449:11:::1;35445:61;;;35477:17;:15;:17::i;:::-;35445:61;35518:14;35535:8;:15;;;;35518:32;;35566:11;35561:135;35589:6;35583:3;:12;35561:135;;;35650:6;35627:29;;:8;35636:3;35627:13;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;:29;;;;35619:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35597:5;;;;;35561:135;;;;35726:32;35746:11;35726:15;;:19;;:32;;;;:::i;:::-;35708:15;:50;;;;35773:8;35801:184;;;;;;;;35836:6;35801:184;;;;;;35873:11;35801:184;;;;35921:1;35801:184;;;;35956:13;35801:184;;;;::::0;35773:223:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27282:1;35287:717:::0;;;;:::o;39765:158::-;39819:21;39843:8;39852:4;39843:14;;;;;;;;;;;;;;;;;;39819:38;;39868:47;39876:4;39882;:10;;;;;;;;;;;;:20;;;39903:10;39882:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39868:7;:47::i;:::-;39765:158;;:::o;33091:42::-;;;;:::o;32574:22::-;;;;;;;;;;;;;:::o;41781:256::-;41879:21;41903:8;41912:4;41903:14;;;;;;;;;;;;;;;;;;41879:38;;41966:5;41928:4;:14;;:26;41943:10;41928:26;;;;;;;;;;;;;;;:35;41955:7;41928:35;;;;;;;;;;;;;;;:43;;;;42008:7;41987:42;;41996:10;41987:42;;;42017:4;42023:5;41987:42;;;;;;;;;;;;;;;;;;;;;;;;41781:256;;;;:::o;37107:152::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37191:4:::1;37179:8;:16;;;;37171:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;37243:8;37233:7;;:18;;;;;;;;;;;;;;;;;;37107:152:::0;:::o;39991:699::-;40057:21;40081:8;40090:4;40081:14;;;;;;;;;;;;;;;;;;40057:38;;40106:21;40130:8;:14;40139:4;40130:14;;;;;;;;;;;:26;40145:10;40130:26;;;;;;;;;;;;;;;40106:50;;40169:17;:15;:17::i;:::-;40255:52;40278:4;40284;40290;40296:10;40255:22;:52::i;:::-;40399:1;40389:7;:11;40386:168;;;40417:72;40453:10;40474:4;40481:7;40417:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;40518:24;40534:7;40518:4;:11;;;:15;;:24;;;;:::i;:::-;40504:4;:11;;:38;;;;40386:168;40584:48;40627:4;40584:38;40600:4;:21;;;40584:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;40566:4;:15;;:66;;;;40668:4;40656:10;40648:34;;;40674:7;40648:34;;;;;;;;;;;;;;;;;;39991:699;;;;:::o;32965:29::-;;;;:::o;27945:244::-;27222:12;:10;:12::i;:::-;27212:22;;:6;;;;;;;;;;;:22;;;27204:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28054:1:::1;28034:22;;:8;:22;;;;28026:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28144:8;28115:38;;28136:6;;;;;;;;;;;28115:38;;;;;;;;;;;;28173:8;28164:6;;:17;;;;;;;;;;;;;;;;;;27945:244:::0;:::o;4099:136::-;4157:7;4184:43;4188:1;4191;4184:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4177:50;;4099:136;;;;:::o;5912:132::-;5970:7;5997:39;6001:1;6004;5997:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5990:46;;5912:132;;;;:::o;25387:106::-;25440:15;25475:10;25468:17;;25387:106;:::o;42936:779::-;43032:21;43056:8;43065:4;43056:14;;;;;;;;;;;;;;;;;;43032:38;;43089:4;:17;;;;;;;;;;;;43081:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43160:21;43184:8;:14;43193:4;43184:14;;;;;;;;;;;:20;43199:4;43184:20;;;;;;;;;;;;;;;43160:44;;43238:7;43223:4;:11;;;:22;;43215:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43281:17;:15;:17::i;:::-;43309:47;43332:4;43339;43345;43351;43309:22;:47::i;:::-;43458:1;43448:7;:11;43445:141;;;43490:24;43506:7;43490:4;:11;;;:15;;:24;;;;:::i;:::-;43476:4;:11;;:38;;;;43529:45;43561:2;43566:7;43529:4;:10;;;;;;;;;;;;:23;;;;:45;;;;;:::i;:::-;43445:141;43614:48;43657:4;43614:38;43630:4;:21;;;43614:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;43596:4;:15;;:66;;;;43693:4;43689:2;43680:27;;;43699:7;43680:27;;;;;;;;;;;;;;;;;;42936:779;;;;;;:::o;3643:181::-;3701:7;3721:9;3737:1;3733;:5;3721:17;;3762:1;3757;:6;;3749:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3815:1;3808:8;;;3643:181;;;;:::o;43723:408::-;43869:1;43854:4;:11;;;:16;43851:28;;;43872:7;;43851:28;43891:15;43909:125;44018:4;:15;;;43909:90;43994:4;43909:66;43953:4;:21;;;43909:4;:25;;;:43;;:66;;;;:::i;:::-;:84;;:90;;;;:::i;:::-;:108;;:125;;;;:::i;:::-;43891:143;;44060:1;44050:7;:11;44047:75;;;44078:32;44096:4;44102:7;44078:17;:32::i;:::-;44047:75;43723:408;;;;;;:::o;11496:205::-;11597:96;11617:5;11647:27;;;11676:4;11682:2;11686:5;11624:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11597:19;:96::i;:::-;11496:205;;;;:::o;4973:471::-;5031:7;5281:1;5276;:6;5272:47;;;5306:1;5299:8;;;;5272:47;5331:9;5347:1;5343;:5;5331:17;;5376:1;5371;5367;:5;;;;;;:10;5359:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5435:1;5428:8;;;4973:471;;;;;:::o;11311:177::-;11394:86;11414:5;11444:23;;;11469:2;11473:5;11421:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11394:19;:86::i;:::-;11311:177;;;:::o;38744:1013::-;38796:24;38833:21;38857:8;38866:4;38857:14;;;;;;;;;;;;;;;;;;38833:38;;38884:19;38906:4;:10;;;;;;;;;;;;:20;;;38935:4;38906:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38884:57;;38971:1;38956:11;:16;38952:88;;;39027:1;39020:8;;;;;;38952:88;39069:249;39302:15;;39069:138;39191:4;:15;;;39069:14;;:121;;:138;;;;:::i;:::-;:232;;:249;;;;:::i;:::-;39050:268;;39389:22;39414:40;39448:5;39414:29;39435:7;;;;;;;;;;;39414:29;;:16;:20;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;39389:65;;39465:31;39499:36;39520:14;39499:16;:20;;:36;;;;:::i;:::-;39465:70;;39570:39;39594:14;39570:19;;:23;;:39;;;;:::i;:::-;39548:19;:61;;;;39646:101;39686:50;39724:11;39686:33;39714:4;39686:23;:27;;:33;;;;:::i;:::-;:37;;:50;;;;:::i;:::-;39646:4;:21;;;:25;;:101;;;;:::i;:::-;39622:4;:21;;:125;;;;38744:1013;;;;;;;;:::o;23865:508::-;23912:4;24259:12;24282:4;24259:28;;24294:10;24340:4;24328:17;24322:23;;24366:1;24360:2;:7;24353:14;;;;23865:508;:::o;26578:129::-;23464:12;;;;;;;;;;;:31;;;;23480:15;:13;:15::i;:::-;23464:31;:47;;;;23500:11;;;;;;;;;;23499:12;23464:47;23456:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:19;23594:12;;;;;;;;;;;23593:13;23571:35;;23617:14;23613:83;;;23657:4;23642:12;;:19;;;;;;;;;;;;;;;;;;23684:4;23670:11;;:18;;;;;;;;;;;;;;;;;;23613:83;26636:26:::1;:24;:26::i;:::-;26673;:24;:26::i;:::-;23718:14:::0;23714:57;;;23758:5;23743:12;;:20;;;;;;;;;;;;;;;;;;23714:57;26578:129;:::o;4530:192::-;4616:7;4649:1;4644;:6;;4652:12;4636:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4676:9;4692:1;4688;:5;4676:17;;4713:1;4706:8;;;4530:192;;;;;:::o;6532:345::-;6618:7;6717:1;6713;:5;6720:12;6705:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6744:9;6760:1;6756;:5;;;;;;6744:17;;6868:1;6861:8;;;6532:345;;;;;:::o;45847:516::-;45938:1;45927:7;:12;45924:24;;;45941:7;;45924:24;45960:16;45979:5;;;;;;;;;;;:15;;;46003:4;45979:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45960:49;;46034:8;46024:7;:18;46020:265;;;46059:5;;;;;;;;;;;:14;;;46074:3;46079:8;46059:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46118:5;;;;;;;;;;;:15;;;46142:4;46118:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46103:12;:45;;;;46020:265;;;46183:5;;;;;;;;;;;:14;;;46198:3;46203:7;46183:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46241:5;;;;;;;;;;;:15;;;46265:4;46241:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46226:12;:45;;;;46020:265;46339:16;:14;:16::i;:::-;45847:516;;;;:::o;13355:1115::-;13960:27;13968:5;13960:25;;;:27::i;:::-;13952:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14097:12;14111:23;14146:5;14138:19;;14158:4;14138:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14096:67;;;;14182:7;14174:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14263:1;14243:10;:17;:21;14239:224;;;14385:10;14374:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14366:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14239:224;13355:1115;;;;:::o;25308:69::-;23464:12;;;;;;;;;;;:31;;;;23480:15;:13;:15::i;:::-;23464:31;:47;;;;23500:11;;;;;;;;;;23499:12;23464:47;23456:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:19;23594:12;;;;;;;;;;;23593:13;23571:35;;23617:14;23613:83;;;23657:4;23642:12;;:19;;;;;;;;;;;;;;;;;;23684:4;23670:11;;:18;;;;;;;;;;;;;;;;;;23613:83;23718:14;23714:57;;;23758:5;23743:12;;:20;;;;;;;;;;;;;;;;;;23714:57;25308:69;:::o;26715:202::-;23464:12;;;;;;;;;;;:31;;;;23480:15;:13;:15::i;:::-;23464:31;:47;;;;23500:11;;;;;;;;;;23499:12;23464:47;23456:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23571:19;23594:12;;;;;;;;;;;23593:13;23571:35;;23617:14;23613:83;;;23657:4;23642:12;;:19;;;;;;;;;;;;;;;;;;23684:4;23670:11;;:18;;;;;;;;;;;;;;;;;;23613:83;26787:17:::1;26807:12;:10;:12::i;:::-;26787:32;;26839:9;26830:6;;:18;;;;;;;;;;;;;;;;;;26897:9;26864:43;;26893:1;26864:43;;;;;;;;;;;;23704:1;23718:14:::0;23714:57;;;23758:5;23743:12;;:20;;;;;;;;;;;;;;;;;;23714:57;26715:202;:::o;8795:619::-;8855:4;9117:16;9144:19;9166:66;9144:88;;;;9335:7;9323:20;9311:32;;9375:11;9363:8;:23;;:42;;;;;9402:3;9390:15;;:8;:15;;9363:42;9355:51;;;;8795:619;;;:::o
Swarm Source
ipfs://af412c565996d0f3f0166e99722712d371b4a7981f297962d6d9d34da33419fb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $27.6 | 334.2949 | $9,225.11 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.