Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11434222 | 1016 days 19 hrs ago | IN | Create: TokenSetsRebalancingInteractiveAdapter | 0 ETH | 0.05330682 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TokenSetsRebalancingInteractiveAdapter
Compiler Version
v0.7.3+commit.9bfce1f6
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; import { ERC20 } from "../../shared/ERC20.sol"; import { SafeERC20 } from "../../shared/SafeERC20.sol"; import { TokenAmount } from "../../shared/Structs.sol"; import { ERC20ProtocolAdapter } from "../../adapters/ERC20ProtocolAdapter.sol"; import { InteractiveAdapter } from "../InteractiveAdapter.sol"; import { RebalancingSetIssuanceModule } from "../../interfaces/RebalancingSetIssuanceModule.sol"; import { RebalancingSetToken } from "../../interfaces/RebalancingSetToken.sol"; import { SetToken } from "../../interfaces/SetToken.sol"; /** * @title Interactive adapter for TokenSets. * @dev Implementation of InteractiveAdapter abstract contract. * @author Igor Sobolev <[email protected]> */ contract TokenSetsRebalancingInteractiveAdapter is InteractiveAdapter, ERC20ProtocolAdapter { using SafeERC20 for ERC20; address internal constant TRANSFER_PROXY = 0x882d80D3a191859d64477eb78Cca46599307ec1C; address internal constant ISSUANCE_MODULE = 0xcEDA8318522D348f1d1aca48B24629b8FbF09020; /** * @notice Deposits tokens to the TokenSet. * @param tokenAmounts Array with one element - TokenAmount struct with * underlying tokens addresses, underlying tokens amounts to be deposited, and amount types. * @param data ABI-encoded additional parameters: * - set - rebalancing set address. * @return tokensToBeWithdrawn Array with one element - rebalancing set address. * @dev Implementation of InteractiveAdapter function. */ function deposit(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable override returns (address[] memory tokensToBeWithdrawn) { address setToken = abi.decode(data, (address)); tokensToBeWithdrawn = new address[](1); tokensToBeWithdrawn[0] = setToken; uint256 amount = getSetAmountAndApprove(setToken, tokenAmounts); try RebalancingSetIssuanceModule(ISSUANCE_MODULE).issueRebalancingSet( setToken, amount, true ) {} catch Error(string memory reason) { //solhint-disable-previous-line no-empty-blocks revert(reason); } catch { revert("TSRIA: issue fail"); } } /** * @notice Withdraws tokens from the TokenSet. * @param tokenAmounts Array with one element - TokenAmount struct with * rebalancing set address, rebalancing set amount to be redeemed, and amount type. * @return tokensToBeWithdrawn Array with set token components. * @dev Implementation of InteractiveAdapter function. */ function withdraw(TokenAmount[] calldata tokenAmounts, bytes calldata) external payable override returns (address[] memory tokensToBeWithdrawn) { require(tokenAmounts.length == 1, "TSRIA: should be 1 tokenAmount"); address token = tokenAmounts[0].token; uint256 amount = getAbsoluteAmountWithdraw(tokenAmounts[0]); address setToken = RebalancingSetToken(token).currentSet(); amount = amount - (amount % RebalancingSetToken(token).naturalUnit()); tokensToBeWithdrawn = SetToken(setToken).getComponents(); try RebalancingSetIssuanceModule(ISSUANCE_MODULE).redeemRebalancingSet(token, amount, true) {} catch Error( // solhint-disable-previous-line no-empty-blocks string memory reason ) { revert(reason); } catch { revert("TSRIA: redeem fail"); } } function getSetAmountAndApprove(address setToken, TokenAmount[] calldata tokenAmounts) internal returns (uint256) { uint256 length = tokenAmounts.length; uint256 amount; uint256[] memory absoluteAmounts = new uint256[](length); for (uint256 i = 0; i < length; i++) { amount = getAbsoluteAmountDeposit(tokenAmounts[i]); absoluteAmounts[i] = amount; ERC20(tokenAmounts[i].token).safeApproveMax(TRANSFER_PROXY, amount, "TSRIA"); } RebalancingSetToken rebalancingSetToken = RebalancingSetToken(setToken); uint256 rebalancingUnit = rebalancingSetToken.getUnits()[0]; uint256 rebalancingNaturalUnit = rebalancingSetToken.naturalUnit(); address baseSetToken = rebalancingSetToken.currentSet(); uint256[] memory baseUnits = SetToken(baseSetToken).getUnits(); uint256 baseNaturalUnit = SetToken(baseSetToken).naturalUnit(); uint256 setAmount = type(uint256).max; uint256 tempAmount; for (uint256 i = 0; i < length; i++) { tempAmount = mul_( mul_(absoluteAmounts[i] / baseUnits[i] - 1, baseNaturalUnit) / rebalancingUnit, rebalancingNaturalUnit ); if (tempAmount < setAmount) { setAmount = tempAmount; } } return setAmount; } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; import { ERC20 } from "../shared/ERC20.sol"; import { ProtocolAdapter } from "./ProtocolAdapter.sol"; /** * @title Adapter for any protocol with ERC20 interface. * @dev Implementation of ProtocolAdapter abstract contract. * @author Igor Sobolev <[email protected]> */ contract ERC20ProtocolAdapter is ProtocolAdapter { /** * @return Amount of tokens held by the given account. * @dev Implementation of ProtocolAdapter abstract contract function. */ function getBalance(address token, address account) public view override returns (int256) { return int256(ERC20(token).balanceOf(account)); } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; /** * @title Protocol adapter abstract contract. * @dev adapterType(), tokenType(), and getBalance() functions MUST be implemented. * @author Igor Sobolev <[email protected]> */ abstract contract ProtocolAdapter { /** * @dev MUST return amount and type of the given token * locked on the protocol by the given account. */ function getBalance(address token, address account) public virtual returns (int256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; import { ProtocolAdapter } from "../adapters/ProtocolAdapter.sol"; import { TokenAmount, AmountType } from "../shared/Structs.sol"; import { ERC20 } from "../shared/ERC20.sol"; /** * @title Base contract for interactive protocol adapters. * @dev deposit() and withdraw() functions MUST be implemented * as well as all the functions from ProtocolAdapter abstract contract. * @author Igor Sobolev <[email protected]> */ abstract contract InteractiveAdapter is ProtocolAdapter { uint256 internal constant DELIMITER = 1e18; address internal constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /** * @dev The function must deposit assets to the protocol. * @return MUST return assets to be sent back to the `msg.sender`. */ function deposit(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable virtual returns (address[] memory); /** * @dev The function must withdraw assets from the protocol. * @return MUST return assets to be sent back to the `msg.sender`. */ function withdraw(TokenAmount[] calldata tokenAmounts, bytes calldata data) external payable virtual returns (address[] memory); function getAbsoluteAmountDeposit(TokenAmount calldata tokenAmount) internal view virtual returns (uint256) { address token = tokenAmount.token; uint256 amount = tokenAmount.amount; AmountType amountType = tokenAmount.amountType; require( amountType == AmountType.Relative || amountType == AmountType.Absolute, "IA: bad amount type" ); if (amountType == AmountType.Relative) { require(amount <= DELIMITER, "IA: bad amount"); uint256 balance; if (token == ETH) { balance = address(this).balance; } else { balance = ERC20(token).balanceOf(address(this)); } if (amount == DELIMITER) { return balance; } else { return mul_(balance, amount) / DELIMITER; } } else { return amount; } } function getAbsoluteAmountWithdraw(TokenAmount calldata tokenAmount) internal virtual returns (uint256) { address token = tokenAmount.token; uint256 amount = tokenAmount.amount; AmountType amountType = tokenAmount.amountType; require( amountType == AmountType.Relative || amountType == AmountType.Absolute, "IA: bad amount type" ); if (amountType == AmountType.Relative) { require(amount <= DELIMITER, "IA: bad amount"); int256 balanceSigned = getBalance(token, address(this)); uint256 balance = balanceSigned > 0 ? uint256(balanceSigned) : uint256(-balanceSigned); if (amount == DELIMITER) { return balance; } else { return mul_(balance, amount) / DELIMITER; } } else { return amount; } } function mul_(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "IA: mul overflow"); return c; } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; /** * @dev RebalancingSetIssuanceModule contract interface. * The RebalancingSetIssuanceModule contract is available here * github.com/SetProtocol/set-protocol-contracts/blob/master/contracts/core/modules/RebalancingSetIssuanceModule.sol. */ interface RebalancingSetIssuanceModule { function issueRebalancingSet( address, uint256, bool ) external; function redeemRebalancingSet( address, uint256, bool ) external; }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; /** * @dev RebalancingSetToken contract interface. * The RebalancingSetToken contract is available here * github.com/SetProtocol/set-protocol-contracts/blob/master/contracts/core/tokens/RebalancingSetTokenV3.sol. */ interface RebalancingSetToken { function currentSet() external view returns (address); function getUnits() external view returns (uint256[] memory); function naturalUnit() external view returns (uint256); function unitShares() external view returns (uint256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; /** * @dev SetToken contract interface. * The SetToken contract is available here * github.com/SetProtocol/set-protocol-contracts/blob/master/contracts/core/tokens/SetToken.sol. */ interface SetToken { function getUnits() external view returns (uint256[] memory); function naturalUnit() external view returns (uint256); function getComponents() external view returns (address[] memory); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; interface ERC20 { function approve(address, uint256) external returns (bool); function transfer(address, uint256) external returns (bool); function transferFrom( address, address, uint256 ) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address) external view returns (uint256); function allowance(address, address) external view returns (uint256); }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; import "./ERC20.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token contract * returns false). Tokens that return no value (and instead revert or throw on failure) * are also supported, non-reverting calls are assumed to be successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { function safeTransfer( ERC20 token, address to, uint256 value, string memory location ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value), "transfer", location ); } function safeTransferFrom( ERC20 token, address from, address to, uint256 value, string memory location ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value), "transferFrom", location ); } function safeApprove( ERC20 token, address spender, uint256 value, string memory location ) internal { require( (value == 0) || (token.allowance(address(this), spender) == 0), string(abi.encodePacked("SafeERC20: bad approve call from ", location)) ); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value), "approve", location ); } function safeApproveMax( ERC20 token, address spender, uint256 amount, string memory location ) internal { uint256 allowance = ERC20(token).allowance(address(this), spender); if (allowance < amount) { if (allowance > 0) { safeApprove(token, spender, 0, location); } safeApprove(token, spender, type(uint256).max, location); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), * relaxing the requirement on the return value: the return value is optional * (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * @param location Location of the call (for debug). */ function callOptionalReturn( ERC20 token, bytes memory data, string memory functionName, string memory location ) private { // We need to perform a low level call here, to bypass Solidity's return data size checking // mechanism, since we're implementing it ourselves. // We implement two-steps call as callee is a contract is a responsibility of a caller. // 1. The call itself is made, and success asserted // 2. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require( success, string(abi.encodePacked("SafeERC20: ", functionName, " failed in ", location)) ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), string( abi.encodePacked("SafeERC20: ", functionName, " returned false in ", location) ) ); } } }
// Copyright (C) 2020 Zerion Inc. <https://zerion.io> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. // // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.7.3; pragma experimental ABIEncoderV2; // The struct consists of TokenBalanceMeta structs for // (base) token and its underlying tokens (if any). struct FullTokenBalance { TokenBalanceMeta base; TokenBalanceMeta[] underlying; } // The struct consists of TokenBalance struct // with token address and absolute amount // and ERC20Metadata struct with ERC20-style metadata. // NOTE: 0xEeee...EEeE address is used for ETH. struct TokenBalanceMeta { TokenBalance tokenBalance; ERC20Metadata erc20metadata; } // The struct consists of ERC20-style token metadata. struct ERC20Metadata { string name; string symbol; uint8 decimals; } // The struct consists of protocol adapter's name // and array of TokenBalance structs // with token addresses and absolute amounts. struct AdapterBalance { bytes32 protocolAdapterName; TokenBalance[] tokenBalances; } // The struct consists of token address // and its absolute amount (may be negative). struct TokenBalance { address token; int256 amount; } // The struct consists of token address, // and price per full share (1e18). struct Component { address token; int256 rate; } //=============================== Interactive Adapters Structs ==================================== // The struct consists of array of actions, // array of inputs, fee, required outputs, // and salt parameter used to protect users from double spends. struct TransactionData { Action[] actions; TokenAmount[] inputs; Fee fee; AbsoluteTokenAmount[] requiredOutputs; uint256 salt; } // The struct consists of name of the protocol adapter, // action type, array of token amounts, // and some additional data (depends on the protocol). struct Action { bytes32 protocolAdapterName; ActionType actionType; TokenAmount[] tokenAmounts; bytes data; } // The struct consists of token address // its amount and amount type. struct TokenAmount { address token; uint256 amount; AmountType amountType; } // The struct consists of fee share // and beneficiary address. struct Fee { uint256 share; address beneficiary; } // The struct consists of token address // and its absolute amount. struct AbsoluteTokenAmount { address token; uint256 amount; } enum ActionType { None, Deposit, Withdraw } enum AmountType { None, Relative, Absolute }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "istanbul", "libraries": { "": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum AmountType","name":"amountType","type":"uint8"}],"internalType":"struct TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"deposit","outputs":[{"internalType":"address[]","name":"tokensToBeWithdrawn","type":"address[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"getBalance","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"enum AmountType","name":"amountType","type":"uint8"}],"internalType":"struct TokenAmount[]","name":"tokenAmounts","type":"tuple[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"withdraw","outputs":[{"internalType":"address[]","name":"tokensToBeWithdrawn","type":"address[]"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611abe806100206000396000f3fe6080604052600436106100345760003560e01c806328ffb83d14610039578063387b817414610062578063d4fac45d14610075575b600080fd5b61004c610047366004611351565b6100a2565b604051610059919061170f565b60405180910390f35b61004c610070366004611351565b61023c565b34801561008157600080fd5b5061009561009036600461127b565b61053d565b6040516100599190611769565b606060006100b283850185611243565b6040805160018082528183019092529192506020808301908036833701905050915080826000815181106100e257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006101298288886105eb565b6040517f1cc0bd6100000000000000000000000000000000000000000000000000000000815290915073ceda8318522d348f1d1aca48b24629b8fbf0902090631cc0bd619061018190859085906001906004016116df565b600060405180830381600087803b15801561019b57600080fd5b505af19250505080156101ac575060015b610232576101b8611981565b806101c35750610200565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f790611868565b5050949350505050565b606060018414610278576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906118d6565b60008585600081811061028757fe5b61029d9260206060909202019081019150611243565b905060006102bc878760008181106102b157fe5b905060600201610a99565b905060008273ffffffffffffffffffffffffffffffffffffffff166330b866276040518163ffffffff1660e01b815260040160206040518083038186803b15801561030657600080fd5b505afa15801561031a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033e919061125f565b90508273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be91906114d0565b82816103c657fe5b06820391508073ffffffffffffffffffffffffffffffffffffffff166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561041157600080fd5b505afa158015610425573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261046b91908101906112b3565b6040517fda89a7b100000000000000000000000000000000000000000000000000000000815290945073ceda8318522d348f1d1aca48b24629b8fbf090209063da89a7b1906104c390869086906001906004016116df565b600060405180830381600087803b1580156104dd57600080fd5b505af19250505080156104ee575060015b610532576104fa611981565b806101c357506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f790611831565b505050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190610592908590600401611671565b60206040518083038186803b1580156105aa57600080fd5b505afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e291906114d0565b90505b92915050565b6000818160608267ffffffffffffffff8111801561060857600080fd5b50604051908082528060200260200182016040528015610632578160200160208202803683370190505b50905060005b8381101561070c5761065a87878381811061064f57fe5b905060600201610beb565b92508282828151811061066957fe5b60200260200101818152505061070473882d80d3a191859d64477eb78cca46599307ec1c846040518060400160405280600581526020017f54535249410000000000000000000000000000000000000000000000000000008152508a8a868181106106d057fe5b6106e69260206060909202019081019150611243565b73ffffffffffffffffffffffffffffffffffffffff16929190610de8565b600101610638565b50600087905060008173ffffffffffffffffffffffffffffffffffffffff1663027aa9f56040518163ffffffff1660e01b815260040160006040518083038186803b15801561075a57600080fd5b505afa15801561076e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526107b4919081019061140d565b6000815181106107c057fe5b6020026020010151905060008273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a91906114d0565b905060008373ffffffffffffffffffffffffffffffffffffffff166330b866276040518163ffffffff1660e01b815260040160206040518083038186803b15801561089457600080fd5b505afa1580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc919061125f565b905060608173ffffffffffffffffffffffffffffffffffffffff1663027aa9f56040518163ffffffff1660e01b815260040160006040518083038186803b15801561091657600080fd5b505afa15801561092a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610970919081019061140d565b905060008273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906114d0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b8b811015610a8557610a6f88610a616001888581518110610a3657fe5b60200260200101518e8681518110610a4a57fe5b602002602001015181610a5957fe5b040387610edf565b81610a6857fe5b0488610edf565b915082821015610a7d578192505b600101610a19565b50909e9d5050505050505050505050505050565b600080610aa96020840184611243565b905060208301356000610ac260608601604087016114b1565b90506001816002811115610ad257fe5b1480610ae957506002816002811115610ae757fe5b145b610b1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117c3565b6001816002811115610b2d57fe5b1415610bdc57670de0b6b3a7640000821115610b75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117fa565b6000610b81843061053d565b90506000808213610b955781600003610b97565b815b9050670de0b6b3a7640000841415610bb5579450610be69350505050565b670de0b6b3a7640000610bc88286610edf565b81610bcf57fe5b0495505050505050610be6565b509150610be69050565b919050565b600080610bfb6020840184611243565b905060208301356000610c1460608601604087016114b1565b90506001816002811115610c2457fe5b1480610c3b57506002816002811115610c3957fe5b145b610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117c3565b6001816002811115610c7f57fe5b1415610bdc57670de0b6b3a7640000821115610cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117fa565b600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610d02575047610da7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190610d54903090600401611671565b60206040518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da491906114d0565b90505b670de0b6b3a7640000831415610dc2579350610be692505050565b670de0b6b3a7640000610dd58285610edf565b81610ddc57fe5b04945050505050610be6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff86169063dd62ed3e90610e3f9030908890600401611692565b60206040518083038186803b158015610e5757600080fd5b505afa158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906114d0565b905082811015610ed8578015610eac57610eac8585600085610f33565b610ed885857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85610f33565b5050505050565b600082610eee575060006105e5565b82820282848281610efb57fe5b04146105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79061189f565b811580610fe157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90610f8f9030908790600401611692565b60206040518083038186803b158015610fa757600080fd5b505afa158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf91906114d0565b155b81604051602001610ff29190611504565b60405160208183030381529060405290611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b506110f28463095ea7b360e01b85856040516024016110599291906116b9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250846110f8565b50505050565b600060608573ffffffffffffffffffffffffffffffffffffffff168560405161112191906114e8565b6000604051808303816000865af19150503d806000811461115e576040519150601f19603f3d011682016040523d82523d6000602084013e611163565b606091505b509150915081848460405160200161117c9291906115f0565b604051602081830303815290604052906111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b5080511561123b57808060200190518101906111df9190611491565b84846040516020016111f292919061156f565b60405160208183030381529060405290611239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b505b505050505050565b600060208284031215611254578081fd5b81356105e281611a63565b600060208284031215611270578081fd5b81516105e281611a63565b6000806040838503121561128d578081fd5b823561129881611a63565b915060208301356112a881611a63565b809150509250929050565b600060208083850312156112c5578182fd5b825167ffffffffffffffff8111156112db578283fd5b8301601f810185136112eb578283fd5b80516112fe6112f982611931565b61190d565b818152838101908385018584028501860189101561131a578687fd5b8694505b8385101561134557805161133181611a63565b83526001949094019391850191850161131e565b50979650505050505050565b60008060008060408587031215611366578182fd5b843567ffffffffffffffff8082111561137d578384fd5b818701915087601f830112611390578384fd5b81358181111561139e578485fd5b8860206060830285010111156113b2578485fd5b6020928301965094509086013590808211156113cc578384fd5b818701915087601f8301126113df578384fd5b8135818111156113ed578485fd5b8860208285010111156113fe578485fd5b95989497505060200194505050565b6000602080838503121561141f578182fd5b825167ffffffffffffffff811115611435578283fd5b8301601f81018513611445578283fd5b80516114536112f982611931565b818152838101908385018584028501860189101561146f578687fd5b8694505b83851015611345578051835260019490940193918501918501611473565b6000602082840312156114a2578081fd5b815180151581146105e2578182fd5b6000602082840312156114c2578081fd5b8135600381106105e2578182fd5b6000602082840312156114e1578081fd5b5051919050565b600082516114fa81846020870161194f565b9190910192915050565b60007f5361666545524332303a2062616420617070726f76652063616c6c2066726f6d82527f20000000000000000000000000000000000000000000000000000000000000006020830152825161156281602185016020870161194f565b9190910160210192915050565b60007f5361666545524332303a20000000000000000000000000000000000000000000825283516115a781600b85016020880161194f565b7f2072657475726e65642066616c736520696e2000000000000000000000000000600b9184019182015283516115e481601e84016020880161194f565b01601e01949350505050565b60007f5361666545524332303a200000000000000000000000000000000000000000008252835161162881600b85016020880161194f565b7f206661696c656420696e20000000000000000000000000000000000000000000600b91840191820152835161166581601684016020880161194f565b01601601949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561175d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161172b565b50909695505050505050565b90815260200190565b600060208252825180602084015261179181604085016020870161194f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526013908201527f49413a2062616420616d6f756e74207479706500000000000000000000000000604082015260600190565b6020808252600e908201527f49413a2062616420616d6f756e74000000000000000000000000000000000000604082015260600190565b60208082526012908201527f54535249413a2072656465656d206661696c0000000000000000000000000000604082015260600190565b60208082526011908201527f54535249413a206973737565206661696c000000000000000000000000000000604082015260600190565b60208082526010908201527f49413a206d756c206f766572666c6f7700000000000000000000000000000000604082015260600190565b6020808252601e908201527f54535249413a2073686f756c64206265203120746f6b656e416d6f756e740000604082015260600190565b60405181810167ffffffffffffffff8111828210171561192957fe5b604052919050565b600067ffffffffffffffff82111561194557fe5b5060209081020190565b60005b8381101561196a578181015183820152602001611952565b838111156110f25750506000910152565b60e01c90565b600060443d101561199157611a60565b600481823e6308c379a06119a5825161197b565b146119af57611a60565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff81602484011181841117156119fd5750505050611a60565b82840192508251915080821115611a175750505050611a60565b503d83016020828401011115611a2f57505050611a60565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b90565b73ffffffffffffffffffffffffffffffffffffffff81168114611a8557600080fd5b5056fea264697066735822122087c366b1af5040a0bced20f4d36cb8f89ee51b86586b5bd1d59092a210d68f3b64736f6c63430007030033
Deployed Bytecode
0x6080604052600436106100345760003560e01c806328ffb83d14610039578063387b817414610062578063d4fac45d14610075575b600080fd5b61004c610047366004611351565b6100a2565b604051610059919061170f565b60405180910390f35b61004c610070366004611351565b61023c565b34801561008157600080fd5b5061009561009036600461127b565b61053d565b6040516100599190611769565b606060006100b283850185611243565b6040805160018082528183019092529192506020808301908036833701905050915080826000815181106100e257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060006101298288886105eb565b6040517f1cc0bd6100000000000000000000000000000000000000000000000000000000815290915073ceda8318522d348f1d1aca48b24629b8fbf0902090631cc0bd619061018190859085906001906004016116df565b600060405180830381600087803b15801561019b57600080fd5b505af19250505080156101ac575060015b610232576101b8611981565b806101c35750610200565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b60405180910390fd5b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f790611868565b5050949350505050565b606060018414610278576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906118d6565b60008585600081811061028757fe5b61029d9260206060909202019081019150611243565b905060006102bc878760008181106102b157fe5b905060600201610a99565b905060008273ffffffffffffffffffffffffffffffffffffffff166330b866276040518163ffffffff1660e01b815260040160206040518083038186803b15801561030657600080fd5b505afa15801561031a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033e919061125f565b90508273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b15801561038657600080fd5b505afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be91906114d0565b82816103c657fe5b06820391508073ffffffffffffffffffffffffffffffffffffffff166399d50d5d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561041157600080fd5b505afa158015610425573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261046b91908101906112b3565b6040517fda89a7b100000000000000000000000000000000000000000000000000000000815290945073ceda8318522d348f1d1aca48b24629b8fbf090209063da89a7b1906104c390869086906001906004016116df565b600060405180830381600087803b1580156104dd57600080fd5b505af19250505080156104ee575060015b610532576104fa611981565b806101c357506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f790611831565b505050949350505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190610592908590600401611671565b60206040518083038186803b1580156105aa57600080fd5b505afa1580156105be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e291906114d0565b90505b92915050565b6000818160608267ffffffffffffffff8111801561060857600080fd5b50604051908082528060200260200182016040528015610632578160200160208202803683370190505b50905060005b8381101561070c5761065a87878381811061064f57fe5b905060600201610beb565b92508282828151811061066957fe5b60200260200101818152505061070473882d80d3a191859d64477eb78cca46599307ec1c846040518060400160405280600581526020017f54535249410000000000000000000000000000000000000000000000000000008152508a8a868181106106d057fe5b6106e69260206060909202019081019150611243565b73ffffffffffffffffffffffffffffffffffffffff16929190610de8565b600101610638565b50600087905060008173ffffffffffffffffffffffffffffffffffffffff1663027aa9f56040518163ffffffff1660e01b815260040160006040518083038186803b15801561075a57600080fd5b505afa15801561076e573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526107b4919081019061140d565b6000815181106107c057fe5b6020026020010151905060008273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b15801561081257600080fd5b505afa158015610826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084a91906114d0565b905060008373ffffffffffffffffffffffffffffffffffffffff166330b866276040518163ffffffff1660e01b815260040160206040518083038186803b15801561089457600080fd5b505afa1580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc919061125f565b905060608173ffffffffffffffffffffffffffffffffffffffff1663027aa9f56040518163ffffffff1660e01b815260040160006040518083038186803b15801561091657600080fd5b505afa15801561092a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610970919081019061140d565b905060008273ffffffffffffffffffffffffffffffffffffffff166342a7cfd56040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906114d0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000805b8b811015610a8557610a6f88610a616001888581518110610a3657fe5b60200260200101518e8681518110610a4a57fe5b602002602001015181610a5957fe5b040387610edf565b81610a6857fe5b0488610edf565b915082821015610a7d578192505b600101610a19565b50909e9d5050505050505050505050505050565b600080610aa96020840184611243565b905060208301356000610ac260608601604087016114b1565b90506001816002811115610ad257fe5b1480610ae957506002816002811115610ae757fe5b145b610b1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117c3565b6001816002811115610b2d57fe5b1415610bdc57670de0b6b3a7640000821115610b75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117fa565b6000610b81843061053d565b90506000808213610b955781600003610b97565b815b9050670de0b6b3a7640000841415610bb5579450610be69350505050565b670de0b6b3a7640000610bc88286610edf565b81610bcf57fe5b0495505050505050610be6565b509150610be69050565b919050565b600080610bfb6020840184611243565b905060208301356000610c1460608601604087016114b1565b90506001816002811115610c2457fe5b1480610c3b57506002816002811115610c3957fe5b145b610c71576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117c3565b6001816002811115610c7f57fe5b1415610bdc57670de0b6b3a7640000821115610cc7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f7906117fa565b600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610d02575047610da7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516906370a0823190610d54903090600401611671565b60206040518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da491906114d0565b90505b670de0b6b3a7640000831415610dc2579350610be692505050565b670de0b6b3a7640000610dd58285610edf565b81610ddc57fe5b04945050505050610be6565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff86169063dd62ed3e90610e3f9030908890600401611692565b60206040518083038186803b158015610e5757600080fd5b505afa158015610e6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8f91906114d0565b905082811015610ed8578015610eac57610eac8585600085610f33565b610ed885857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85610f33565b5050505050565b600082610eee575060006105e5565b82820282848281610efb57fe5b04146105e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79061189f565b811580610fe157506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90610f8f9030908790600401611692565b60206040518083038186803b158015610fa757600080fd5b505afa158015610fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdf91906114d0565b155b81604051602001610ff29190611504565b60405160208183030381529060405290611039576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b506110f28463095ea7b360e01b85856040516024016110599291906116b9565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060400160405280600781526020017f617070726f766500000000000000000000000000000000000000000000000000815250846110f8565b50505050565b600060608573ffffffffffffffffffffffffffffffffffffffff168560405161112191906114e8565b6000604051808303816000865af19150503d806000811461115e576040519150601f19603f3d011682016040523d82523d6000602084013e611163565b606091505b509150915081848460405160200161117c9291906115f0565b604051602081830303815290604052906111c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b5080511561123b57808060200190518101906111df9190611491565b84846040516020016111f292919061156f565b60405160208183030381529060405290611239576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101f79190611772565b505b505050505050565b600060208284031215611254578081fd5b81356105e281611a63565b600060208284031215611270578081fd5b81516105e281611a63565b6000806040838503121561128d578081fd5b823561129881611a63565b915060208301356112a881611a63565b809150509250929050565b600060208083850312156112c5578182fd5b825167ffffffffffffffff8111156112db578283fd5b8301601f810185136112eb578283fd5b80516112fe6112f982611931565b61190d565b818152838101908385018584028501860189101561131a578687fd5b8694505b8385101561134557805161133181611a63565b83526001949094019391850191850161131e565b50979650505050505050565b60008060008060408587031215611366578182fd5b843567ffffffffffffffff8082111561137d578384fd5b818701915087601f830112611390578384fd5b81358181111561139e578485fd5b8860206060830285010111156113b2578485fd5b6020928301965094509086013590808211156113cc578384fd5b818701915087601f8301126113df578384fd5b8135818111156113ed578485fd5b8860208285010111156113fe578485fd5b95989497505060200194505050565b6000602080838503121561141f578182fd5b825167ffffffffffffffff811115611435578283fd5b8301601f81018513611445578283fd5b80516114536112f982611931565b818152838101908385018584028501860189101561146f578687fd5b8694505b83851015611345578051835260019490940193918501918501611473565b6000602082840312156114a2578081fd5b815180151581146105e2578182fd5b6000602082840312156114c2578081fd5b8135600381106105e2578182fd5b6000602082840312156114e1578081fd5b5051919050565b600082516114fa81846020870161194f565b9190910192915050565b60007f5361666545524332303a2062616420617070726f76652063616c6c2066726f6d82527f20000000000000000000000000000000000000000000000000000000000000006020830152825161156281602185016020870161194f565b9190910160210192915050565b60007f5361666545524332303a20000000000000000000000000000000000000000000825283516115a781600b85016020880161194f565b7f2072657475726e65642066616c736520696e2000000000000000000000000000600b9184019182015283516115e481601e84016020880161194f565b01601e01949350505050565b60007f5361666545524332303a200000000000000000000000000000000000000000008252835161162881600b85016020880161194f565b7f206661696c656420696e20000000000000000000000000000000000000000000600b91840191820152835161166581601684016020880161194f565b01601601949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93909316835260208301919091521515604082015260600190565b6020808252825182820181905260009190848201906040850190845b8181101561175d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161172b565b50909695505050505050565b90815260200190565b600060208252825180602084015261179181604085016020870161194f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526013908201527f49413a2062616420616d6f756e74207479706500000000000000000000000000604082015260600190565b6020808252600e908201527f49413a2062616420616d6f756e74000000000000000000000000000000000000604082015260600190565b60208082526012908201527f54535249413a2072656465656d206661696c0000000000000000000000000000604082015260600190565b60208082526011908201527f54535249413a206973737565206661696c000000000000000000000000000000604082015260600190565b60208082526010908201527f49413a206d756c206f766572666c6f7700000000000000000000000000000000604082015260600190565b6020808252601e908201527f54535249413a2073686f756c64206265203120746f6b656e416d6f756e740000604082015260600190565b60405181810167ffffffffffffffff8111828210171561192957fe5b604052919050565b600067ffffffffffffffff82111561194557fe5b5060209081020190565b60005b8381101561196a578181015183820152602001611952565b838111156110f25750506000910152565b60e01c90565b600060443d101561199157611a60565b600481823e6308c379a06119a5825161197b565b146119af57611a60565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff81602484011181841117156119fd5750505050611a60565b82840192508251915080821115611a175750505050611a60565b503d83016020828401011115611a2f57505050611a60565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b90565b73ffffffffffffffffffffffffffffffffffffffff81168114611a8557600080fd5b5056fea264697066735822122087c366b1af5040a0bced20f4d36cb8f89ee51b86586b5bd1d59092a210d68f3b64736f6c63430007030033
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.