Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 26 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Order | 16582077 | 560 days ago | IN | 0.004 ETH | 0.00336003 | ||||
Execute Order | 16394868 | 586 days ago | IN | 0.00399999 ETH | 0.00182437 | ||||
Cancel Order | 16355454 | 591 days ago | IN | 0 ETH | 0.00083257 | ||||
Cancel Order | 16199600 | 613 days ago | IN | 0 ETH | 0.00086727 | ||||
Execute Order | 15408812 | 727 days ago | IN | 0.02 ETH | 0.00068288 | ||||
Execute Order | 15408812 | 727 days ago | IN | 0.02 ETH | 0.00094849 | ||||
Execute Order | 15387229 | 730 days ago | IN | 0.01238999 ETH | 0.00054793 | ||||
Execute Order | 15387217 | 730 days ago | IN | 0.01239 ETH | 0.00061584 | ||||
Execute Order | 15265373 | 749 days ago | IN | 0.006 ETH | 0.00136236 | ||||
Execute Order | 15206308 | 758 days ago | IN | 0.17 ETH | 0.00215842 | ||||
Cancel Order | 15203133 | 759 days ago | IN | 0 ETH | 0.00052742 | ||||
Cancel Order | 15203101 | 759 days ago | IN | 0 ETH | 0.00053552 | ||||
Execute Order | 15191199 | 761 days ago | IN | 0.07 ETH | 0.00171871 | ||||
Execute Order | 15191118 | 761 days ago | IN | 0.15999999 ETH | 0.00167523 | ||||
Cancel Order | 15191002 | 761 days ago | IN | 0 ETH | 0.00041117 | ||||
Cancel Order | 15190988 | 761 days ago | IN | 0 ETH | 0.00040724 | ||||
Cancel Order | 15190950 | 761 days ago | IN | 0 ETH | 0.00035602 | ||||
Execute Order | 15187377 | 761 days ago | IN | 0.134 ETH | 0.00160185 | ||||
Execute Order | 15185825 | 761 days ago | IN | 0.02999999 ETH | 0.00105597 | ||||
Execute Order | 15177989 | 763 days ago | IN | 0.00409999 ETH | 0.00154199 | ||||
Execute Order | 15177976 | 763 days ago | IN | 0.00199999 ETH | 0.00181966 | ||||
Execute Order | 14922890 | 805 days ago | IN | 0.00999999 ETH | 0.01203234 | ||||
Execute Order | 14842233 | 818 days ago | IN | 0.01645999 ETH | 0.00217939 | ||||
Execute Order | 14837628 | 819 days ago | IN | 1.49999999 ETH | 0.00263842 | ||||
Cancel Order | 14806720 | 824 days ago | IN | 0 ETH | 0.00079952 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16582077 | 560 days ago | 0.000028 ETH | ||||
16582077 | 560 days ago | 0.003972 ETH | ||||
16394868 | 586 days ago | 0.00002799 ETH | ||||
16394868 | 586 days ago | 0.00397199 ETH | ||||
15408812 | 727 days ago | 0.00014 ETH | ||||
15408812 | 727 days ago | 0.01986 ETH | ||||
15408812 | 727 days ago | 0.00014 ETH | ||||
15408812 | 727 days ago | 0.01986 ETH | ||||
15387229 | 730 days ago | 0.00008672 ETH | ||||
15387229 | 730 days ago | 0.01230326 ETH | ||||
15387217 | 730 days ago | 0.00008673 ETH | ||||
15387217 | 730 days ago | 0.01230327 ETH | ||||
15265373 | 749 days ago | 0.000042 ETH | ||||
15265373 | 749 days ago | 0.005958 ETH | ||||
15206308 | 758 days ago | 0.00119 ETH | ||||
15206308 | 758 days ago | 0.16881 ETH | ||||
15191199 | 761 days ago | 0.00049 ETH | ||||
15191199 | 761 days ago | 0.06951 ETH | ||||
15191118 | 761 days ago | 0.00111999 ETH | ||||
15191118 | 761 days ago | 0.15887999 ETH | ||||
15187377 | 761 days ago | 0.000938 ETH | ||||
15187377 | 761 days ago | 0.133062 ETH | ||||
15185825 | 761 days ago | 0.00020999 ETH | ||||
15185825 | 761 days ago | 0.02978999 ETH | ||||
15177989 | 763 days ago | 0.00002869 ETH |
Loading...
Loading
Contract Name:
SignatureBasedPeerToPeerMarkets
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-28 */ // SPDX-License-Identifier: GPL-3.0-only // File: @openzeppelin/contracts/cryptography/ECDSA.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.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 IERC20;` 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ 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. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "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: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/SignatureBasedPeerToPeerMarkets.sol pragma solidity ^0.6.0; contract SignatureBasedPeerToPeerMarkets is ReentrancyGuard { using Address for address payable; using ECDSA for bytes32; using SafeERC20 for IERC20; using SafeMath for uint256; bytes32 constant TYPEHASH = keccak256("Order(address,address,uint256,uint256,address,uint256)"); mapping (bytes32 => uint256) public executedBookAmounts; uint256 public immutable fee; address payable public immutable vault; uint256 private immutable chainId_; constructor (uint256 _fee, address payable _vault) public { require(_fee <= 1e18, "invalid fee"); require(_vault != address(0), "invalid address"); fee = _fee; vault = _vault; chainId_ = _chainId(); } function generateOrderId(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt) public view returns (bytes32 _orderId) { return keccak256(abi.encodePacked(TYPEHASH, chainId_, address(this), _bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt)); } function checkOrderExecution(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt, uint256 _requiredBookAmount) external view returns (uint256 _totalExecAmount) { return _checkOrderExecution(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt, _requiredBookAmount); } // availability may not be accurate for multiple orders of the same maker function checkOrdersExecution(address _bookToken, address _execToken, uint256[] calldata _bookAmounts, uint256[] calldata _execAmounts, address payable[] calldata _makers, uint256[] calldata _salts, uint256 _lastRequiredBookAmount) external view returns (uint256 _totalExecAmount) { uint256 _length = _makers.length; if (_length == 0) return 0; _totalExecAmount = 0; for (uint256 _i = 0; _i < _length - 1; _i++) { uint256 _localExecAmount = _checkOrderExecution(_bookToken, _execToken, _bookAmounts[_i], _execAmounts[_i], _makers[_i], _salts[_i], uint256(-1)); uint256 _newTotalExecAmount = _totalExecAmount + _localExecAmount; if (_newTotalExecAmount <= _totalExecAmount) return 0; _totalExecAmount = _newTotalExecAmount; } { uint256 _i = _length - 1; uint256 _localExecAmount = _checkOrderExecution(_bookToken, _execToken, _bookAmounts[_i], _execAmounts[_i], _makers[_i], _salts[_i], _lastRequiredBookAmount); uint256 _newTotalExecAmount = _totalExecAmount + _localExecAmount; if (_newTotalExecAmount <= _totalExecAmount) return 0; _totalExecAmount = _newTotalExecAmount; } return _totalExecAmount; } function _checkOrderExecution(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt, uint256 _requiredBookAmount) internal view returns (uint256 _requiredExecAmount) { if (_requiredBookAmount == 0) return 0; bytes32 _orderId = generateOrderId(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt); uint256 _executedBookAmount = executedBookAmounts[_orderId]; if (_executedBookAmount >= _bookAmount) return 0; uint256 _availableBookAmount = _bookAmount - _executedBookAmount; if (_requiredBookAmount == uint256(-1)) { _requiredBookAmount = _availableBookAmount; } else { if (_requiredBookAmount > _availableBookAmount) return 0; } if (_requiredBookAmount > IERC20(_bookToken).balanceOf(_maker)) return 0; if (_requiredBookAmount > IERC20(_bookToken).allowance(_maker, address(this))) return 0; _requiredExecAmount = _requiredBookAmount.mul(_execAmount).add(_bookAmount - 1) / _bookAmount; return _requiredExecAmount; } function executeOrder(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt, bytes calldata _signature, uint256 _requiredBookAmount) external payable nonReentrant { address payable _taker = msg.sender; uint256 _totalExecFeeAmount = _executeOrder(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt, _signature, _taker, _requiredBookAmount); if (_execToken == address(0)) { vault.sendValue(_totalExecFeeAmount); require(address(this).balance == 0, "excess value"); } else { IERC20(_execToken).safeTransferFrom(_taker, vault, _totalExecFeeAmount); } } function executeOrders(address _bookToken, address _execToken, uint256[] memory _bookAmounts, uint256[] memory _execAmounts, address payable[] memory _makers, uint256[] memory _salts, bytes memory _signatures, uint256 _lastRequiredBookAmount) external payable nonReentrant { address payable _taker = msg.sender; uint256 _length = _makers.length; require(_length > 0, "invalid length"); uint256 _totalExecFeeAmount = 0; for (uint256 _i = 0; _i < _length - 1; _i++) { bytes memory _signature = _extractSignature(_signatures, _i); uint256 _requiredExecFeeAmount = _executeOrder(_bookToken, _execToken, _bookAmounts[_i], _execAmounts[_i], _makers[_i], _salts[_i], _signature, _taker, uint256(-1)); _totalExecFeeAmount = _totalExecFeeAmount.add(_requiredExecFeeAmount); } { uint256 _i = _length - 1; bytes memory _signature = _extractSignature(_signatures, _i); uint256 _requiredExecFeeAmount = _executeOrder(_bookToken, _execToken, _bookAmounts[_i], _execAmounts[_i], _makers[_i], _salts[_i], _signature, _taker, _lastRequiredBookAmount); _totalExecFeeAmount = _totalExecFeeAmount.add(_requiredExecFeeAmount); } if (_execToken == address(0)) { vault.sendValue(_totalExecFeeAmount); require(address(this).balance == 0); } else { IERC20(_execToken).safeTransferFrom(_taker, vault, _totalExecFeeAmount); } } function _executeOrder(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt, bytes memory _signature, address payable _taker, uint256 _requiredBookAmount) internal returns (uint256 _requiredExecFeeAmount) { require(_requiredBookAmount > 0, "invalid amount"); bytes32 _orderId = generateOrderId(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt); require(_maker == _recoverSigner(_orderId, _signature), "access denied"); uint256 _requiredExecNetAmount; { uint256 _executedBookAmount = executedBookAmounts[_orderId]; require(_executedBookAmount < _bookAmount, "inactive order"); { uint64 _startTime = uint64(_salt >> 64); uint64 _endTime = uint64(_salt); require(_startTime <= now && now < _endTime, "invalid timeframe"); } uint256 _availableBookAmount = _bookAmount - _executedBookAmount; if (_requiredBookAmount == uint256(-1)) { _requiredBookAmount = _availableBookAmount; } else { require(_requiredBookAmount <= _availableBookAmount, "insufficient liquidity"); } uint256 _requiredExecAmount = _requiredBookAmount.mul(_execAmount).add(_bookAmount - 1) / _bookAmount; _requiredExecFeeAmount = _requiredExecAmount.mul(fee) / 1e18; _requiredExecNetAmount = _requiredExecAmount - _requiredExecFeeAmount; executedBookAmounts[_orderId] = _executedBookAmount + _requiredBookAmount; } IERC20(_bookToken).safeTransferFrom(_maker, _taker, _requiredBookAmount); if (_execToken == address(0)) { _maker.sendValue(_requiredExecNetAmount); } else { IERC20(_execToken).safeTransferFrom(_taker, _maker, _requiredExecNetAmount); } emit Trade(_bookToken, _execToken, _orderId, _requiredBookAmount, _requiredExecNetAmount, _requiredExecFeeAmount, _maker, _taker); return _requiredExecFeeAmount; } function cancelOrder(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, uint256 _salt) external { address payable _maker = msg.sender; _cancelOrder(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt); } function cancelOrders(address _bookToken, address _execToken, uint256[] calldata _bookAmounts, uint256[] calldata _execAmounts, uint256[] calldata _salts) external { address payable _maker = msg.sender; for (uint256 _i = 0; _i < _bookAmounts.length; _i++) { _cancelOrder(_bookToken, _execToken, _bookAmounts[_i], _execAmounts[_i], _maker, _salts[_i]); } } function _cancelOrder(address _bookToken, address _execToken, uint256 _bookAmount, uint256 _execAmount, address payable _maker, uint256 _salt) internal { bytes32 _orderId = generateOrderId(_bookToken, _execToken, _bookAmount, _execAmount, _maker, _salt); executedBookAmounts[_orderId] = uint256(-1); emit CancelOrder(_bookToken, _execToken, _orderId); } function _extractSignature(bytes memory _signatures, uint256 _index) internal pure returns (bytes memory _signature) { uint256 _offset = 65 * _index; _signature = new bytes(65); for (uint256 _i = 0; _i < 65; _i++) { _signature[_i] = _signatures[_offset + _i]; } return _signature; } function _recoverSigner(bytes32 _hash, bytes memory _signature) internal pure returns (address _signer) { return _hash.toEthSignedMessageHash().recover(_signature); } function _chainId() internal pure returns (uint256 _chainid) { assembly { _chainid := chainid() } return _chainid; } event Trade(address indexed _bookToken, address indexed _execToken, bytes32 indexed _orderId, uint256 _bookAmount, uint256 _execAmount, uint256 _execFeeAmount, address _maker, address _taker); event CancelOrder(address indexed _bookToken, address indexed _execToken, bytes32 indexed _orderId); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"address payable","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bookToken","type":"address"},{"indexed":true,"internalType":"address","name":"_execToken","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_orderId","type":"bytes32"}],"name":"CancelOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_bookToken","type":"address"},{"indexed":true,"internalType":"address","name":"_execToken","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_orderId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_bookAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_execAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_execFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_maker","type":"address"},{"indexed":false,"internalType":"address","name":"_taker","type":"address"}],"name":"Trade","type":"event"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256","name":"_bookAmount","type":"uint256"},{"internalType":"uint256","name":"_execAmount","type":"uint256"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256[]","name":"_bookAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_execAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_salts","type":"uint256[]"}],"name":"cancelOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256","name":"_bookAmount","type":"uint256"},{"internalType":"uint256","name":"_execAmount","type":"uint256"},{"internalType":"address payable","name":"_maker","type":"address"},{"internalType":"uint256","name":"_salt","type":"uint256"},{"internalType":"uint256","name":"_requiredBookAmount","type":"uint256"}],"name":"checkOrderExecution","outputs":[{"internalType":"uint256","name":"_totalExecAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256[]","name":"_bookAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_execAmounts","type":"uint256[]"},{"internalType":"address payable[]","name":"_makers","type":"address[]"},{"internalType":"uint256[]","name":"_salts","type":"uint256[]"},{"internalType":"uint256","name":"_lastRequiredBookAmount","type":"uint256"}],"name":"checkOrdersExecution","outputs":[{"internalType":"uint256","name":"_totalExecAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256","name":"_bookAmount","type":"uint256"},{"internalType":"uint256","name":"_execAmount","type":"uint256"},{"internalType":"address payable","name":"_maker","type":"address"},{"internalType":"uint256","name":"_salt","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_requiredBookAmount","type":"uint256"}],"name":"executeOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256[]","name":"_bookAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_execAmounts","type":"uint256[]"},{"internalType":"address payable[]","name":"_makers","type":"address[]"},{"internalType":"uint256[]","name":"_salts","type":"uint256[]"},{"internalType":"bytes","name":"_signatures","type":"bytes"},{"internalType":"uint256","name":"_lastRequiredBookAmount","type":"uint256"}],"name":"executeOrders","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"executedBookAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bookToken","type":"address"},{"internalType":"address","name":"_execToken","type":"address"},{"internalType":"uint256","name":"_bookAmount","type":"uint256"},{"internalType":"uint256","name":"_execAmount","type":"uint256"},{"internalType":"address payable","name":"_maker","type":"address"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"generateOrderId","outputs":[{"internalType":"bytes32","name":"_orderId","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162002a6138038062002a61833981810160405260408110156200003757600080fd5b8101908080519060200190929190805190602001909291905050506001600081905550670de0b6b3a7640000821115620000d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f696e76616c69642066656500000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200017d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b81608081815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050620001cc620001db60201b60201c565b60c081815250505050620001e3565b600046905090565b60805160a05160601c60c0516128356200022c60003980610b4052508061105b52806110b65280611263528061132752806114355250806113a15280611ae052506128356000f3fe6080604052600436106100915760003560e01c8063bffec16d11610059578063bffec16d146107ae578063c59fb24a146108b0578063ddca3f431461093f578063ed7bc9af1461096a578063fbfa77cf14610ada57610091565b8063230fc56c146100965780635f57fc041461015957806371108aa91461033c578063b2b36d2c14610692578063b80698871461075f575b600080fd5b3480156100a257600080fd5b50610143600480360360c08110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b1b565b6040518082815260200191505060405180910390f35b34801561016557600080fd5b50610326600480360360e081101561017c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101d957600080fd5b8201836020820111156101eb57600080fd5b8035906020019184602083028401116401000000008311171561020d57600080fd5b90919293919293908035906020019064010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184602083028401116401000000008311171561026257600080fd5b90919293919293908035906020019064010000000081111561028357600080fd5b82018360208201111561029557600080fd5b803590602001918460208302840111640100000000831117156102b757600080fd5b9091929391929390803590602001906401000000008111156102d857600080fd5b8201836020820111156102ea57600080fd5b8035906020019184602083028401116401000000008311171561030c57600080fd5b909192939192939080359060200190929190505050610c34565b6040518082815260200191505060405180910390f35b610690600480360361010081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103b057600080fd5b8201836020820111156103c257600080fd5b803590602001918460208302840111640100000000831117156103e457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184602083028401116401000000008311171561047857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104d857600080fd5b8201836020820111156104ea57600080fd5b8035906020019184602083028401116401000000008311171561050c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610dcc565b005b34801561069e57600080fd5b50610749600480360360e08110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611113565b6040518082815260200191505060405180910390f35b34801561076b57600080fd5b506107986004803603602081101561078257600080fd5b8101908080359060200190929190505050611131565b6040518082815260200191505060405180910390f35b6108ae60048036036101008110156107c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086057600080fd5b82018360208201111561087257600080fd5b8035906020019184600183028401116401000000008311171561089457600080fd5b909192939192939080359060200190929190505050611149565b005b3480156108bc57600080fd5b5061093d600480360360a08110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611384565b005b34801561094b57600080fd5b5061095461139f565b6040518082815260200191505060405180910390f35b34801561097657600080fd5b50610ad8600480360360a081101561098d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109ea57600080fd5b8201836020820111156109fc57600080fd5b80359060200191846020830284011164010000000083111715610a1e57600080fd5b909192939192939080359060200190640100000000811115610a3f57600080fd5b820183602082011115610a5157600080fd5b80359060200191846020830284011164010000000083111715610a7357600080fd5b909192939192939080359060200190640100000000811115610a9457600080fd5b820183602082011115610aa657600080fd5b80359060200191846020830284011164010000000083111715610ac857600080fd5b90919293919293905050506113c3565b005b348015610ae657600080fd5b50610aef611433565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60007f36ef74f5ee8d7b6f268672a95fb4162e7efc570de9585db877bcb1123c14c5237f000000000000000000000000000000000000000000000000000000000000000030898989898989604051602001808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1660601b81526014018773ffffffffffffffffffffffffffffffffffffffff1660601b81526014018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200199505050505050505050506040516020818303038152906040528051906020012090509695505050505050565b6000808686905090506000811415610c50576000915050610dbd565b6000915060005b60018203811015610d20576000610cf18f8f8f8f86818110610c7557fe5b905060200201358e8e87818110610c8857fe5b905060200201358d8d88818110610c9b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168c8c89818110610cc457fe5b905060200201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611457565b905060008185019050848111610d0e576000945050505050610dbd565b80945050508080600101915050610c57565b5060006001820390506000610d988f8f8f8f86818110610d3c57fe5b905060200201358e8e87818110610d4f57fe5b905060200201358d8d88818110610d6257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168c8c89818110610d8b57fe5b905060200201358b611457565b905060008185019050848111610db5576000945050505050610dbd565b809450505050505b9b9a5050505050505050505050565b60026000541415610e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600081905550600033905060008551905060008111610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206c656e67746800000000000000000000000000000000000081525060200191505060405180910390fd5b6000805b60018303811015610f90576060610ee987836116bc565b90506000610f6a8e8e8e8681518110610efe57fe5b60200260200101518e8781518110610f1257fe5b60200260200101518e8881518110610f2657fe5b60200260200101518e8981518110610f3a57fe5b6020026020010151888d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611789565b9050610f7f8185611cb990919063ffffffff16565b935050508080600101915050610ed2565b5060006001830390506060610fa587836116bc565b905060006110068e8e8e8681518110610fba57fe5b60200260200101518e8781518110610fce57fe5b60200260200101518e8881518110610fe257fe5b60200260200101518e8981518110610ff657fe5b6020026020010151888d8f611789565b905061101b8185611cb990919063ffffffff16565b9350505050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614156110b05761109e817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b600047146110ab57600080fd5b6110fe565b6110fd837f0000000000000000000000000000000000000000000000000000000000000000838d73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b50505060016000819055505050505050505050565b600061112488888888888888611457565b9050979650505050505050565b60016020528060005260406000206000915090505481565b600260005414156111c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600081905550600033905060006112268b8b8b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050898b611789565b9050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611321576112a6817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b6000471461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6578636573732076616c7565000000000000000000000000000000000000000081525060200191505060405180910390fd5b61136f565b61136e827f0000000000000000000000000000000000000000000000000000000000000000838d73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b50506001600081905550505050505050505050565b6000339050611397868686868587611f3c565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905060005b878790508110156114275761141a8a8a8a8a858181106113e757fe5b905060200201358989868181106113fa57fe5b905060200201358689898881811061140e57fe5b90506020020135611f3c565b80806001019150506113cb565b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008082141561146a57600090506116b1565b600061147a898989898989610b1b565b90506000600160008381526020019081526020016000205490508781106114a6576000925050506116b1565b600081890390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8514156114dd578094506114f2565b808511156114f157600093505050506116b1565b5b8a73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561155957600080fd5b505afa15801561156d573d6000803e3d6000fd5b505050506040513d602081101561158357600080fd5b81019080805190602001909291905050508511156115a757600093505050506116b1565b8a73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e88306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d602081101561165657600080fd5b810190808051906020019092919050505085111561167a57600093505050506116b1565b886116a360018b036116958b89611fea90919063ffffffff16565b611cb990919063ffffffff16565b816116aa57fe5b0493505050505b979650505050505050565b60606000826041029050604167ffffffffffffffff811180156116de57600080fd5b506040519080825280601f01601f1916602001820160405280156117115781602001600182028036833780820191505090505b50915060005b604181101561178157848183018151811061172e57fe5b602001015160f81c60f81b83828151811061174557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611717565b505092915050565b6000808211611800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c696420616d6f756e7400000000000000000000000000000000000081525060200191505060405180910390fd5b60006118108b8b8b8b8b8b610b1b565b905061181c8186612070565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146118bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b600080600160008481526020019081526020016000205490508a811061194a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e616374697665206f7264657200000000000000000000000000000000000081525060200191505060405180910390fd5b6000604089901c90506000899050428267ffffffffffffffff161115801561197b57508067ffffffffffffffff1642105b6119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c69642074696d656672616d6500000000000000000000000000000081525060200191505060405180910390fd5b50506000818c0390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861415611a2657809550611a9d565b80861115611a9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f696e73756666696369656e74206c69717569646974790000000000000000000081525060200191505060405180910390fd5b5b60008c611ac860018f03611aba8f8b611fea90919063ffffffff16565b611cb990919063ffffffff16565b81611acf57fe5b049050670de0b6b3a7640000611b0e7f000000000000000000000000000000000000000000000000000000000000000083611fea90919063ffffffff16565b81611b1557fe5b04955085810393508683016001600087815260200190815260200160002081905550505050611b678886868f73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161415611bca57611bc5818973ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b611bf8565b611bf78589838e73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b818b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167feb9186f1b50225c6fd042153f6587a288ca915b3754bbaf775250e21ff10132b8785888e8c604051808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a450509998505050505050505050565b600080828401905083811015611d37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b80471015611db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b5050905080611e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180612711603a913960400191505060405180910390fd5b505050565b611f36846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612095565b50505050565b6000611f4c878787878787610b1b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600083815260200190815260200160002081905550808673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f01a25b95d7dfd8cb8868928380fc2134b0f9557cd1a1f36066e66b5637a8b68260405160405180910390a450505050505050565b600080831415611ffd576000905061206a565b600082840290508284828161200e57fe5b0414612065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127b56021913960400191505060405180910390fd5b809150505b92915050565b600061208d8261207f85612184565b6121dc90919063ffffffff16565b905092915050565b60606120f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124709092919063ffffffff16565b905060008151111561217f5780806020019051602081101561211857600080fd5b810190808051906020019092919050505061217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806127d6602a913960400191505060405180910390fd5b5b505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156122ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061274b6022913960400191505060405180910390fd5b601b8160ff1614806123035750601c8160ff16145b612358576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127936022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156123b4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b606061247f8484600085612488565b90509392505050565b6060824710156124e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061276d6026913960400191505060405180910390fd5b6124ec85612631565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125ae578051825260208201915060208101905060208303925061258b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612610576040519150601f19603f3d011682016040523d82523d6000602084013e612615565b606091505b5091509150612625828286612644565b92505050949350505050565b600080823b905060008111915050919050565b6060831561265457829050612709565b6000835111156126675782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126ce5780820151818401526020810190506126b3565b50505050905090810190601f1680156126fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656445434453413a20696e76616c6964207369676e6174757265202773272076616c7565416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c45434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ffd17ddaa9f7b0be467a221e9d87bd925eaa3228260891b65f955420ec64a22764736f6c634300060c00330000000000000000000000000000000000000000000000000018de76816d8000000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e
Deployed Bytecode
0x6080604052600436106100915760003560e01c8063bffec16d11610059578063bffec16d146107ae578063c59fb24a146108b0578063ddca3f431461093f578063ed7bc9af1461096a578063fbfa77cf14610ada57610091565b8063230fc56c146100965780635f57fc041461015957806371108aa91461033c578063b2b36d2c14610692578063b80698871461075f575b600080fd5b3480156100a257600080fd5b50610143600480360360c08110156100b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b1b565b6040518082815260200191505060405180910390f35b34801561016557600080fd5b50610326600480360360e081101561017c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101d957600080fd5b8201836020820111156101eb57600080fd5b8035906020019184602083028401116401000000008311171561020d57600080fd5b90919293919293908035906020019064010000000081111561022e57600080fd5b82018360208201111561024057600080fd5b8035906020019184602083028401116401000000008311171561026257600080fd5b90919293919293908035906020019064010000000081111561028357600080fd5b82018360208201111561029557600080fd5b803590602001918460208302840111640100000000831117156102b757600080fd5b9091929391929390803590602001906401000000008111156102d857600080fd5b8201836020820111156102ea57600080fd5b8035906020019184602083028401116401000000008311171561030c57600080fd5b909192939192939080359060200190929190505050610c34565b6040518082815260200191505060405180910390f35b610690600480360361010081101561035357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156103b057600080fd5b8201836020820111156103c257600080fd5b803590602001918460208302840111640100000000831117156103e457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184602083028401116401000000008311171561047857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104d857600080fd5b8201836020820111156104ea57600080fd5b8035906020019184602083028401116401000000008311171561050c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561056c57600080fd5b82018360208201111561057e57600080fd5b803590602001918460208302840111640100000000831117156105a057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561060057600080fd5b82018360208201111561061257600080fd5b8035906020019184600183028401116401000000008311171561063457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050610dcc565b005b34801561069e57600080fd5b50610749600480360360e08110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611113565b6040518082815260200191505060405180910390f35b34801561076b57600080fd5b506107986004803603602081101561078257600080fd5b8101908080359060200190929190505050611131565b6040518082815260200191505060405180910390f35b6108ae60048036036101008110156107c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561086057600080fd5b82018360208201111561087257600080fd5b8035906020019184600183028401116401000000008311171561089457600080fd5b909192939192939080359060200190929190505050611149565b005b3480156108bc57600080fd5b5061093d600480360360a08110156108d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611384565b005b34801561094b57600080fd5b5061095461139f565b6040518082815260200191505060405180910390f35b34801561097657600080fd5b50610ad8600480360360a081101561098d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156109ea57600080fd5b8201836020820111156109fc57600080fd5b80359060200191846020830284011164010000000083111715610a1e57600080fd5b909192939192939080359060200190640100000000811115610a3f57600080fd5b820183602082011115610a5157600080fd5b80359060200191846020830284011164010000000083111715610a7357600080fd5b909192939192939080359060200190640100000000811115610a9457600080fd5b820183602082011115610aa657600080fd5b80359060200191846020830284011164010000000083111715610ac857600080fd5b90919293919293905050506113c3565b005b348015610ae657600080fd5b50610aef611433565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60007f36ef74f5ee8d7b6f268672a95fb4162e7efc570de9585db877bcb1123c14c5237f000000000000000000000000000000000000000000000000000000000000000130898989898989604051602001808a81526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1660601b81526014018773ffffffffffffffffffffffffffffffffffffffff1660601b81526014018673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200199505050505050505050506040516020818303038152906040528051906020012090509695505050505050565b6000808686905090506000811415610c50576000915050610dbd565b6000915060005b60018203811015610d20576000610cf18f8f8f8f86818110610c7557fe5b905060200201358e8e87818110610c8857fe5b905060200201358d8d88818110610c9b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168c8c89818110610cc457fe5b905060200201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611457565b905060008185019050848111610d0e576000945050505050610dbd565b80945050508080600101915050610c57565b5060006001820390506000610d988f8f8f8f86818110610d3c57fe5b905060200201358e8e87818110610d4f57fe5b905060200201358d8d88818110610d6257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168c8c89818110610d8b57fe5b905060200201358b611457565b905060008185019050848111610db5576000945050505050610dbd565b809450505050505b9b9a5050505050505050505050565b60026000541415610e45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600081905550600033905060008551905060008111610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c6964206c656e67746800000000000000000000000000000000000081525060200191505060405180910390fd5b6000805b60018303811015610f90576060610ee987836116bc565b90506000610f6a8e8e8e8681518110610efe57fe5b60200260200101518e8781518110610f1257fe5b60200260200101518e8881518110610f2657fe5b60200260200101518e8981518110610f3a57fe5b6020026020010151888d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611789565b9050610f7f8185611cb990919063ffffffff16565b935050508080600101915050610ed2565b5060006001830390506060610fa587836116bc565b905060006110068e8e8e8681518110610fba57fe5b60200260200101518e8781518110610fce57fe5b60200260200101518e8881518110610fe257fe5b60200260200101518e8981518110610ff657fe5b6020026020010151888d8f611789565b905061101b8185611cb990919063ffffffff16565b9350505050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614156110b05761109e817f000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e73ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b600047146110ab57600080fd5b6110fe565b6110fd837f000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e838d73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b50505060016000819055505050505050505050565b600061112488888888888888611457565b9050979650505050505050565b60016020528060005260406000206000915090505481565b600260005414156111c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b6002600081905550600033905060006112268b8b8b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050898b611789565b9050600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415611321576112a6817f000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e73ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b6000471461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6578636573732076616c7565000000000000000000000000000000000000000081525060200191505060405180910390fd5b61136f565b61136e827f000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e838d73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b50506001600081905550505050505050505050565b6000339050611397868686868587611f3c565b505050505050565b7f0000000000000000000000000000000000000000000000000018de76816d800081565b600033905060005b878790508110156114275761141a8a8a8a8a858181106113e757fe5b905060200201358989868181106113fa57fe5b905060200201358689898881811061140e57fe5b90506020020135611f3c565b80806001019150506113cb565b50505050505050505050565b7f000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e81565b60008082141561146a57600090506116b1565b600061147a898989898989610b1b565b90506000600160008381526020019081526020016000205490508781106114a6576000925050506116b1565b600081890390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8514156114dd578094506114f2565b808511156114f157600093505050506116b1565b5b8a73ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561155957600080fd5b505afa15801561156d573d6000803e3d6000fd5b505050506040513d602081101561158357600080fd5b81019080805190602001909291905050508511156115a757600093505050506116b1565b8a73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e88306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561162c57600080fd5b505afa158015611640573d6000803e3d6000fd5b505050506040513d602081101561165657600080fd5b810190808051906020019092919050505085111561167a57600093505050506116b1565b886116a360018b036116958b89611fea90919063ffffffff16565b611cb990919063ffffffff16565b816116aa57fe5b0493505050505b979650505050505050565b60606000826041029050604167ffffffffffffffff811180156116de57600080fd5b506040519080825280601f01601f1916602001820160405280156117115781602001600182028036833780820191505090505b50915060005b604181101561178157848183018151811061172e57fe5b602001015160f81c60f81b83828151811061174557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050611717565b505092915050565b6000808211611800576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e76616c696420616d6f756e7400000000000000000000000000000000000081525060200191505060405180910390fd5b60006118108b8b8b8b8b8b610b1b565b905061181c8186612070565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146118bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f6163636573732064656e6965640000000000000000000000000000000000000081525060200191505060405180910390fd5b600080600160008481526020019081526020016000205490508a811061194a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f696e616374697665206f7264657200000000000000000000000000000000000081525060200191505060405180910390fd5b6000604089901c90506000899050428267ffffffffffffffff161115801561197b57508067ffffffffffffffff1642105b6119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c69642074696d656672616d6500000000000000000000000000000081525060200191505060405180910390fd5b50506000818c0390507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861415611a2657809550611a9d565b80861115611a9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f696e73756666696369656e74206c69717569646974790000000000000000000081525060200191505060405180910390fd5b5b60008c611ac860018f03611aba8f8b611fea90919063ffffffff16565b611cb990919063ffffffff16565b81611acf57fe5b049050670de0b6b3a7640000611b0e7f0000000000000000000000000000000000000000000000000018de76816d800083611fea90919063ffffffff16565b81611b1557fe5b04955085810393508683016001600087815260200190815260200160002081905550505050611b678886868f73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161415611bca57611bc5818973ffffffffffffffffffffffffffffffffffffffff16611d4190919063ffffffff16565b611bf8565b611bf78589838e73ffffffffffffffffffffffffffffffffffffffff16611e7b909392919063ffffffff16565b5b818b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167feb9186f1b50225c6fd042153f6587a288ca915b3754bbaf775250e21ff10132b8785888e8c604051808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a450509998505050505050505050565b600080828401905083811015611d37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b80471015611db7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114611e17576040519150601f19603f3d011682016040523d82523d6000602084013e611e1c565b606091505b5050905080611e76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180612711603a913960400191505060405180910390fd5b505050565b611f36846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612095565b50505050565b6000611f4c878787878787610b1b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600083815260200190815260200160002081905550808673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f01a25b95d7dfd8cb8868928380fc2134b0f9557cd1a1f36066e66b5637a8b68260405160405180910390a450505050505050565b600080831415611ffd576000905061206a565b600082840290508284828161200e57fe5b0414612065576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127b56021913960400191505060405180910390fd5b809150505b92915050565b600061208d8261207f85612184565b6121dc90919063ffffffff16565b905092915050565b60606120f7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124709092919063ffffffff16565b905060008151111561217f5780806020019051602081101561211857600080fd5b810190808051906020019092919050505061217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806127d6602a913960400191505060405180910390fd5b5b505050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114612255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45434453413a20696e76616c6964207369676e6174757265206c656e6774680081525060200191505060405180910390fd5b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c11156122ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061274b6022913960400191505060405180910390fd5b601b8160ff1614806123035750601c8160ff16145b612358576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806127936022913960400191505060405180910390fd5b600060018783868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156123b4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612463576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f45434453413a20696e76616c6964207369676e6174757265000000000000000081525060200191505060405180910390fd5b8094505050505092915050565b606061247f8484600085612488565b90509392505050565b6060824710156124e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061276d6026913960400191505060405180910390fd5b6124ec85612631565b61255e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125ae578051825260208201915060208101905060208303925061258b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612610576040519150601f19603f3d011682016040523d82523d6000602084013e612615565b606091505b5091509150612625828286612644565b92505050949350505050565b600080823b905060008111915050919050565b6060831561265457829050612709565b6000835111156126675782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126ce5780820151818401526020810190506126b3565b50505050905090810190601f1680156126fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d6179206861766520726576657274656445434453413a20696e76616c6964207369676e6174757265202773272076616c7565416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c45434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ffd17ddaa9f7b0be467a221e9d87bd925eaa3228260891b65f955420ec64a22764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000018de76816d8000000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e
-----Decoded View---------------
Arg [0] : _fee (uint256): 7000000000000000
Arg [1] : _vault (address): 0x653EE871Fc59F4035d7564B366a90292c5A8032e
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000018de76816d8000
Arg [1] : 000000000000000000000000653ee871fc59f4035d7564b366a90292c5a8032e
Deployed Bytecode Sourcemap
25534:9536:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26227:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26997:1166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29878:1377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26563:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25826:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29215:658;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33144:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25887:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33405:372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25919:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26227:331;26394:16;25753:67;26463:8;26481:4;26488:10;26500;26512:11;26525;26538:6;26546:5;26436:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26426:127;;;;;;26419:134;;26227:331;;;;;;;;:::o;26997:1166::-;27252:24;27285:15;27303:7;;:14;;27285:32;;27337:1;27326:7;:12;27322:26;;;27347:1;27340:8;;;;;27322:26;27372:1;27353:20;;27383:10;27378:376;27414:1;27404:7;:11;27399:2;:16;27378:376;;;27429:24;27456:118;27477:10;27489;27501:12;;27514:2;27501:16;;;;;;;;;;;;;27519:12;;27532:2;27519:16;;;;;;;;;;;;;27537:7;;27545:2;27537:11;;;;;;;;;;;;;;;27550:6;;27557:2;27550:10;;;;;;;;;;;;;27570:2;27456:20;:118::i;:::-;27429:145;;27580:27;27629:16;27610;:35;27580:65;;27678:16;27655:19;:39;27651:53;;27703:1;27696:8;;;;;;;;27651:53;27729:19;27710:38;;27378:376;;27417:4;;;;;;;27378:376;;;;27764:10;27787:1;27777:7;:11;27764:24;;27794;27821:130;27842:10;27854;27866:12;;27879:2;27866:16;;;;;;;;;;;;;27884:12;;27897:2;27884:16;;;;;;;;;;;;;27902:7;;27910:2;27902:11;;;;;;;;;;;;;;;27915:6;;27922:2;27915:10;;;;;;;;;;;;;27927:23;27821:20;:130::i;:::-;27794:157;;27957:27;28006:16;27987;:35;27957:65;;28055:16;28032:19;:39;28028:53;;28080:1;28073:8;;;;;;;;28028:53;28106:19;28087:38;;26997:1166;;;28135:23;26997:1166;;;;;;;;;;;;;;:::o;29878:1377::-;24482:1;25088:7;;:19;;25080:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24482:1;25221:7;:18;;;;30158:22:::1;30183:10;30158:35;;30198:15;30216:7;:14;30198:32;;30253:1;30243:7;:11;30235:38;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30278:27;30319:10:::0;30314:362:::1;30350:1;30340:7;:11;30335:2;:16;30314:362;;;30365:23;30391:34;30409:11;30422:2;30391:17;:34::i;:::-;30365:60;;30431:30;30464:131;30478:10;30490;30502:12;30515:2;30502:16;;;;;;;;;;;;;;30520:12;30533:2;30520:16;;;;;;;;;;;;;;30538:7;30546:2;30538:11;;;;;;;;;;;;;;30551:6;30558:2;30551:10;;;;;;;;;;;;;;30563;30575:6;30591:2;30464:13;:131::i;:::-;30431:164;;30623:47;30647:22;30623:19;:23;;:47;;;;:::i;:::-;30601:69;;30314:362;;30353:4;;;;;;;30314:362;;;;30686:10;30709:1;30699:7;:11;30686:24;;30716:23;30742:34;30760:11;30773:2;30742:17;:34::i;:::-;30716:60;;30782:30;30815:143;30829:10;30841;30853:12;30866:2;30853:16;;;;;;;;;;;;;;30871:12;30884:2;30871:16;;;;;;;;;;;;;;30889:7;30897:2;30889:11;;;;;;;;;;;;;;30902:6;30909:2;30902:10;;;;;;;;;;;;;;30914;30926:6;30934:23;30815:13;:143::i;:::-;30782:176;;30986:47;31010:22;30986:19;:23;;:47;;;;:::i;:::-;30964:69;;25252:1;;;31069;31047:24;;:10;:24;;;31043:208;;;31079:36;31095:19;31079:5;:15;;;;:36;;;;:::i;:::-;31154:1;31129:21;:26;31121:35;;;::::0;::::1;;31043:208;;;31174:71;31210:6;31218:5;31225:19;31181:10;31174:35;;;;:71;;;;;;:::i;:::-;31043:208;25252:1;;;24438::::0;25400:7;:22;;;;29878:1377;;;;;;;;:::o;26563:353::-;26765:24;26805:106;26826:10;26838;26850:11;26863;26876:6;26884:5;26891:19;26805:20;:106::i;:::-;26798:113;;26563:353;;;;;;;;;:::o;25826:55::-;;;;;;;;;;;;;;;;;:::o;29215:658::-;24482:1;25088:7;;:19;;25080:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24482:1;25221:7;:18;;;;29451:22:::1;29476:10;29451:35;;29491:27;29521:119;29535:10;29547;29559:11;29572;29585:6;29593:5;29600:10;;29521:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29612:6;29620:19;29521:13;:119::i;:::-;29491:149;;29671:1;29649:24;;:10;:24;;;29645:224;;;29681:36;29697:19;29681:5;:15;;;;:36;;;;:::i;:::-;29756:1;29731:21;:26;29723:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29645:224;;;29792:71;29828:6;29836:5;29843:19;29799:10;29792:35;;;;:71;;;;;;:::i;:::-;29645:224;25252:1;;24438::::0;25400:7;:22;;;;29215:658;;;;;;;;;:::o;33144:256::-;33278:22;33303:10;33278:35;;33318:77;33331:10;33343;33355:11;33368;33381:6;33389:5;33318:12;:77::i;:::-;33144:256;;;;;;:::o;25887:28::-;;;:::o;33405:372::-;33576:22;33601:10;33576:35;;33621:10;33616:157;33642:12;;:19;;33637:2;:24;33616:157;;;33675:92;33688:10;33700;33712:12;;33725:2;33712:16;;;;;;;;;;;;;33730:12;;33743:2;33730:16;;;;;;;;;;;;;33748:6;33756;;33763:2;33756:10;;;;;;;;;;;;;33675:12;:92::i;:::-;33663:4;;;;;;;33616:157;;;;33405:372;;;;;;;;;:::o;25919:38::-;;;:::o;28168:1042::-;28371:27;28434:1;28411:19;:24;28407:38;;;28444:1;28437:8;;;;28407:38;28450:16;28469:80;28485:10;28497;28509:11;28522;28535:6;28543:5;28469:15;:80::i;:::-;28450:99;;28554:27;28584:19;:29;28604:8;28584:29;;;;;;;;;;;;28554:59;;28645:11;28622:19;:34;28618:48;;28665:1;28658:8;;;;;;28618:48;28671:28;28716:19;28702:11;:33;28671:64;;28775:2;28744:19;:34;28740:168;;;28808:20;28786:42;;28740:168;;;28872:20;28850:19;:42;28846:56;;;28901:1;28894:8;;;;;;;28846:56;28740:168;28945:10;28938:28;;;28967:6;28938:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28916:19;:58;28912:72;;;28983:1;28976:8;;;;;;;28912:72;29022:10;29015:28;;;29044:6;29060:4;29015:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28993:19;:73;28989:87;;;29075:1;29068:8;;;;;;;28989:87;29163:11;29103:57;29158:1;29144:11;:15;29103:36;29127:11;29103:19;:23;;:36;;;;:::i;:::-;:40;;:57;;;;:::i;:::-;:71;;;;;;29081:93;;29179:26;;;28168:1042;;;;;;;;;;:::o;34153:305::-;34245:23;34277:15;34300:6;34295:2;:11;34277:29;;34334:2;34324:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34311:26;;34347:10;34342:90;34368:2;34363;:7;34342:90;;;34401:11;34423:2;34413:7;:12;34401:25;;;;;;;;;;;;;;;;34384:10;34395:2;34384:14;;;;;;;;;;;:42;;;;;;;;;;;34372:4;;;;;;;34342:90;;;;34436:17;34153:305;;;;:::o;31260:1879::-;31500:30;31569:1;31547:19;:23;31539:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31594:16;31613:80;31629:10;31641;31653:11;31666;31679:6;31687:5;31613:15;:80::i;:::-;31594:99;;31716:36;31731:8;31741:10;31716:14;:36::i;:::-;31706:46;;:6;:46;;;31698:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31775:30;31816:27;31846:19;:29;31866:8;31846:29;;;;;;;;;;;;31816:59;;31911:11;31889:19;:33;31881:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31954:17;31990:2;31981:5;:11;;31954:39;;32000:15;32025:5;32000:31;;32060:3;32046:10;:17;;;;:35;;;;;32073:8;32067:14;;:3;:14;32046:35;32038:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31260:1879;;32115:28;32160:19;32146:11;:33;32115:64;;32220:2;32189:19;:34;32185:194;;;32254:20;32232:42;;32185:194;;;32325:20;32302:19;:43;;32294:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32185:194;32384:27;32474:11;32414:57;32469:1;32455:11;:15;32414:36;32438:11;32414:19;:23;;:36;;;;:::i;:::-;:40;;:57;;;;:::i;:::-;:71;;;;;;32384:101;;32547:4;32516:28;32540:3;32516:19;:23;;:28;;;;:::i;:::-;:35;;;;;;32491:60;;32604:22;32582:19;:44;32557:69;;32686:19;32664;:41;32632:19;:29;32652:8;32632:29;;;;;;;;;;;:73;;;;31260:1879;;;32715:72;32751:6;32759;32767:19;32722:10;32715:35;;;;:72;;;;;;:::i;:::-;32818:1;32796:24;;:10;:24;;;32792:175;;;32828:40;32845:22;32828:6;:16;;;;:40;;;;:::i;:::-;32792:175;;;32886:75;32922:6;32930;32938:22;32893:10;32886:35;;;;:75;;;;;;:::i;:::-;32792:175;33006:8;32994:10;32976:124;;32982:10;32976:124;;;33016:19;33037:22;33061;33085:6;33093;32976:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33105:29;;31260:1879;;;;;;;;;;;:::o;4699:181::-;4757:7;4777:9;4793:1;4789;:5;4777:17;;4818:1;4813;:6;;4805:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4871:1;4864:8;;;4699:181;;;;:::o;14097:397::-;14212:6;14187:21;:31;;14179:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14344:12;14362:9;:14;;14385:6;14362:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14343:54;;;14416:7;14408:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14097:397;;;:::o;19844:205::-;19945:96;19965:5;19995:27;;;20024:4;20030:2;20034:5;19972:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19945:19;:96::i;:::-;19844:205;;;;:::o;33782:366::-;33941:16;33960:80;33976:10;33988;34000:11;34013;34026:6;34034:5;33960:15;:80::i;:::-;33941:99;;34085:2;34045:19;:29;34065:8;34045:29;;;;;;;;;;;:43;;;;34134:8;34122:10;34098:45;;34110:10;34098:45;;;;;;;;;;;;33782:366;;;;;;;:::o;6053:471::-;6111:7;6361:1;6356;:6;6352:47;;;6386:1;6379:8;;;;6352:47;6411:9;6427:1;6423;:5;6411:17;;6456:1;6451;6447;:5;;;;;;:10;6439:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6515:1;6508:8;;;6053:471;;;;;:::o;34463:173::-;34550:15;34581:50;34620:10;34581:30;:5;:28;:30::i;:::-;:38;;:50;;;;:::i;:::-;34574:57;;34463:173;;;;:::o;21964:761::-;22388:23;22414:69;22442:4;22414:69;;;;;;;;;;;;;;;;;22422:5;22414:27;;;;:69;;;;;:::i;:::-;22388:95;;22518:1;22498:10;:17;:21;22494:224;;;22640:10;22629:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22621:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22494:224;21964:761;;;:::o;3492:269::-;3561:7;3747:4;3694:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3684:69;;;;;;3677:76;;3492:269;;;:::o;1167:2051::-;1245:7;1328:2;1308:9;:16;:22;1304:96;;1347:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1304:96;1469:9;1489;1509:7;1761:4;1750:9;1746:20;1740:27;1735:32;;1807:4;1796:9;1792:20;1786:27;1781:32;;1861:4;1850:9;1846:20;1840:27;1837:1;1832:36;1827:41;;2796:66;2790:1;2782:10;;:80;;2774:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2925:2;2920:1;:7;;;:18;;;;2936:2;2931:1;:7;;;2920:18;2912:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3075:14;3092:24;3102:4;3108:1;3111;3114;3092:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3075:41;;3153:1;3135:20;;:6;:20;;;;3127:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3204:6;3197:13;;;;;;1167:2051;;;;:::o;15658:195::-;15761:12;15793:52;15815:6;15823:4;15829:1;15832:12;15793:21;:52::i;:::-;15786:59;;15658:195;;;;;:::o;16710:530::-;16837:12;16895:5;16870:21;:30;;16862:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16962:18;16973:6;16962:10;:18::i;:::-;16954:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17088:12;17102:23;17129:6;:11;;17149:5;17157:4;17129:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17087:75;;;;17180:52;17198:7;17207:10;17219:12;17180:17;:52::i;:::-;17173:59;;;;16710:530;;;;;;:::o;12740:422::-;12800:4;13008:12;13119:7;13107:20;13099:28;;13153:1;13146:4;:8;13139:15;;;12740:422;;;:::o;18246:742::-;18361:12;18390:7;18386:595;;;18421:10;18414:17;;;;18386:595;18555:1;18535:10;:17;:21;18531:439;;;18798:10;18792:17;18859:15;18846:10;18842:2;18838:19;18831:44;18746:148;18941:12;18934:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18246:742;;;;;;:::o
Swarm Source
ipfs://ffd17ddaa9f7b0be467a221e9d87bd925eaa3228260891b65f955420ec64a227
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.