Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ElkAllMultiSend
- Optimization enabled
- true
- Compiler version
- v0.5.5+commit.47a71e8f
- Optimization runs
- 1000
- EVM Version
- default
- Verified at
- 2022-09-26T04:34:35.337191Z
Constructor Arguments
[{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getTokenBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"recipients","type":"address[]"},{"name":"amount","type":"uint256"}],"name":"multiSendFixedToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"recipients","type":"address[]"},{"name":"amounts","type":"uint256[]"}],"name":"multiSendDiffTokenFromContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"recipients","type":"address[]"},{"name":"amount","type":"uint256"}],"name":"multiSendFixedTokenFromContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"recipients","type":"address[]"},{"name":"amounts","type":"uint256[]"}],"name":"multiSendDiffToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]
Contract source code
//Deployed lovingly by LtSnakePlissken // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/utils/Address.sol pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing 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. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // 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 != 0x0 && codehash != accountHash); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @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]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @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"); } } } // File: ElkMultiSend.sol pragma solidity ^0.5.0; contract ElkAllMultiSend { using SafeMath for uint256; using SafeERC20 for IERC20; address public owner; modifier onlyOwner(){ require(msg.sender == owner); _; } constructor() public{ owner = msg.sender; } //getowner function getOwner() public view returns (address) { return owner; } //get token balance function getTokenBalance(IERC20 token) public view returns (uint256) { return token.balanceOf(address(this)); } //withdraw whole erc20 token balance function withdraw(IERC20 token) public onlyOwner{ token.safeTransfer(msg.sender, token.balanceOf(address(this))); } //batch send fixed token amount from sender, require approval of contract as spender function multiSendFixedToken(IERC20 token, address[] memory recipients, uint256 amount) public { address from = msg.sender; require(recipients.length > 0); require(amount > 0); require(recipients.length * amount <= token.allowance(from, address(this))); for (uint256 i = 0; i < recipients.length; i++) { token.safeTransferFrom(from, recipients[i], amount); } } //batch send different token amount from sender, require approval of contract as spender function multiSendDiffToken(IERC20 token, address[] memory recipients, uint256[] memory amounts) public { require(recipients.length > 0); require(recipients.length == amounts.length); address from = msg.sender; uint256 allowance = token.allowance(from, address(this)); uint256 currentSum = 0; for (uint256 i = 0; i < recipients.length; i++) { uint256 amount = amounts[i]; require(amount > 0); currentSum = currentSum.add(amount); require(currentSum <= allowance); token.safeTransferFrom(from, recipients[i], amount); } } //batch send fixed token amount from contract function multiSendFixedTokenFromContract(IERC20 token, address[] memory recipients, uint256 amount) public onlyOwner { require(recipients.length > 0); require(amount > 0); require(recipients.length * amount <= token.balanceOf(address(this))); for (uint256 i = 0; i < recipients.length; i++) { token.safeTransfer(recipients[i], amount); } } //batch send different token amount from contract function multiSendDiffTokenFromContract(IERC20 token, address[] memory recipients, uint256[] memory amounts) public onlyOwner { require(recipients.length > 0); require(recipients.length == amounts.length); uint256 length = recipients.length; uint256 currentSum = 0; uint256 currentTokenBalance = token.balanceOf(address(this)); for (uint256 i = 0; i < length; i++) { uint256 amount = amounts[i]; require(amount > 0); currentSum = currentSum.add(amount); require(currentSum <= currentTokenBalance); token.safeTransfer(recipients[i], amount); } } }
Contract ABI
[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getTokenBalance","inputs":[{"type":"address","name":"token"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"multiSendFixedToken","inputs":[{"type":"address","name":"token"},{"type":"address[]","name":"recipients"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"token"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"multiSendDiffTokenFromContract","inputs":[{"type":"address","name":"token"},{"type":"address[]","name":"recipients"},{"type":"uint256[]","name":"amounts"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"multiSendFixedTokenFromContract","inputs":[{"type":"address","name":"token"},{"type":"address[]","name":"recipients"},{"type":"uint256","name":"amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getOwner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"multiSendDiffToken","inputs":[{"type":"address","name":"token"},{"type":"address[]","name":"recipients"},{"type":"uint256[]","name":"amounts"}],"constant":false},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610e9d806100326000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637fb7e3f81161005b5780637fb7e3f8146102d9578063893d20e81461038e5780638da5cb5b146103b2578063f0558aa2146103ba57610088565b80633aecd0e31461008d578063513e8d29146100c557806351cff8d91461017c57806377bb004e146101a2575b600080fd5b6100b3600480360360208110156100a357600080fd5b50356001600160a01b03166104f1565b60408051918252519081900360200190f35b61017a600480360360608110156100db57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561010657600080fd5b82018360208201111561011857600080fd5b8035906020019184602083028401116401000000008311171561013a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610570915050565b005b61017a6004803603602081101561019257600080fd5b50356001600160a01b031661067e565b61017a600480360360608110156101b857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184602083028401116401000000008311171561021757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184602083028401116401000000008311171561029b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061072a945050505050565b61017a600480360360608110156102ef57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561031a57600080fd5b82018360208201111561032c57600080fd5b8035906020019184602083028401116401000000008311171561034e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610870915050565b610396610970565b604080516001600160a01b039092168252519081900360200190f35b61039661097f565b61017a600480360360608110156103d057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156103fb57600080fd5b82018360208201111561040d57600080fd5b8035906020019184602083028401116401000000008311171561042f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460208302840111640100000000831117156104b357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061098e945050505050565b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561053e57600080fd5b505afa158015610552573d6000803e3d6000fd5b505050506040513d602081101561056857600080fd5b505192915050565b81513390151561057f57600080fd5b81151561058b57600080fd5b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015230602483015291519186169163dd62ed3e91604480820192602092909190829003018186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d602081101561061e57600080fd5b505183518302111561062f57600080fd5b60005b83518110156106775761066f82858381518110151561064d57fe5b602090810290910101516001600160a01b03881691908663ffffffff610ad316565b600101610632565b5050505050565b6000546001600160a01b0316331461069557600080fd5b60408051600160e01b6370a0823102815230600482015290516107279133916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156106e457600080fd5b505afa1580156106f8573d6000803e3d6000fd5b505050506040513d602081101561070e57600080fd5b50516001600160a01b038416919063ffffffff610b5b16565b50565b6000546001600160a01b0316331461074157600080fd5b8151151561074e57600080fd5b805182511461075c57600080fd5b815160408051600160e01b6370a08231028152306004820152905160009182916001600160a01b038816916370a08231916024808301926020929190829003018186803b1580156107ac57600080fd5b505afa1580156107c0573d6000803e3d6000fd5b505050506040513d60208110156107d657600080fd5b5051905060005b8381101561086757600085828151811015156107f557fe5b60209081029091010151905080151561080d57600080fd5b61081d848263ffffffff610be016565b93508284111561082c57600080fd5b61085e878381518110151561083d57fe5b602090810290910101516001600160a01b038a16908363ffffffff610b5b16565b506001016107dd565b50505050505050565b6000546001600160a01b0316331461088757600080fd5b8151151561089457600080fd5b8015156108a057600080fd5b60408051600160e01b6370a0823102815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156108e957600080fd5b505afa1580156108fd573d6000803e3d6000fd5b505050506040513d602081101561091357600080fd5b505182518202111561092457600080fd5b60005b825181101561096a57610962838281518110151561094157fe5b602090810290910101516001600160a01b038616908463ffffffff610b5b16565b600101610927565b50505050565b6000546001600160a01b031690565b6000546001600160a01b031681565b8151151561099b57600080fd5b80518251146109a957600080fd5b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820181905230602483015291516000916001600160a01b0387169163dd62ed3e91604480820192602092909190829003018186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d6020811015610a3e57600080fd5b505190506000805b85518110156108675760008582815181101515610a5f57fe5b602090810290910101519050801515610a7757600080fd5b610a87838263ffffffff610be016565b925083831115610a9657600080fd5b610aca858884815181101515610aa857fe5b602090810290910101516001600160a01b038b1691908463ffffffff610ad316565b50600101610a46565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261096a908590610c44565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610bdb908490610c44565b505050565b600082820183811015610c3d5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610c56826001600160a01b0316610e0b565b1515610cac5760408051600160e51b62461bcd02815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610cea5780518252601f199092019160209182019101610ccb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d4c576040519150601f19603f3d011682016040523d82523d6000602084013e610d51565b606091505b5091509150811515610dad5760408051600160e51b62461bcd02815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561096a57808060200190516020811015610dc957600080fd5b5051151561096a57604051600160e51b62461bcd02815260040180806020018281038252602a815260200180610e48602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590610e3f5750808214155b94935050505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820fd7dd1755c00c8188f463126e64dcff2e920df010eff0aa1e06b75b0aeceafc40029
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80637fb7e3f81161005b5780637fb7e3f8146102d9578063893d20e81461038e5780638da5cb5b146103b2578063f0558aa2146103ba57610088565b80633aecd0e31461008d578063513e8d29146100c557806351cff8d91461017c57806377bb004e146101a2575b600080fd5b6100b3600480360360208110156100a357600080fd5b50356001600160a01b03166104f1565b60408051918252519081900360200190f35b61017a600480360360608110156100db57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561010657600080fd5b82018360208201111561011857600080fd5b8035906020019184602083028401116401000000008311171561013a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610570915050565b005b61017a6004803603602081101561019257600080fd5b50356001600160a01b031661067e565b61017a600480360360608110156101b857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156101e357600080fd5b8201836020820111156101f557600080fd5b8035906020019184602083028401116401000000008311171561021757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184602083028401116401000000008311171561029b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061072a945050505050565b61017a600480360360608110156102ef57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561031a57600080fd5b82018360208201111561032c57600080fd5b8035906020019184602083028401116401000000008311171561034e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610870915050565b610396610970565b604080516001600160a01b039092168252519081900360200190f35b61039661097f565b61017a600480360360608110156103d057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156103fb57600080fd5b82018360208201111561040d57600080fd5b8035906020019184602083028401116401000000008311171561042f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460208302840111640100000000831117156104b357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061098e945050505050565b60408051600160e01b6370a0823102815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561053e57600080fd5b505afa158015610552573d6000803e3d6000fd5b505050506040513d602081101561056857600080fd5b505192915050565b81513390151561057f57600080fd5b81151561058b57600080fd5b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015230602483015291519186169163dd62ed3e91604480820192602092909190829003018186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d602081101561061e57600080fd5b505183518302111561062f57600080fd5b60005b83518110156106775761066f82858381518110151561064d57fe5b602090810290910101516001600160a01b03881691908663ffffffff610ad316565b600101610632565b5050505050565b6000546001600160a01b0316331461069557600080fd5b60408051600160e01b6370a0823102815230600482015290516107279133916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156106e457600080fd5b505afa1580156106f8573d6000803e3d6000fd5b505050506040513d602081101561070e57600080fd5b50516001600160a01b038416919063ffffffff610b5b16565b50565b6000546001600160a01b0316331461074157600080fd5b8151151561074e57600080fd5b805182511461075c57600080fd5b815160408051600160e01b6370a08231028152306004820152905160009182916001600160a01b038816916370a08231916024808301926020929190829003018186803b1580156107ac57600080fd5b505afa1580156107c0573d6000803e3d6000fd5b505050506040513d60208110156107d657600080fd5b5051905060005b8381101561086757600085828151811015156107f557fe5b60209081029091010151905080151561080d57600080fd5b61081d848263ffffffff610be016565b93508284111561082c57600080fd5b61085e878381518110151561083d57fe5b602090810290910101516001600160a01b038a16908363ffffffff610b5b16565b506001016107dd565b50505050505050565b6000546001600160a01b0316331461088757600080fd5b8151151561089457600080fd5b8015156108a057600080fd5b60408051600160e01b6370a0823102815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156108e957600080fd5b505afa1580156108fd573d6000803e3d6000fd5b505050506040513d602081101561091357600080fd5b505182518202111561092457600080fd5b60005b825181101561096a57610962838281518110151561094157fe5b602090810290910101516001600160a01b038616908463ffffffff610b5b16565b600101610927565b50505050565b6000546001600160a01b031690565b6000546001600160a01b031681565b8151151561099b57600080fd5b80518251146109a957600080fd5b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820181905230602483015291516000916001600160a01b0387169163dd62ed3e91604480820192602092909190829003018186803b158015610a1457600080fd5b505afa158015610a28573d6000803e3d6000fd5b505050506040513d6020811015610a3e57600080fd5b505190506000805b85518110156108675760008582815181101515610a5f57fe5b602090810290910101519050801515610a7757600080fd5b610a87838263ffffffff610be016565b925083831115610a9657600080fd5b610aca858884815181101515610aa857fe5b602090810290910101516001600160a01b038b1691908463ffffffff610ad316565b50600101610a46565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261096a908590610c44565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610bdb908490610c44565b505050565b600082820183811015610c3d5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610c56826001600160a01b0316610e0b565b1515610cac5760408051600160e51b62461bcd02815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610cea5780518252601f199092019160209182019101610ccb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d4c576040519150601f19603f3d011682016040523d82523d6000602084013e610d51565b606091505b5091509150811515610dad5760408051600160e51b62461bcd02815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561096a57808060200190516020811015610dc957600080fd5b5051151561096a57604051600160e51b62461bcd02815260040180806020018281038252602a815260200180610e48602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590610e3f5750808214155b94935050505056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a165627a7a72305820fd7dd1755c00c8188f463126e64dcff2e920df010eff0aa1e06b75b0aeceafc40029