More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 305,298 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 25013538 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013524 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013509 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013500 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013492 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013485 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013476 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013409 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013395 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013379 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013360 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013283 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013271 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013259 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013237 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013190 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013176 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013107 | 707 days ago | IN | 1.64 BNB | 0.00559151 | ||||
Swap | 25013008 | 707 days ago | IN | 1.64 BNB | 0.00711839 | ||||
Swap | 25012675 | 707 days ago | IN | 0.33 BNB | 0.00711839 | ||||
0x090411a3 | 25012555 | 707 days ago | IN | 0.33 BNB | 0.00019328 | ||||
0x090411a3 | 25012429 | 707 days ago | IN | 0.33 BNB | 0.00019328 | ||||
Swap | 25012043 | 707 days ago | IN | 0.01 BNB | 0.00711821 | ||||
Swap | 25011913 | 707 days ago | IN | 0.01 BNB | 0.00711821 | ||||
Swap | 25011629 | 707 days ago | IN | 0.01 BNB | 0.00711821 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
25013538 | 707 days ago | 1.64 BNB | ||||
25013524 | 707 days ago | 1.64 BNB | ||||
25013509 | 707 days ago | 1.64 BNB | ||||
25013500 | 707 days ago | 1.64 BNB | ||||
25013492 | 707 days ago | 1.64 BNB | ||||
25013485 | 707 days ago | 1.64 BNB | ||||
25013476 | 707 days ago | 1.64 BNB | ||||
25013409 | 707 days ago | 1.64 BNB | ||||
25013395 | 707 days ago | 1.64 BNB | ||||
25013379 | 707 days ago | 1.64 BNB | ||||
25013360 | 707 days ago | 1.64 BNB | ||||
25013283 | 707 days ago | 1.64 BNB | ||||
25013271 | 707 days ago | 1.64 BNB | ||||
25013259 | 707 days ago | 1.64 BNB | ||||
25013237 | 707 days ago | 1.64 BNB | ||||
25013190 | 707 days ago | 1.64 BNB | ||||
25013176 | 707 days ago | 1.64 BNB | ||||
25013107 | 707 days ago | 1.64 BNB | ||||
25013008 | 707 days ago | 1.64 BNB | ||||
25012675 | 707 days ago | 0.33 BNB | ||||
25012043 | 707 days ago | 0.01 BNB | ||||
25011913 | 707 days ago | 0.01 BNB | ||||
25011629 | 707 days ago | 0.01 BNB | ||||
25011377 | 707 days ago | 0.01 BNB | ||||
25006433 | 707 days ago | 0.01 BNB |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OneInchExchange
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2021-02-18 */ // File: @openzeppelin/contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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 in 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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; /** * @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/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: contracts/interfaces/IChi.sol pragma solidity ^0.6.12; interface IChi is IERC20 { function mint(uint256 value) external; function free(uint256 value) external returns (uint256 freed); function freeFromUpTo(address from, uint256 value) external returns (uint256 freed); } // File: contracts/interfaces/IERC20Permit.sol pragma solidity ^0.6.12; interface IERC20Permit { function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; } // File: contracts/interfaces/IGasDiscountExtension.sol pragma solidity ^0.6.12; interface IGasDiscountExtension { function calculateGas(uint256 gasUsed, uint256 flags, uint256 calldataLength) external pure returns (IChi, uint256); } // File: contracts/interfaces/ISafeERC20Extension.sol pragma solidity ^0.6.12; interface ISafeERC20Extension { function safeApprove(IERC20 token, address spender, uint256 amount) external; function safeTransfer(IERC20 token, address payable target, uint256 amount) external; } // File: contracts/interfaces/IOneInchCaller.sol pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; interface IOneInchCaller is ISafeERC20Extension, IGasDiscountExtension { struct CallDescription { uint256 targetWithMandatory; uint256 gasLimit; uint256 value; bytes data; } function makeCall(CallDescription memory desc) external; function makeCalls(CallDescription[] memory desc) external payable; } // File: contracts/helpers/RevertReasonParser.sol pragma solidity ^0.6.12; library RevertReasonParser { function parse(bytes memory data, string memory prefix) internal pure returns (string memory) { // https://solidity.readthedocs.io/en/latest/control-structures.html#revert // We assume that revert reason is abi-encoded as Error(string) // 68 = 4-byte selector 0x08c379a0 + 32 bytes offset + 32 bytes length if (data.length >= 68 && data[0] == "\x08" && data[1] == "\xc3" && data[2] == "\x79" && data[3] == "\xa0") { string memory reason; // solhint-disable no-inline-assembly assembly { // 68 = 32 bytes data length + 4-byte selector + 32 bytes offset reason := add(data, 68) } /* revert reason is padded up to 32 bytes with ABI encoder: Error(string) also sometimes there is extra 32 bytes of zeros padded in the end: https://github.com/ethereum/solidity/issues/10170 because of that we can't check for equality and instead check that string length + extra 68 bytes is less than overall data length */ require(data.length >= 68 + bytes(reason).length, "Invalid revert reason"); return string(abi.encodePacked(prefix, "Error(", reason, ")")); } // 36 = 4-byte selector 0x4e487b71 + 32 bytes integer else if (data.length == 36 && data[0] == "\x4e" && data[1] == "\x48" && data[2] == "\x7b" && data[3] == "\x71") { uint256 code; // solhint-disable no-inline-assembly assembly { // 36 = 32 bytes data length + 4-byte selector code := mload(add(data, 36)) } return string(abi.encodePacked(prefix, "Panic(", _toHex(code), ")")); } return string(abi.encodePacked(prefix, "Unknown()")); } function _toHex(uint256 value) private pure returns(string memory) { return _toHex(abi.encodePacked(value)); } function _toHex(bytes memory data) private pure returns(string memory) { bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(2 + data.length * 2); str[0] = "0"; str[1] = "x"; for (uint256 i = 0; i < data.length; i++) { str[2 * i + 2] = alphabet[uint8(data[i] >> 4)]; str[2 * i + 3] = alphabet[uint8(data[i] & 0x0f)]; } return string(str); } } // File: contracts/helpers/UniERC20.sol pragma solidity ^0.6.12; library UniERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant _ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); IERC20 private constant _ZERO_ADDRESS = IERC20(0); function isETH(IERC20 token) internal pure returns (bool) { return (token == _ZERO_ADDRESS || token == _ETH_ADDRESS); } function uniBalanceOf(IERC20 token, address account) internal view returns (uint256) { if (isETH(token)) { return account.balance; } else { return token.balanceOf(account); } } function uniTransfer(IERC20 token, address payable to, uint256 amount) internal { if (amount > 0) { if (isETH(token)) { to.transfer(amount); } else { token.safeTransfer(to, amount); } } } function uniApprove(IERC20 token, address to, uint256 amount) internal { require(!isETH(token), "Approve called on ETH"); if (amount == 0) { token.safeApprove(to, 0); } else { uint256 allowance = token.allowance(address(this), to); if (allowance < amount) { if (allowance > 0) { token.safeApprove(to, 0); } token.safeApprove(to, amount); } } } } // File: contracts/OneInchExchange.sol pragma solidity ^0.6.12; contract OneInchExchange is Ownable, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; using UniERC20 for IERC20; uint256 private constant _PARTIAL_FILL = 0x01; uint256 private constant _REQUIRES_EXTRA_ETH = 0x02; uint256 private constant _SHOULD_CLAIM = 0x04; uint256 private constant _BURN_FROM_MSG_SENDER = 0x08; uint256 private constant _BURN_FROM_TX_ORIGIN = 0x10; struct SwapDescription { IERC20 srcToken; IERC20 dstToken; address srcReceiver; address dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 guaranteedAmount; uint256 flags; address referrer; bytes permit; } event Swapped( address indexed sender, IERC20 indexed srcToken, IERC20 indexed dstToken, address dstReceiver, uint256 amount, uint256 spentAmount, uint256 returnAmount, uint256 minReturnAmount, uint256 guaranteedAmount, address referrer ); event Error( string reason ); function discountedSwap( IOneInchCaller caller, SwapDescription calldata desc, IOneInchCaller.CallDescription[] calldata calls ) external payable returns (uint256 returnAmount) { uint256 initialGas = gasleft(); address chiSource = address(0); if (desc.flags & _BURN_FROM_MSG_SENDER != 0) { chiSource = msg.sender; } else if (desc.flags & _BURN_FROM_TX_ORIGIN != 0) { chiSource = tx.origin; // solhint-disable-line avoid-tx-origin } else { revert("Incorrect CHI burn flags"); } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory data) = address(this).delegatecall(abi.encodeWithSelector(this.swap.selector, caller, desc, calls)); if (success) { returnAmount = abi.decode(data, (uint256)); } else { if (msg.value > 0) { msg.sender.transfer(msg.value); } emit Error(RevertReasonParser.parse(data, "Swap failed: ")); } (IChi chi, uint256 amount) = caller.calculateGas(initialGas.sub(gasleft()), desc.flags, msg.data.length); chi.freeFromUpTo(chiSource, amount); } function swap( IOneInchCaller caller, SwapDescription calldata desc, IOneInchCaller.CallDescription[] calldata calls ) external payable whenNotPaused returns (uint256 returnAmount) { require(desc.minReturnAmount > 0, "Min return should not be 0"); require(calls.length > 0, "Call data should exist"); uint256 flags = desc.flags; IERC20 srcToken = desc.srcToken; IERC20 dstToken = desc.dstToken; if (flags & _REQUIRES_EXTRA_ETH != 0) { require(msg.value > (srcToken.isETH() ? desc.amount : 0), "Invalid msg.value"); } else { require(msg.value == (srcToken.isETH() ? desc.amount : 0), "Invalid msg.value"); } if (flags & _SHOULD_CLAIM != 0) { require(!srcToken.isETH(), "Claim token is ETH"); _claim(srcToken, desc.srcReceiver, desc.amount, desc.permit); } address dstReceiver = (desc.dstReceiver == address(0)) ? msg.sender : desc.dstReceiver; uint256 initialSrcBalance = (flags & _PARTIAL_FILL != 0) ? srcToken.uniBalanceOf(msg.sender) : 0; uint256 initialDstBalance = dstToken.uniBalanceOf(dstReceiver); caller.makeCalls{value: msg.value}(calls); uint256 spentAmount = desc.amount; returnAmount = dstToken.uniBalanceOf(dstReceiver).sub(initialDstBalance); if (flags & _PARTIAL_FILL != 0) { spentAmount = initialSrcBalance.add(desc.amount).sub(srcToken.uniBalanceOf(msg.sender)); require(returnAmount.mul(desc.amount) >= desc.minReturnAmount.mul(spentAmount), "Return amount is not enough"); } else { require(returnAmount >= desc.minReturnAmount, "Return amount is not enough"); } _emitSwapped(desc, srcToken, dstToken, dstReceiver, spentAmount, returnAmount); } function _emitSwapped( SwapDescription calldata desc, IERC20 srcToken, IERC20 dstToken, address dstReceiver, uint256 spentAmount, uint256 returnAmount ) private { emit Swapped( msg.sender, srcToken, dstToken, dstReceiver, desc.amount, spentAmount, returnAmount, desc.minReturnAmount, desc.guaranteedAmount, desc.referrer ); } function _claim(IERC20 token, address dst, uint256 amount, bytes calldata permit) private { // TODO: Is it safe to call permit on tokens without implemented permit? Fallback will be called. Is it bad for proxies? if (permit.length == 32 * 7) { // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory result) = address(token).call(abi.encodeWithSelector(IERC20Permit.permit.selector, permit)); if (!success) { revert(RevertReasonParser.parse(result, "Permit call failed: ")); } } token.safeTransferFrom(msg.sender, dst, amount); } function rescueFunds(IERC20 token, uint256 amount) external onlyOwner { token.uniTransfer(msg.sender, amount); } function pause() external onlyOwner { _pause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"Error","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"srcToken","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"dstToken","type":"address"},{"indexed":false,"internalType":"address","name":"dstReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"guaranteedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"Swapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"contract IOneInchCaller","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"guaranteedAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct OneInchExchange.SwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"uint256","name":"targetWithMandatory","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IOneInchCaller.CallDescription[]","name":"calls","type":"tuple[]"}],"name":"discountedSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOneInchCaller","name":"caller","type":"address"},{"components":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"address","name":"srcReceiver","type":"address"},{"internalType":"address","name":"dstReceiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"uint256","name":"guaranteedAmount","type":"uint256"},{"internalType":"uint256","name":"flags","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"bytes","name":"permit","type":"bytes"}],"internalType":"struct OneInchExchange.SwapDescription","name":"desc","type":"tuple"},{"components":[{"internalType":"uint256","name":"targetWithMandatory","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IOneInchCaller.CallDescription[]","name":"calls","type":"tuple[]"}],"name":"swap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600061001b610077565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b1916905561007b565b3390565b61269f8061008a6000396000f3fe60806040526004361061007b5760003560e01c80638456cb591161004e5780638456cb59146101025780638da5cb5b1461011757806390411a3214610139578063f2fde38b1461014c5761007b565b806334b0793b146100805780635c975abb146100a9578063715018a6146100cb57806378e3214f146100e2575b600080fd5b61009361008e366004611c48565b61016c565b6040516100a09190611f49565b60405180910390f35b3480156100b557600080fd5b506100be610505565b6040516100a09190612028565b3480156100d757600080fd5b506100e0610526565b005b3480156100ee57600080fd5b506100e06100fd366004611c1d565b6105f1565b34801561010e57600080fd5b506100e0610672565b34801561012357600080fd5b5061012c6106d8565b6040516100a09190611f52565b610093610147366004611c48565b6106f4565b34801561015857600080fd5b506100e0610167366004611bb4565b610b71565b6000805a9050600060e0860135600816156101885750336101d7565b60e08601356010161561019c5750326101d7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122ef565b60405180910390fd5b600060603073ffffffffffffffffffffffffffffffffffffffff166390411a3260e01b8a8a8a8a6040516024016102119493929190612047565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161029a9190611e1e565b600060405180830381855af49150503d80600081146102d5576040519150601f19603f3d011682016040523d82523d6000602084013e6102da565b606091505b5091509150811561030057808060200190518101906102f99190611cf0565b94506103aa565b34156103345760405133903480156108fc02916000818181858888f19350505050158015610332573d6000803e3d6000fd5b505b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa610394826040518060400160405280600d81526020017f53776170206661696c65643a2000000000000000000000000000000000000000815250610ca7565b6040516103a19190612165565b60405180910390a15b6000808a73ffffffffffffffffffffffffffffffffffffffff16631d97832e6103d45a8990611070565b8c60e0013560003690506040518463ffffffff1660e01b81526004016103fc93929190612528565b604080518083038186803b15801561041357600080fd5b505afa158015610427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044b9190611bf0565b6040517f079d229f000000000000000000000000000000000000000000000000000000008152919350915073ffffffffffffffffffffffffffffffffffffffff83169063079d229f906104a49088908590600401611fa4565b602060405180830381600087803b1580156104be57600080fd5b505af11580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f69190611cf0565b50505050505050949350505050565b60005474010000000000000000000000000000000000000000900460ff1690565b61052e6110b9565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6105f96110b9565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461064d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b61066e73ffffffffffffffffffffffffffffffffffffffff831633836110bd565b5050565b61067a6110b9565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b6106d6611140565b565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805474010000000000000000000000000000000000000000900460ff161561074a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122b8565b60008460a0013511610788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061235d565b816107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906124f1565b60e084013560006107d36020870187611bb4565b905060006107e76040880160208901611bb4565b9050600283161561085f576108118273ffffffffffffffffffffffffffffffffffffffff16611214565b61081c576000610822565b86608001355b341161085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612281565b6108c7565b61087e8273ffffffffffffffffffffffffffffffffffffffff16611214565b61088957600061088f565b86608001355b34146108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612281565b6004831615610952576108ef8273ffffffffffffffffffffffffffffffffffffffff16611214565b15610926576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906121b6565b6109528261093a60608a0160408b01611bb4565b60808a013561094d6101208c018c61253e565b611267565b60008061096560808a0160608b01611bb4565b73ffffffffffffffffffffffffffffffffffffffff1614610995576109906080890160608a01611bb4565b610997565b335b90506000600185166109aa5760006109ca565b6109ca73ffffffffffffffffffffffffffffffffffffffff851633611419565b905060006109ee73ffffffffffffffffffffffffffffffffffffffff851684611419565b90508a73ffffffffffffffffffffffffffffffffffffffff1663a8920d2b348b8b6040518463ffffffff1660e01b8152600401610a2c929190612014565b6000604051808303818588803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b5050505060808b01359050610a8e82610a8873ffffffffffffffffffffffffffffffffffffffff881687611419565b90611070565b97506001871615610b2557610aca610abc73ffffffffffffffffffffffffffffffffffffffff881633611419565b610a888560808f01356114f0565b9050610ada60a08c01358261152f565b610ae88960808e013561152f565b1015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612326565b610b63565b8a60a00135881015610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612326565b6104f68b878787858d611583565b610b796110b9565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b73ffffffffffffffffffffffffffffffffffffffff8116610c1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906121ed565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606044835110158015610d0e575082600081518110610cc357fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b8015610d6d575082600181518110610d2257fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b8015610dcc575082600281518110610d8157fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b8015610e2b575082600381518110610de057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15610ea1576060604484019050805160440184511015610e77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612426565b8281604051602001610e8a929190611efd565b60405160208183030381529060405291505061106a565b82516024148015610f05575082600081518110610eba57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b8015610f64575082600181518110610f1957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b8015610fc3575082600281518110610f7857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b8015611022575082600381518110610fd757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b156110475760248301518261103682611632565b604051602001610e8a929190611e7b565b816040516020016110589190611e3a565b60405160208183030381529060405290505b92915050565b60006110b283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061165c565b9392505050565b3390565b801561113b576110cc83611214565b1561111a5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611114573d6000803e3d6000fd5b5061113b565b61113b73ffffffffffffffffffffffffffffffffffffffff841683836116a2565b505050565b60005474010000000000000000000000000000000000000000900460ff1615611195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122b8565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111fd6110b9565b60405161120a9190611f52565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff8216158061106a575073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b60e08114156113f057600060608673ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b85856040516024016112a6929190612033565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161132f9190611e1e565b6000604051808303816000865af19150503d806000811461136c576040519150601f19603f3d011682016040523d82523d6000602084013e611371565b606091505b5091509150816113ed576113ba816040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250610ca7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b50505b61141273ffffffffffffffffffffffffffffffffffffffff8616338686611743565b5050505050565b600061142483611214565b15611447575073ffffffffffffffffffffffffffffffffffffffff81163161106a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190611499908590600401611f52565b60206040518083038186803b1580156114b157600080fd5b505afa1580156114c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e99190611cf0565b905061106a565b6000828201838110156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061224a565b60008261153e5750600061106a565b8282028284828161154b57fe5b04146110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612394565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f76af224a143865a50b41496e1a73622698692c565c1214bc862f18e22d829c5e868a6080013587878d60a001358e60c001358f61010001602081019061160f9190611bb4565b6040516116229796959493929190611fca565b60405180910390a4505050505050565b606061106a826040516020016116489190611f49565b60405160208183030381529060405261176a565b6000818484111561169a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b505050900390565b61113b8363a9059cbb60e01b84846040516024016116c1929190611fa4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526119d1565b611764846323b872dd60e01b8585856040516024016116c193929190611f73565b50505050565b6060806040518060400160405280601081526020017f303132333435363738396162636465660000000000000000000000000000000081525090506060835160020260020167ffffffffffffffff811180156117c557600080fd5b506040519080825280601f01601f1916602001820160405280156117f0576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061182157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061187e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b84518110156119c9578260048683815181106118c857fe5b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c90811061190257fe5b602001015160f81c60f81b82826002026002018151811061191f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285828151811061195b57fe5b602091010151815160f89190911c600f1690811061197557fe5b602001015160f81c60f81b82826002026003018151811061199257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016118b0565b509392505050565b6060611a33826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a879092919063ffffffff16565b80519091501561113b5780806020019051810190611a519190611bd0565b61113b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612494565b6060611a968484600085611a9e565b949350505050565b6060611aa985611ba3565b611adf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061245d565b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051611b099190611e1e565b60006040518083038185875af1925050503d8060008114611b46576040519150601f19603f3d011682016040523d82523d6000602084013e611b4b565b606091505b50915091508115611b5f579150611a969050565b805115611b6f5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b3b151590565b803561106a81612644565b600060208284031215611bc5578081fd5b81356110b281612644565b600060208284031215611be1578081fd5b815180151581146110b2578182fd5b60008060408385031215611c02578081fd5b8251611c0d81612644565b6020939093015192949293505050565b60008060408385031215611c2f578182fd5b8235611c3a81612644565b946020939093013593505050565b60008060008060608587031215611c5d578182fd5b8435611c6881612644565b9350602085013567ffffffffffffffff80821115611c84578384fd5b908601906101408289031215611c98578384fd5b90935060408601359080821115611cad578384fd5b818701915087601f830112611cc0578384fd5b813581811115611cce578485fd5b8860208083028501011115611ce1578485fd5b95989497505060200194505050565b600060208284031215611d01578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b818352602080840193600091908185020181018584845b87811015611dc957828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81883603018112611d77578687fd5b87018035855285810135868601526040808201359086015260806060611d9f818401846125b5565b93508282890152611db38389018583611dd6565b9c89019c97505050928601925050600101611d39565b5091979650505050505050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008251611e30818460208701612618565b9190910192915050565b60008251611e4c818460208701612618565b7f556e6b6e6f776e28290000000000000000000000000000000000000000000000920191825250600901919050565b60008351611e8d818460208801612618565b7f50616e69632800000000000000000000000000000000000000000000000000009083019081528351611ec7816006840160208801612618565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b60008351611f0f818460208801612618565b7f4572726f722800000000000000000000000000000000000000000000000000009083019081528351611ec7816006840160208801612618565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b600060208252611a96602083018486611d22565b901515815260200190565b600060208252611a96602083018486611dd6565b600073ffffffffffffffffffffffffffffffffffffffff8616825260606020830152602085016120836060840161207e8389611ba9565b611d08565b61208d81876125a8565b905061209c6080840182611d08565b506120aa60408601866125a8565b6120b760a0840182611d08565b506120c560608601866125a8565b6120d260c0840182611d08565b50608085013560e083015261010060a08601358184015261012060c08701358185015261014060e08801358186015261210d838901896125a8565b925061211d610160860184611d08565b612129828901896125b5565b9350915080610180860152506121446101a085018383611dd6565b915050828103604084015261215a818587611d22565b979650505050505050565b6000602082528251806020840152612184816040850160208701612618565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526018908201527f496e636f727265637420434849206275726e20666c6167730000000000000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f43616c6c20646174612073686f756c6420657869737400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612572578283fd5b83018035915067ffffffffffffffff82111561258c578283fd5b6020019150368190038213156125a157600080fd5b9250929050565b600082356110b281612644565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126125e9578283fd5b830160208101925035905067ffffffffffffffff81111561260957600080fd5b8036038313156125a157600080fd5b60005b8381101561263357818101518382015260200161261b565b838111156117645750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461266657600080fd5b5056fea2646970667358221220c716249da50666596d6ab6b11269702b0d600be7427ab1d68e1e4a28d20aae2564736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061007b5760003560e01c80638456cb591161004e5780638456cb59146101025780638da5cb5b1461011757806390411a3214610139578063f2fde38b1461014c5761007b565b806334b0793b146100805780635c975abb146100a9578063715018a6146100cb57806378e3214f146100e2575b600080fd5b61009361008e366004611c48565b61016c565b6040516100a09190611f49565b60405180910390f35b3480156100b557600080fd5b506100be610505565b6040516100a09190612028565b3480156100d757600080fd5b506100e0610526565b005b3480156100ee57600080fd5b506100e06100fd366004611c1d565b6105f1565b34801561010e57600080fd5b506100e0610672565b34801561012357600080fd5b5061012c6106d8565b6040516100a09190611f52565b610093610147366004611c48565b6106f4565b34801561015857600080fd5b506100e0610167366004611bb4565b610b71565b6000805a9050600060e0860135600816156101885750336101d7565b60e08601356010161561019c5750326101d7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122ef565b60405180910390fd5b600060603073ffffffffffffffffffffffffffffffffffffffff166390411a3260e01b8a8a8a8a6040516024016102119493929190612047565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161029a9190611e1e565b600060405180830381855af49150503d80600081146102d5576040519150601f19603f3d011682016040523d82523d6000602084013e6102da565b606091505b5091509150811561030057808060200190518101906102f99190611cf0565b94506103aa565b34156103345760405133903480156108fc02916000818181858888f19350505050158015610332573d6000803e3d6000fd5b505b7f08c379a0afcc32b1a39302f7cb8073359698411ab5fd6e3edb2c02c0b5fba8aa610394826040518060400160405280600d81526020017f53776170206661696c65643a2000000000000000000000000000000000000000815250610ca7565b6040516103a19190612165565b60405180910390a15b6000808a73ffffffffffffffffffffffffffffffffffffffff16631d97832e6103d45a8990611070565b8c60e0013560003690506040518463ffffffff1660e01b81526004016103fc93929190612528565b604080518083038186803b15801561041357600080fd5b505afa158015610427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044b9190611bf0565b6040517f079d229f000000000000000000000000000000000000000000000000000000008152919350915073ffffffffffffffffffffffffffffffffffffffff83169063079d229f906104a49088908590600401611fa4565b602060405180830381600087803b1580156104be57600080fd5b505af11580156104d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f69190611cf0565b50505050505050949350505050565b60005474010000000000000000000000000000000000000000900460ff1690565b61052e6110b9565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6105f96110b9565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461064d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b61066e73ffffffffffffffffffffffffffffffffffffffff831633836110bd565b5050565b61067a6110b9565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b6106d6611140565b565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000805474010000000000000000000000000000000000000000900460ff161561074a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122b8565b60008460a0013511610788576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061235d565b816107bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906124f1565b60e084013560006107d36020870187611bb4565b905060006107e76040880160208901611bb4565b9050600283161561085f576108118273ffffffffffffffffffffffffffffffffffffffff16611214565b61081c576000610822565b86608001355b341161085a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612281565b6108c7565b61087e8273ffffffffffffffffffffffffffffffffffffffff16611214565b61088957600061088f565b86608001355b34146108c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612281565b6004831615610952576108ef8273ffffffffffffffffffffffffffffffffffffffff16611214565b15610926576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906121b6565b6109528261093a60608a0160408b01611bb4565b60808a013561094d6101208c018c61253e565b611267565b60008061096560808a0160608b01611bb4565b73ffffffffffffffffffffffffffffffffffffffff1614610995576109906080890160608a01611bb4565b610997565b335b90506000600185166109aa5760006109ca565b6109ca73ffffffffffffffffffffffffffffffffffffffff851633611419565b905060006109ee73ffffffffffffffffffffffffffffffffffffffff851684611419565b90508a73ffffffffffffffffffffffffffffffffffffffff1663a8920d2b348b8b6040518463ffffffff1660e01b8152600401610a2c929190612014565b6000604051808303818588803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b5050505060808b01359050610a8e82610a8873ffffffffffffffffffffffffffffffffffffffff881687611419565b90611070565b97506001871615610b2557610aca610abc73ffffffffffffffffffffffffffffffffffffffff881633611419565b610a888560808f01356114f0565b9050610ada60a08c01358261152f565b610ae88960808e013561152f565b1015610b20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612326565b610b63565b8a60a00135881015610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612326565b6104f68b878787858d611583565b610b796110b9565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906123f1565b73ffffffffffffffffffffffffffffffffffffffff8116610c1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906121ed565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606044835110158015610d0e575082600081518110610cc357fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0800000000000000000000000000000000000000000000000000000000000000145b8015610d6d575082600181518110610d2257fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fc300000000000000000000000000000000000000000000000000000000000000145b8015610dcc575082600281518110610d8157fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7900000000000000000000000000000000000000000000000000000000000000145b8015610e2b575082600381518110610de057fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167fa000000000000000000000000000000000000000000000000000000000000000145b15610ea1576060604484019050805160440184511015610e77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612426565b8281604051602001610e8a929190611efd565b60405160208183030381529060405291505061106a565b82516024148015610f05575082600081518110610eba57fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4e00000000000000000000000000000000000000000000000000000000000000145b8015610f64575082600181518110610f1957fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f4800000000000000000000000000000000000000000000000000000000000000145b8015610fc3575082600281518110610f7857fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7b00000000000000000000000000000000000000000000000000000000000000145b8015611022575082600381518110610fd757fe5b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f7100000000000000000000000000000000000000000000000000000000000000145b156110475760248301518261103682611632565b604051602001610e8a929190611e7b565b816040516020016110589190611e3a565b60405160208183030381529060405290505b92915050565b60006110b283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061165c565b9392505050565b3390565b801561113b576110cc83611214565b1561111a5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015611114573d6000803e3d6000fd5b5061113b565b61113b73ffffffffffffffffffffffffffffffffffffffff841683836116a2565b505050565b60005474010000000000000000000000000000000000000000900460ff1615611195576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce906122b8565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111fd6110b9565b60405161120a9190611f52565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff8216158061106a575073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1492915050565b60e08114156113f057600060608673ffffffffffffffffffffffffffffffffffffffff1663d505accf60e01b85856040516024016112a6929190612033565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161132f9190611e1e565b6000604051808303816000865af19150503d806000811461136c576040519150601f19603f3d011682016040523d82523d6000602084013e611371565b606091505b5091509150816113ed576113ba816040518060400160405280601481526020017f5065726d69742063616c6c206661696c65643a20000000000000000000000000815250610ca7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b50505b61141273ffffffffffffffffffffffffffffffffffffffff8616338686611743565b5050505050565b600061142483611214565b15611447575073ffffffffffffffffffffffffffffffffffffffff81163161106a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190611499908590600401611f52565b60206040518083038186803b1580156114b157600080fd5b505afa1580156114c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e99190611cf0565b905061106a565b6000828201838110156110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061224a565b60008261153e5750600061106a565b8282028284828161154b57fe5b04146110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612394565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f76af224a143865a50b41496e1a73622698692c565c1214bc862f18e22d829c5e868a6080013587878d60a001358e60c001358f61010001602081019061160f9190611bb4565b6040516116229796959493929190611fca565b60405180910390a4505050505050565b606061106a826040516020016116489190611f49565b60405160208183030381529060405261176a565b6000818484111561169a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b505050900390565b61113b8363a9059cbb60e01b84846040516024016116c1929190611fa4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526119d1565b611764846323b872dd60e01b8585856040516024016116c193929190611f73565b50505050565b6060806040518060400160405280601081526020017f303132333435363738396162636465660000000000000000000000000000000081525090506060835160020260020167ffffffffffffffff811180156117c557600080fd5b506040519080825280601f01601f1916602001820160405280156117f0576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061182157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061187e57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b84518110156119c9578260048683815181106118c857fe5b016020015182517fff0000000000000000000000000000000000000000000000000000000000000090911690911c60f81c90811061190257fe5b602001015160f81c60f81b82826002026002018151811061191f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508285828151811061195b57fe5b602091010151815160f89190911c600f1690811061197557fe5b602001015160f81c60f81b82826002026003018151811061199257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016118b0565b509392505050565b6060611a33826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a879092919063ffffffff16565b80519091501561113b5780806020019051810190611a519190611bd0565b61113b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce90612494565b6060611a968484600085611a9e565b949350505050565b6060611aa985611ba3565b611adf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9061245d565b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051611b099190611e1e565b60006040518083038185875af1925050503d8060008114611b46576040519150601f19603f3d011682016040523d82523d6000602084013e611b4b565b606091505b50915091508115611b5f579150611a969050565b805115611b6f5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101ce9190612165565b3b151590565b803561106a81612644565b600060208284031215611bc5578081fd5b81356110b281612644565b600060208284031215611be1578081fd5b815180151581146110b2578182fd5b60008060408385031215611c02578081fd5b8251611c0d81612644565b6020939093015192949293505050565b60008060408385031215611c2f578182fd5b8235611c3a81612644565b946020939093013593505050565b60008060008060608587031215611c5d578182fd5b8435611c6881612644565b9350602085013567ffffffffffffffff80821115611c84578384fd5b908601906101408289031215611c98578384fd5b90935060408601359080821115611cad578384fd5b818701915087601f830112611cc0578384fd5b813581811115611cce578485fd5b8860208083028501011115611ce1578485fd5b95989497505060200194505050565b600060208284031215611d01578081fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff169052565b818352602080840193600091908185020181018584845b87811015611dc957828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81883603018112611d77578687fd5b87018035855285810135868601526040808201359086015260806060611d9f818401846125b5565b93508282890152611db38389018583611dd6565b9c89019c97505050928601925050600101611d39565b5091979650505050505050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008251611e30818460208701612618565b9190910192915050565b60008251611e4c818460208701612618565b7f556e6b6e6f776e28290000000000000000000000000000000000000000000000920191825250600901919050565b60008351611e8d818460208801612618565b7f50616e69632800000000000000000000000000000000000000000000000000009083019081528351611ec7816006840160208801612618565b7f290000000000000000000000000000000000000000000000000000000000000060069290910191820152600701949350505050565b60008351611f0f818460208801612618565b7f4572726f722800000000000000000000000000000000000000000000000000009083019081528351611ec7816006840160208801612618565b90815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff9788168152602081019690965260408601949094526060850192909252608084015260a083015290911660c082015260e00190565b600060208252611a96602083018486611d22565b901515815260200190565b600060208252611a96602083018486611dd6565b600073ffffffffffffffffffffffffffffffffffffffff8616825260606020830152602085016120836060840161207e8389611ba9565b611d08565b61208d81876125a8565b905061209c6080840182611d08565b506120aa60408601866125a8565b6120b760a0840182611d08565b506120c560608601866125a8565b6120d260c0840182611d08565b50608085013560e083015261010060a08601358184015261012060c08701358185015261014060e08801358186015261210d838901896125a8565b925061211d610160860184611d08565b612129828901896125b5565b9350915080610180860152506121446101a085018383611dd6565b915050828103604084015261215a818587611d22565b979650505050505050565b6000602082528251806020840152612184816040850160208701612618565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526012908201527f436c61696d20746f6b656e206973204554480000000000000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526011908201527f496e76616c6964206d73672e76616c7565000000000000000000000000000000604082015260600190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526018908201527f496e636f727265637420434849206275726e20666c6167730000000000000000604082015260600190565b6020808252601b908201527f52657475726e20616d6f756e74206973206e6f7420656e6f7567680000000000604082015260600190565b6020808252601a908201527f4d696e2072657475726e2073686f756c64206e6f742062652030000000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526015908201527f496e76616c69642072657665727420726561736f6e0000000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526016908201527f43616c6c20646174612073686f756c6420657869737400000000000000000000604082015260600190565b9283526020830191909152604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612572578283fd5b83018035915067ffffffffffffffff82111561258c578283fd5b6020019150368190038213156125a157600080fd5b9250929050565b600082356110b281612644565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126125e9578283fd5b830160208101925035905067ffffffffffffffff81111561260957600080fd5b8036038313156125a157600080fd5b60005b8381101561263357818101518382015260200161261b565b838111156117645750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461266657600080fd5b5056fea2646970667358221220c716249da50666596d6ab6b11269702b0d600be7427ab1d68e1e4a28d20aae2564736f6c634300060c0033
Deployed Bytecode Sourcemap
29323:5798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30471:1287;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22327:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2745:148::-;;;;;;;;;;;;;:::i;:::-;;34921:126;;;;;;;;;;-1:-1:-1;34921:126:0;;;;;:::i;:::-;;:::i;35055:63::-;;;;;;;;;;;;;:::i;2103:79::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31766:1927::-;;;;;;:::i;:::-;;:::i;3048:244::-;;;;;;;;;;-1:-1:-1;3048:244:0;;;;;:::i;:::-;;:::i;30471:1287::-;30685:20;30723:18;30744:9;30723:30;-1:-1:-1;30766:17:0;30811:10;;;;29687:4;30811:34;:39;30807:299;;-1:-1:-1;30879:10:0;30807:299;;;30911:10;;;;29746:4;30911:33;:38;30907:199;;-1:-1:-1;30978:9:0;30907:199;;;31060:34;;;;;;;;;;:::i;:::-;;;;;;;;30907:199;31179:12;31193:17;31222:4;31214:26;;31264:18;;;31284:6;31292:4;31298:5;;31241:63;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31214:91;;;;31241:63;31214:91;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31178:127;;;;31320:7;31316:272;;;31370:4;31359:27;;;;;;;;;;;;:::i;:::-;31344:42;;31316:272;;;31423:9;:13;31419:84;;31457:30;;:10;;31477:9;31457:30;;;;;;;;;31477:9;31457:10;:30;;;;;;;;;;;;;;;;;;;;;31419:84;31522:54;31528:47;31553:4;31528:47;;;;;;;;;;;;;;;;;:24;:47::i;:::-;31522:54;;;;;;:::i;:::-;;;;;;;;31316:272;31601:8;31611:14;31629:6;:19;;;31649:25;31664:9;31649:10;;:14;:25::i;:::-;31676:4;:10;;;31688:8;;:15;;31629:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31715:35;;;;;31600:104;;-1:-1:-1;31600:104:0;-1:-1:-1;31715:16:0;;;;;;:35;;31732:9;;31600:104;;31715:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30471:1287;;;;;;;;;;;;:::o;22327:78::-;22366:4;22390:7;;;;;;;22327:78::o;2745:148::-;2325:12;:10;:12::i;:::-;2315:6;;:22;:6;;;:22;;;2307:67;;;;;;;;;;;;:::i;:::-;2852:1:::1;2836:6:::0;;2815:40:::1;::::0;::::1;2836:6:::0;;::::1;::::0;2815:40:::1;::::0;2852:1;;2815:40:::1;2883:1;2866:19:::0;;;::::1;::::0;;2745:148::o;34921:126::-;2325:12;:10;:12::i;:::-;2315:6;;:22;:6;;;:22;;;2307:67;;;;;;;;;;;;:::i;:::-;35002:37:::1;:17;::::0;::::1;35020:10;35032:6:::0;35002:17:::1;:37::i;:::-;34921:126:::0;;:::o;35055:63::-;2325:12;:10;:12::i;:::-;2315:6;;:22;:6;;;:22;;;2307:67;;;;;;;;;;;;:::i;:::-;35102:8:::1;:6;:8::i;:::-;35055:63::o:0;2103:79::-;2141:7;2168:6;;;2103:79;:::o;31766:1927::-;31993:20;22645:7;;;;;;;22644:8;22636:37;;;;;;;;;;;;:::i;:::-;32062:1:::1;32039:4;:20;;;:24;32031:63;;;;;;;;;;;;:::i;:::-;32113:16:::0;32105:51:::1;;;;;;;;;;;;:::i;:::-;32185:10;::::0;::::1;;32169:13;32224;;::::0;::::1;32185:4:::0;32224:13:::1;:::i;:::-;32206:31:::0;-1:-1:-1;32248:15:0::1;32266:13;::::0;;;::::1;::::0;::::1;;:::i;:::-;32248:31:::0;-1:-1:-1;29575:4:0::1;32296:27:::0;::::1;:32:::0;32292:255:::1;;32366:16;:8;:14;;;:16::i;:::-;:34;;32399:1;32366:34;;;32385:4;:11;;;32366:34;32353:9;:48;32345:78;;;;;;;;;;;;:::i;:::-;32292:255;;;32478:16;:8;:14;;;:16::i;:::-;:34;;32511:1;32478:34;;;32497:4;:11;;;32478:34;32464:9;:49;32456:79;;;;;;;;;;;;:::i;:::-;29627:4;32563:21:::0;::::1;:26:::0;32559:182:::1;;32615:16;:8;:14;;;:16::i;:::-;32614:17;32606:48;;;;;;;;;;;;:::i;:::-;32669:60;32676:8:::0;32686:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;32704:11;::::0;::::1;;32717;;::::0;::::1;32704:4:::0;32717:11:::1;:::i;:::-;32669:6;:60::i;:::-;32753:19;::::0;32776:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;:30;;;32775:64;;32823:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;32775:64;;;32810:10;32775:64;32753:86:::0;-1:-1:-1;32850:25:0::1;29517:4;32879:21:::0;::::1;32878:68;;32945:1;32878:68;;;32909:33;:21;::::0;::::1;32931:10;32909:21;:33::i;:::-;32850:96:::0;-1:-1:-1;32957:25:0::1;32985:34;:21;::::0;::::1;33007:11:::0;32985:21:::1;:34::i;:::-;32957:62;;33032:6;:16;;;33056:9;33067:5;;33032:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;33108:11:0::1;::::0;::::1;;::::0;-1:-1:-1;33145:57:0::1;33184:17:::0;33145:34:::1;:21;::::0;::::1;33167:11:::0;33145:21:::1;:34::i;:::-;:38:::0;::::1;:57::i;:::-;33130:72:::0;-1:-1:-1;29517:4:0::1;33219:21:::0;::::1;:26:::0;33215:380:::1;;33276:73;33315:33;:21;::::0;::::1;33337:10;33315:21;:33::i;:::-;33276:34;:17:::0;33298:11:::1;::::0;::::1;;33276:21;:34::i;:73::-;33262:87:::0;-1:-1:-1;33405:37:0::1;:20;::::0;::::1;;33262:87:::0;33405:24:::1;:37::i;:::-;33372:29;:12:::0;33389:11:::1;::::0;::::1;;33372:16;:29::i;:::-;:70;;33364:110;;;;;;;;;;;;:::i;:::-;33215:380;;;33531:4;:20;;;33515:12;:36;;33507:76;;;;;;;;;;;;:::i;:::-;33607:78;33620:4;33626:8;33636;33646:11;33659;33672:12;33607;:78::i;3048:244::-:0;2325:12;:10;:12::i;:::-;2315:6;;:22;:6;;;:22;;;2307:67;;;;;;;;;;;;:::i;:::-;3137:22:::1;::::0;::::1;3129:73;;;;;;;;;;;;:::i;:::-;3239:6;::::0;;3218:38:::1;::::0;::::1;::::0;;::::1;::::0;3239:6;::::1;::::0;3218:38:::1;::::0;::::1;3267:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;3048:244::o;25220:1893::-;25299:13;25584:2;25569:4;:11;:17;;:38;;;;;25590:4;25595:1;25590:7;;;;;;;;;;;;;;;:17;;25569:38;:59;;;;;25611:4;25616:1;25611:7;;;;;;;;;;;;;;;:17;;25569:59;:80;;;;;25632:4;25637:1;25632:7;;;;;;;;;;;;;;;:17;;25569:80;:101;;;;;25653:4;25658:1;25653:7;;;;;;;;;;;;;;;:17;;25569:101;25565:1476;;;25687:20;25903:2;25897:4;25893:13;25883:23;;26405:6;26399:20;26394:2;:25;26379:4;:11;:40;;26371:74;;;;;;;;;;;;:::i;:::-;26491:6;26509;26474:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26460:62;;;;;25565:1476;26616:4;:11;26631:2;26616:17;:38;;;;;26637:4;26642:1;26637:7;;;;;;;;;;;;;;;:17;;26616:38;:59;;;;;26658:4;26663:1;26658:7;;;;;;;;;;;;;;;:17;;26616:59;:80;;;;;26679:4;26684:1;26679:7;;;;;;;;;;;;;;;:17;;26616:80;:101;;;;;26700:4;26705:1;26700:7;;;;;;;;;;;;;;;:17;;26616:101;26612:429;;;26928:2;26918:13;;26912:20;26992:6;27010:12;26912:20;27010:6;:12::i;:::-;26975:53;;;;;;;;;:::i;26612:429::-;27084:6;27067:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;27053:52;;25220:1893;;;;;:::o;7487:136::-;7545:7;7572:43;7576:1;7579;7572:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7565:50;7487:136;-1:-1:-1;;;7487:136:0:o;657:106::-;745:10;657:106;:::o;28425:283::-;28520:10;;28516:185;;28551:12;28557:5;28551;:12::i;:::-;28547:143;;;28584:19;;:11;;;;:19;;;;;28596:6;;28584:19;;;;28596:6;28584:11;:19;;;;;;;;;;;;;;;;;;;;;28547:143;;;28644:30;:18;;;28663:2;28667:6;28644:18;:30::i;:::-;28425:283;;;:::o;23117:118::-;22645:7;;;;;;;22644:8;22636:37;;;;;;;;;;;;:::i;:::-;23177:7:::1;:14:::0;;;::::1;::::0;::::1;::::0;;23207:20:::1;23214:12;:10;:12::i;:::-;23207:20;;;;;;:::i;:::-;;;;;;;;23117:118::o:0;28042:133::-;28094:4;28119:22;;;;;:47;;-1:-1:-1;28145:21:0;;;27934:42;28145:21;28111:56;28042:133;-1:-1:-1;;28042:133:0:o;34247:666::-;34501:6;34484:23;;34480:366;;;34589:12;34603:19;34634:5;34626:19;;34669:28;;;34699:6;;34646:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34626:81;;;;34646:60;34626:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34588:119;;;;34727:7;34722:113;;34762:56;34787:6;34762:56;;;;;;;;;;;;;;;;;:24;:56::i;:::-;34755:64;;;;;;;;;;;:::i;34722:113::-;34480:366;;;34858:47;:22;;;34881:10;34893:3;34898:6;34858:22;:47::i;:::-;34247:666;;;;;:::o;28183:234::-;28259:7;28283:12;28289:5;28283;:12::i;:::-;28279:131;;;-1:-1:-1;28319:15:0;;;;28312:22;;28279:131;28374:24;;;;;:15;;;;;;:24;;28390:7;;28374:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28367:31;;;;7023:181;7081:7;7113:5;;;7137:6;;;;7129:46;;;;;;;;;;;;:::i;8377:471::-;8435:7;8680:6;8676:47;;-1:-1:-1;8710:1:0;8703:8;;8676:47;8747:5;;;8751:1;8747;:5;:1;8771:5;;;;;:10;8763:56;;;;;;;;;;;;:::i;33701:538::-;34008:8;33938:293;;33985:8;33938:293;;33960:10;33938:293;;;34031:11;34057:4;:11;;;34083;34109:12;34136:4;:20;;;34171:4;:21;;;34207:4;:13;;;;;;;;;;:::i;:::-;33938:293;;;;;;;;;;;;:::i;:::-;;;;;;;;33701:538;;;;;;:::o;27121:124::-;27173:13;27206:31;27230:5;27213:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;27206:6;:31::i;7926:192::-;8012:7;8048:12;8040:6;;;;8032:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;8084:5:0;;;7926:192::o;18184:177::-;18267:86;18287:5;18317:23;;;18342:2;18346:5;18294:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18267:19;:86::i;18369:205::-;18470:96;18490:5;18520:27;;;18549:4;18555:2;18559:5;18497:68;;;;;;;;;;:::i;18470:96::-;18369:205;;;;:::o;27253:455::-;27309:13;27335:21;:42;;;;;;;;;;;;;;;;;;;27388:16;27421:4;:11;27435:1;27421:15;27417:1;:19;27407:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27407:30:0;;27388:49;;27448:12;:3;27452:1;27448:6;;;;;;;;;;;:12;;;;;;;;;;;27471;:3;27475:1;27471:6;;;;;;;;;;;:12;;;;;;;;;;;27499:9;27494:178;27518:4;:11;27514:1;:15;27494:178;;;27568:8;27594:1;27583:4;27588:1;27583:7;;;;;;;;;;;;27568:29;;27583:7;;;;:12;;;:7;27577:19;;27568:29;;;;;;;;;;;;;;27551:3;27559:1;27555;:5;27563:1;27555:9;27551:14;;;;;;;;;;;:46;;;;;;;;;;;27629:8;27644:4;27649:1;27644:7;;;;;;;;;;;;;27629:31;;27644:7;;;;;27654:4;27638:21;;27629:31;;;;;;;;;;;;;;27612:3;27620:1;27616;:5;27624:1;27616:9;27612:14;;;;;;;;;;;:48;;;;;;;;;;-1:-1:-1;27531:3:0;;27494:178;;;-1:-1:-1;27696:3:0;27253:455;-1:-1:-1;;;27253:455:0:o;20489:761::-;20913:23;20939:69;20967:4;20939:69;;;;;;;;;;;;;;;;;20947:5;20939:27;;;;:69;;;;;:::i;:::-;21023:17;;20913:95;;-1:-1:-1;21023:21:0;21019:224;;21165:10;21154:30;;;;;;;;;;;;:::i;:::-;21146:85;;;;;;;;;;;;:::i;15165:196::-;15268:12;15300:53;15323:6;15331:4;15337:1;15340:12;15300:22;:53::i;:::-;15293:60;15165:196;-1:-1:-1;;;;15165:196:0:o;16542:979::-;16672:12;16705:18;16716:6;16705:10;:18::i;:::-;16697:60;;;;;;;;;;;;:::i;:::-;16831:12;16845:23;16872:6;:11;;16892:8;16903:4;16872:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16830:78;;;;16923:7;16919:595;;;16954:10;-1:-1:-1;16947:17:0;;-1:-1:-1;16947:17:0;16919:595;17068:17;;:21;17064:439;;17331:10;17325:17;17392:15;17379:10;17375:2;17371:19;17364:44;17279:148;17474:12;17467:20;;;;;;;;;;;:::i;12247:422::-;12614:20;12653:8;;;12247:422::o;884:158:-1:-;965:20;;990:47;965:20;990:47;:::i;1729:241::-;;1833:2;1821:9;1812:7;1808:23;1804:32;1801:2;;;-1:-1;;1839:12;1801:2;85:6;72:20;97:33;124:5;97:33;:::i;1977:257::-;;2089:2;2077:9;2068:7;2064:23;2060:32;2057:2;;;-1:-1;;2095:12;2057:2;665:6;659:13;38707:5;36337:13;36330:21;38685:5;38682:32;38672:2;;-1:-1;;38718:12;2241:423;;;2385:2;2373:9;2364:7;2360:23;2356:32;2353:2;;;-1:-1;;2391:12;2353:2;815:6;809:13;827:45;866:5;827:45;:::i;:::-;2566:2;2616:22;;;;1666:13;2443:86;;1666:13;;-1:-1;;;2347:317::o;2947:394::-;;;3082:2;3070:9;3061:7;3057:23;3053:32;3050:2;;;-1:-1;;3088:12;3050:2;978:6;965:20;990:47;1031:5;990:47;:::i;:::-;3140:77;3254:2;3293:22;;;;1518:20;;-1:-1;;;3044:297::o;3348:915::-;;;;;3612:2;3600:9;3591:7;3587:23;3583:32;3580:2;;;-1:-1;;3618:12;3580:2;1151:6;1138:20;1163:55;1212:5;1163:55;:::i;:::-;3670:85;-1:-1;3820:2;3805:18;;3792:32;3844:18;3833:30;;;3830:2;;;-1:-1;;3866:12;3830:2;3952:22;;;;1396:3;1378:16;;;1374:26;1371:2;;;-1:-1;;1403:12;1371:2;3886:98;;-1:-1;4049:2;4034:18;;4021:32;;4062:30;;;4059:2;;;-1:-1;;4095:12;4059:2;4230:6;4219:9;4215:22;;;354:3;347:4;339:6;335:17;331:27;321:2;;-1:-1;;362:12;321:2;405:6;392:20;3844:18;424:6;421:30;418:2;;;-1:-1;;454:12;418:2;549:3;3820:2;;533:6;529:17;490:6;515:32;;512:41;509:2;;;-1:-1;;556:12;509:2;3574:689;;;;-1:-1;;3820:2;486:17;;-1:-1;;;3574:689::o;4270:263::-;;4385:2;4373:9;4364:7;4360:23;4356:32;4353:2;;;-1:-1;;4391:12;4353:2;-1:-1;1666:13;;4347:186;-1:-1;4347:186::o;4983:103::-;36778:42;36767:54;5044:37;;5038:48::o;5304:1089::-;34053:19;;;34102:4;34093:14;;;;5304:1089;;34102:4;5695:17;;;5686:27;;;34093:14;5832:21;5304:1089;5859:495;5884:6;5881:1;5878:13;5859:495;;;5946:9;5940:4;5936:20;5931:3;5924:33;35866:3;35853:17;35910:48;35934:8;35918:14;35914:29;35910:48;35890:18;35886:73;35876:2;;-1:-1;;35963:12;35876:2;35992:33;;1518:20;;18312:37;;36146:12;;;1518:20;15375:14;;;18312:37;15497:4;15486:16;;;1518:20;15557:14;;;18312:37;15005:4;15703;15648:61;15692:16;;;35992:33;15648:61;:::i;:::-;15614:95;;15005:4;15703;15733:3;15729:14;15722:38;15775:87;15005:4;15000:3;14996:14;15843:12;15829;15775:87;:::i;:::-;6333:14;;;;6068:138;-1:-1;;;33876:14;;;;-1:-1;;5906:1;5899:9;5859:495;;;-1:-1;6377:10;;5504:889;-1:-1;;;;;;;5504:889::o;6535:277::-;;34065:6;34060:3;34053:19;37967:6;37962:3;34102:4;34097:3;34093:14;37944:30;-1:-1;34102:4;38014:6;34097:3;38005:16;;37998:27;34102:4;38481:7;38485:2;6798:6;38465:14;38461:28;34097:3;6767:39;;6760:46;;6625:187;;;;;:::o;18640:271::-;;7308:5;33581:12;7419:52;7464:6;7459:3;7452:4;7445:5;7441:16;7419:52;:::i;:::-;7483:16;;;;;18774:137;-1:-1;;18774:137::o;18918:542::-;;7308:5;33581:12;7419:52;7464:6;7459:3;7452:4;7445:5;7441:16;7419:52;:::i;:::-;9183:11;7483:16;;9163:32;;;-1:-1;9148:1;9214:11;;19155:305;-1:-1;19155:305::o;19467:970::-;;7308:5;33581:12;7419:52;7464:6;7459:3;7452:4;7445:5;7441:16;7419:52;:::i;:::-;11583:8;7483:16;;;11563:29;;;33581:12;;7419:52;33581:12;11548:1;11611:11;;7452:4;7441:16;;7419:52;:::i;:::-;10581:3;11548:1;7483:16;;;;;;;10561:24;10604:11;;;19853:584;-1:-1;;;;19853:584::o;20444:970::-;;7308:5;33581:12;7419:52;7464:6;7459:3;7452:4;7445:5;7441:16;7419:52;:::i;:::-;14710:8;7483:16;;;14690:29;;;33581:12;;7419:52;33581:12;14675:1;14738:11;;7452:4;7441:16;;7419:52;:::i;21421:253::-;18312:37;;;21646:2;21637:12;;21537:137::o;21681:222::-;36778:42;36767:54;;;;5044:37;;21808:2;21793:18;;21779:124::o;22155:444::-;36778:42;36767:54;;;5044:37;;36767:54;;;;22502:2;22487:18;;5044:37;22585:2;22570:18;;18312:37;;;;22338:2;22323:18;;22309:290::o;22606:333::-;36778:42;36767:54;;;;5044:37;;22925:2;22910:18;;18312:37;22761:2;22746:18;;22732:207::o;22946:892::-;36778:42;36767:54;;;5044:37;;23406:2;23391:18;;18312:37;;;;23489:2;23474:18;;18312:37;;;;23572:2;23557:18;;18312:37;;;;23655:3;23640:19;;18312:37;23739:3;23724:19;;18312:37;36767:54;;;23823:3;23808:19;;5044:37;23241:3;23226:19;;23212:626::o;23845:522::-;;24098:2;24119:17;24112:47;24173:184;24098:2;24087:9;24083:18;24343:6;24335;24173:184;:::i;24374:210::-;36337:13;;36330:21;6466:34;;24495:2;24480:18;;24466:118::o;24591:326::-;;24746:2;24767:17;24760:47;24821:86;24746:2;24735:9;24731:18;24893:6;24885;24821:86;:::i;24924:972::-;;36778:42;7643:5;36767:54;7593:3;7586:64;25323:2;25463;25452:9;25448:18;25441:48;25463:2;16282:16;35699:12;16305:77;25323:2;25312:9;25308:18;35659:53;35699:12;16282:16;35659:53;:::i;:::-;16305:77;:::i;:::-;16448:64;16495:16;16488:5;16448:64;:::i;:::-;16428:84;;16518:77;16580:14;25312:9;16580:14;16566:12;16518:77;:::i;:::-;;16664:50;16708:4;16701:5;16697:16;16690:5;16664:50;:::i;:::-;16720:63;16768:14;25312:9;16768:14;16754:12;16720:63;:::i;:::-;;16852:50;25323:2;16889:5;16885:16;16878:5;16852:50;:::i;:::-;16908:63;16956:14;25312:9;16956:14;16942:12;16908:63;:::i;:::-;;16580:14;17072:5;17068:16;1518:20;17139:14;25312:9;17139:14;18312:37;17331:14;16768;17264:5;17260:16;1518:20;17331:14;25312:9;17331:14;18312:37;17524:14;16956;17457:5;17453:16;1518:20;17524:14;25312:9;17524:14;18312:37;16163:6;17139:14;17639:5;17635:16;1518:20;16163:6;25312:9;17706:14;18312:37;17787:52;17331:14;17824:5;17820:18;17813:5;17787:52;:::i;:::-;17767:72;;17845:65;17893:16;25312:9;17893:16;17879:12;17845:65;:::i;:::-;17988:63;17524:14;18036:5;18032:18;18025:5;17988:63;:::i;:::-;17954:97;;;;16163:6;18071:16;25312:9;18071:16;18064:40;;18119:87;16154:16;25312:9;16154:16;18187:12;18173;18119:87;:::i;:::-;18228:11;;;25677:9;25671:4;25667:20;16708:4;25651:9;25647:18;25640:48;25702:184;25881:4;25872:6;25864;25702:184;:::i;:::-;25694:192;25294:602;-1:-1;;;;;;;25294:602::o;25903:310::-;;26050:2;26071:17;26064:47;7984:5;33581:12;34065:6;26050:2;26039:9;26035:18;34053:19;8078:52;8123:6;34093:14;26039:9;34093:14;26050:2;8104:5;8100:16;8078:52;:::i;:::-;38485:2;38465:14;38481:7;38461:28;8142:39;;;;34093:14;8142:39;;26021:192;-1:-1;;26021:192::o;26220:416::-;26420:2;26434:47;;;8785:2;26405:18;;;34053:19;8821:20;34093:14;;;8801:41;8861:12;;;26391:245::o;26643:416::-;26843:2;26857:47;;;9464:2;26828:18;;;34053:19;9500:34;34093:14;;;9480:55;9569:8;9555:12;;;9548:30;9597:12;;;26814:245::o;27066:416::-;27266:2;27280:47;;;9848:2;27251:18;;;34053:19;9884:29;34093:14;;;9864:50;9933:12;;;27237:245::o;27489:416::-;27689:2;27703:47;;;10184:2;27674:18;;;34053:19;10220;34093:14;;;10200:40;10259:12;;;27660:245::o;27912:416::-;28112:2;28126:47;;;10854:2;28097:18;;;34053:19;10890:18;34093:14;;;10870:39;10928:12;;;28083:245::o;28335:416::-;28535:2;28549:47;;;11179:2;28520:18;;;34053:19;11215:26;34093:14;;;11195:47;11261:12;;;28506:245::o;28758:416::-;28958:2;28972:47;;;11861:2;28943:18;;;34053:19;11897:29;34093:14;;;11877:50;11946:12;;;28929:245::o;29181:416::-;29381:2;29395:47;;;12197:2;29366:18;;;34053:19;12233:28;34093:14;;;12213:49;12281:12;;;29352:245::o;29604:416::-;29804:2;29818:47;;;12532:2;29789:18;;;34053:19;12568:34;34093:14;;;12548:55;12637:3;12623:12;;;12616:25;12660:12;;;29775:245::o;30027:416::-;30227:2;30241:47;;;30212:18;;;34053:19;12947:34;34093:14;;;12927:55;13001:12;;;30198:245::o;30450:416::-;30650:2;30664:47;;;13252:2;30635:18;;;34053:19;13288:23;34093:14;;;13268:44;13331:12;;;30621:245::o;30873:416::-;31073:2;31087:47;;;13582:2;31058:18;;;34053:19;13618:31;34093:14;;;13598:52;13669:12;;;31044:245::o;31296:416::-;31496:2;31510:47;;;13920:2;31481:18;;;34053:19;13956:34;34093:14;;;13936:55;14025:12;14011;;;14004:34;14057:12;;;31467:245::o;31719:416::-;31919:2;31933:47;;;14308:2;31904:18;;;34053:19;14344:24;34093:14;;;14324:45;14388:12;;;31890:245::o;32371:444::-;18312:37;;;32718:2;32703:18;;18312:37;;;;32801:2;32786:18;;18312:37;32554:2;32539:18;;32525:290::o;32822:506::-;;;32957:11;32944:25;33008:48;33032:8;33016:14;33012:29;33008:48;32988:18;32984:73;32974:2;;-1:-1;;33061:12;32974:2;33088:33;;33142:18;;;-1:-1;33180:18;33169:30;;33166:2;;;-1:-1;;33202:12;33166:2;33047:4;33230:13;;-1:-1;33016:14;33262:38;;;33252:49;;33249:2;;;33314:1;;33304:12;33249:2;32912:416;;;;;:::o;34933:119::-;;85:6;72:20;97:33;124:5;97:33;:::i;35061:501::-;;;35185:3;35172:17;35229:48;35253:8;35237:14;35233:29;35229:48;35209:18;35205:73;35195:2;;-1:-1;;35282:12;35195:2;35311:33;;35268:4;35400:16;;;-1:-1;35366:19;;-1:-1;35436:18;35425:30;;35422:2;;;35468:1;;35458:12;35422:2;35515:17;35237:14;35495:38;35485:8;35481:53;35478:2;;;35547:1;;35537:12;38040:268;38105:1;38112:101;38126:6;38123:1;38120:13;38112:101;;;38193:11;;;38187:18;38174:11;;;38167:39;38148:2;38141:10;38112:101;;;38228:6;38225:1;38222:13;38219:2;;;-1:-1;;38105:1;38275:16;;38268:27;38089:219::o;38502:117::-;36778:42;38589:5;36767:54;38564:5;38561:35;38551:2;;38610:1;;38600:12;38551:2;38545:74;:::o
Swarm Source
ipfs://c716249da50666596d6ab6b11269702b0d600be7427ab1d68e1e4a28d20aae25
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 100.00% | $0.393986 | 14.8175 | $5.84 |
[ 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.