Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 121,722 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Trade With Hint ... | 20453262 | 111 days ago | IN | 0 ETH | 0.00003717 | ||||
Trade With Hint ... | 20451971 | 111 days ago | IN | 0 ETH | 0.00108354 | ||||
Trade With Hint ... | 20415523 | 116 days ago | IN | 0.000113 ETH | 0.00041773 | ||||
Trade With Hint ... | 20415396 | 116 days ago | IN | 0.002594 ETH | 0.00090075 | ||||
Trade With Hint ... | 20408400 | 117 days ago | IN | 0.000931 ETH | 0.00080321 | ||||
Trade With Hint ... | 20403028 | 118 days ago | IN | 0.03 ETH | 0.00172999 | ||||
Trade With Hint ... | 20252805 | 139 days ago | IN | 0 ETH | 0.01833503 | ||||
Trade With Hint ... | 20252805 | 139 days ago | IN | 0 ETH | 0.01645949 | ||||
Transfer | 16795224 | 624 days ago | IN | 0.0000001 ETH | 0.002268 | ||||
Trade With Hint | 15674372 | 780 days ago | IN | 0 ETH | 0.00352646 | ||||
Trade | 15674320 | 780 days ago | IN | 0.000001 ETH | 0.00797406 | ||||
Trade With Hint ... | 15247283 | 846 days ago | IN | 0 ETH | 0.00041448 | ||||
Trade With Hint ... | 15247274 | 846 days ago | IN | 0.0196 ETH | 0.00047181 | ||||
Trade With Hint ... | 14775555 | 923 days ago | IN | 0.023 ETH | 0.00943222 | ||||
Trade With Hint ... | 14734539 | 930 days ago | IN | 0.06674 ETH | 0.01740134 | ||||
Trade With Hint ... | 14730916 | 930 days ago | IN | 0 ETH | 0.00851947 | ||||
Trade With Hint ... | 14462395 | 972 days ago | IN | 0.2001 ETH | 0.015679 | ||||
Trade With Hint ... | 14424558 | 978 days ago | IN | 0.01582 ETH | 0.01280132 | ||||
Trade With Hint ... | 14424169 | 978 days ago | IN | 0.02731 ETH | 0.01280166 | ||||
Trade With Hint ... | 14424117 | 978 days ago | IN | 0.04143 ETH | 0.01280158 | ||||
Trade With Hint ... | 14403959 | 981 days ago | IN | 0 ETH | 0.00704453 | ||||
Trade With Hint ... | 14403919 | 981 days ago | IN | 0 ETH | 0.01988748 | ||||
Trade With Hint ... | 14402141 | 982 days ago | IN | 0 ETH | 0.00892699 | ||||
Trade With Hint ... | 14401461 | 982 days ago | IN | 0 ETH | 0.01053996 | ||||
Trade With Hint ... | 14390839 | 983 days ago | IN | 0 ETH | 0.00347081 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21249334 | 21 mins ago | 0.99307725 ETH | ||||
21249334 | 21 mins ago | 0.99307725 ETH | ||||
21249191 | 50 mins ago | 0.99307725 ETH | ||||
21249191 | 50 mins ago | 0.99307725 ETH | ||||
21249163 | 55 mins ago | 1.36170436 ETH | ||||
21249163 | 55 mins ago | 1.36170436 ETH | ||||
21249086 | 1 hr ago | 1.02356707 ETH | ||||
21249086 | 1 hr ago | 1.02356707 ETH | ||||
21247886 | 5 hrs ago | 0.79849225 ETH | ||||
21247886 | 5 hrs ago | 0.79849225 ETH | ||||
21247273 | 7 hrs ago | 0.82898207 ETH | ||||
21247273 | 7 hrs ago | 0.82898207 ETH | ||||
21247237 | 7 hrs ago | 1.04960849 ETH | ||||
21247237 | 7 hrs ago | 1.04960849 ETH | ||||
21247120 | 7 hrs ago | 1.02356372 ETH | ||||
21247120 | 7 hrs ago | 1.02356372 ETH | ||||
21247069 | 7 hrs ago | 1.07245181 ETH | ||||
21247069 | 7 hrs ago | 1.07245181 ETH | ||||
21246917 | 8 hrs ago | 1.06796947 ETH | ||||
21246917 | 8 hrs ago | 1.06796947 ETH | ||||
21245346 | 13 hrs ago | 1.18955485 ETH | ||||
21245346 | 13 hrs ago | 1.18955485 ETH | ||||
21245240 | 14 hrs ago | 0.9697851 ETH | ||||
21245240 | 14 hrs ago | 0.9697851 ETH | ||||
21245234 | 14 hrs ago | 1.23254741 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xc153eeAD...6D738A37c The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
KyberNetworkProxy
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-02 */ // File: contracts/sol6/IERC20.sol pragma solidity 0.6.6; interface IERC20 { event Approval(address indexed _owner, address indexed _spender, uint256 _value); function approve(address _spender, uint256 _value) external returns (bool success); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); function balanceOf(address _owner) external view returns (uint256 balance); function decimals() external view returns (uint8 digits); function totalSupply() external view returns (uint256 supply); } // to support backward compatible contract name -- so function signature remains same abstract contract ERC20 is IERC20 { } // File: contracts/sol6/utils/PermissionGroupsNoModifiers.sol pragma solidity 0.6.6; contract PermissionGroupsNoModifiers { address public admin; address public pendingAdmin; mapping(address => bool) internal operators; mapping(address => bool) internal alerters; address[] internal operatorsGroup; address[] internal alertersGroup; uint256 internal constant MAX_GROUP_SIZE = 50; event AdminClaimed(address newAdmin, address previousAdmin); event AlerterAdded(address newAlerter, bool isAdd); event OperatorAdded(address newOperator, bool isAdd); event TransferAdminPending(address pendingAdmin); constructor(address _admin) public { require(_admin != address(0), "admin 0"); admin = _admin; } function getOperators() external view returns (address[] memory) { return operatorsGroup; } function getAlerters() external view returns (address[] memory) { return alertersGroup; } function addAlerter(address newAlerter) public { onlyAdmin(); require(!alerters[newAlerter], "alerter exists"); // prevent duplicates. require(alertersGroup.length < MAX_GROUP_SIZE, "max alerters"); emit AlerterAdded(newAlerter, true); alerters[newAlerter] = true; alertersGroup.push(newAlerter); } function addOperator(address newOperator) public { onlyAdmin(); require(!operators[newOperator], "operator exists"); // prevent duplicates. require(operatorsGroup.length < MAX_GROUP_SIZE, "max operators"); emit OperatorAdded(newOperator, true); operators[newOperator] = true; operatorsGroup.push(newOperator); } /// @dev Allows the pendingAdmin address to finalize the change admin process. function claimAdmin() public { require(pendingAdmin == msg.sender, "not pending"); emit AdminClaimed(pendingAdmin, admin); admin = pendingAdmin; pendingAdmin = address(0); } function removeAlerter(address alerter) public { onlyAdmin(); require(alerters[alerter], "not alerter"); delete alerters[alerter]; for (uint256 i = 0; i < alertersGroup.length; ++i) { if (alertersGroup[i] == alerter) { alertersGroup[i] = alertersGroup[alertersGroup.length - 1]; alertersGroup.pop(); emit AlerterAdded(alerter, false); break; } } } function removeOperator(address operator) public { onlyAdmin(); require(operators[operator], "not operator"); delete operators[operator]; for (uint256 i = 0; i < operatorsGroup.length; ++i) { if (operatorsGroup[i] == operator) { operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1]; operatorsGroup.pop(); emit OperatorAdded(operator, false); break; } } } /// @dev Allows the current admin to set the pendingAdmin address /// @param newAdmin The address to transfer ownership to function transferAdmin(address newAdmin) public { onlyAdmin(); require(newAdmin != address(0), "new admin 0"); emit TransferAdminPending(newAdmin); pendingAdmin = newAdmin; } /// @dev Allows the current admin to set the admin in one tx. Useful initial deployment. /// @param newAdmin The address to transfer ownership to. function transferAdminQuickly(address newAdmin) public { onlyAdmin(); require(newAdmin != address(0), "admin 0"); emit TransferAdminPending(newAdmin); emit AdminClaimed(newAdmin, admin); admin = newAdmin; } function onlyAdmin() internal view { require(msg.sender == admin, "only admin"); } function onlyAlerter() internal view { require(alerters[msg.sender], "only alerter"); } function onlyOperator() internal view { require(operators[msg.sender], "only operator"); } } // File: contracts/sol6/utils/WithdrawableNoModifiers.sol pragma solidity 0.6.6; contract WithdrawableNoModifiers is PermissionGroupsNoModifiers { constructor(address _admin) public PermissionGroupsNoModifiers(_admin) {} event EtherWithdraw(uint256 amount, address sendTo); event TokenWithdraw(IERC20 token, uint256 amount, address sendTo); /// @dev Withdraw Ethers function withdrawEther(uint256 amount, address payable sendTo) external { onlyAdmin(); (bool success, ) = sendTo.call{value: amount}(""); require(success); emit EtherWithdraw(amount, sendTo); } /// @dev Withdraw all IERC20 compatible tokens /// @param token IERC20 The address of the token contract function withdrawToken( IERC20 token, uint256 amount, address sendTo ) external { onlyAdmin(); token.transfer(sendTo, amount); emit TokenWithdraw(token, amount, sendTo); } } // File: contracts/sol6/utils/Utils5.sol pragma solidity 0.6.6; /** * @title Kyber utility file * mostly shared constants and rate calculation helpers * inherited by most of kyber contracts. * previous utils implementations are for previous solidity versions. */ contract Utils5 { IERC20 internal constant ETH_TOKEN_ADDRESS = IERC20( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); uint256 internal constant PRECISION = (10**18); uint256 internal constant MAX_QTY = (10**28); // 10B tokens uint256 internal constant MAX_RATE = (PRECISION * 10**7); // up to 10M tokens per eth uint256 internal constant MAX_DECIMALS = 18; uint256 internal constant ETH_DECIMALS = 18; uint256 constant BPS = 10000; // Basic Price Steps. 1 step = 0.01% uint256 internal constant MAX_ALLOWANCE = uint256(-1); // token.approve inifinite mapping(IERC20 => uint256) internal decimals; function getUpdateDecimals(IERC20 token) internal returns (uint256) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint256 tokenDecimals = decimals[token]; // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if (tokenDecimals == 0) { tokenDecimals = token.decimals(); decimals[token] = tokenDecimals; } return tokenDecimals; } function setDecimals(IERC20 token) internal { if (decimals[token] != 0) return; //already set if (token == ETH_TOKEN_ADDRESS) { decimals[token] = ETH_DECIMALS; } else { decimals[token] = token.decimals(); } } /// @dev get the balance of a user. /// @param token The token type /// @return The balance function getBalance(IERC20 token, address user) internal view returns (uint256) { if (token == ETH_TOKEN_ADDRESS) { return user.balance; } else { return token.balanceOf(user); } } function getDecimals(IERC20 token) internal view returns (uint256) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint256 tokenDecimals = decimals[token]; // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if (tokenDecimals == 0) return token.decimals(); return tokenDecimals; } function calcDestAmount( IERC20 src, IERC20 dest, uint256 srcAmount, uint256 rate ) internal view returns (uint256) { return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate); } function calcSrcAmount( IERC20 src, IERC20 dest, uint256 destAmount, uint256 rate ) internal view returns (uint256) { return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate); } function calcDstQty( uint256 srcQty, uint256 srcDecimals, uint256 dstDecimals, uint256 rate ) internal pure returns (uint256) { require(srcQty <= MAX_QTY, "srcQty > MAX_QTY"); require(rate <= MAX_RATE, "rate > MAX_RATE"); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION; } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals))); } } function calcSrcQty( uint256 dstQty, uint256 srcDecimals, uint256 dstDecimals, uint256 rate ) internal pure returns (uint256) { require(dstQty <= MAX_QTY, "dstQty > MAX_QTY"); require(rate <= MAX_RATE, "rate > MAX_RATE"); //source quantity is rounded up. to avoid dest quantity being too low. uint256 numerator; uint256 denominator; if (srcDecimals >= dstDecimals) { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals))); denominator = rate; } else { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); numerator = (PRECISION * dstQty); denominator = (rate * (10**(dstDecimals - srcDecimals))); } return (numerator + denominator - 1) / denominator; //avoid rounding down errors } function calcRateFromQty( uint256 srcAmount, uint256 destAmount, uint256 srcDecimals, uint256 dstDecimals ) internal pure returns (uint256) { require(srcAmount <= MAX_QTY, "srcAmount > MAX_QTY"); require(destAmount <= MAX_QTY, "destAmount > MAX_QTY"); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); return ((destAmount * PRECISION) / ((10**(dstDecimals - srcDecimals)) * srcAmount)); } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); return ((destAmount * PRECISION * (10**(srcDecimals - dstDecimals))) / srcAmount); } } function minOf(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? y : x; } } // File: contracts/sol6/utils/zeppelin/SafeMath.sol pragma solidity 0.6.6; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } // File: contracts/sol6/utils/zeppelin/Address.sol pragma solidity 0.6.6; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: contracts/sol6/utils/zeppelin/SafeERC20.sol pragma solidity 0.6.6; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/sol6/IKyberNetwork.sol pragma solidity 0.6.6; interface IKyberNetwork { event KyberTrade( IERC20 indexed src, IERC20 indexed dest, uint256 ethWeiValue, uint256 networkFeeWei, uint256 customPlatformFeeWei, bytes32[] t2eIds, bytes32[] e2tIds, uint256[] t2eSrcAmounts, uint256[] e2tSrcAmounts, uint256[] t2eRates, uint256[] e2tRates ); function tradeWithHintAndFee( address payable trader, IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet, uint256 platformFeeBps, bytes calldata hint ) external payable returns (uint256 destAmount); function listTokenForReserve( address reserve, IERC20 token, bool add ) external; function enabled() external view returns (bool); function getExpectedRateWithHintAndFee( IERC20 src, IERC20 dest, uint256 srcQty, uint256 platformFeeBps, bytes calldata hint ) external view returns ( uint256 expectedRateAfterNetworkFee, uint256 expectedRateAfterAllFees ); function getNetworkData() external view returns ( uint256 negligibleDiffBps, uint256 networkFeeBps, uint256 expiryTimestamp ); function maxGasPrice() external view returns (uint256); } // File: contracts/sol6/IKyberNetworkProxy.sol pragma solidity 0.6.6; interface IKyberNetworkProxy { event ExecuteTrade( address indexed trader, IERC20 src, IERC20 dest, address destAddress, uint256 actualSrcAmount, uint256 actualDestAmount, address platformWallet, uint256 platformFeeBps ); /// @notice backward compatible function tradeWithHint( ERC20 src, uint256 srcAmount, ERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable walletId, bytes calldata hint ) external payable returns (uint256); function tradeWithHintAndFee( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet, uint256 platformFeeBps, bytes calldata hint ) external payable returns (uint256 destAmount); function trade( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet ) external payable returns (uint256); /// @notice backward compatible /// @notice Rate units (10 ** 18) => destQty (twei) / srcQty (twei) * 10 ** 18 function getExpectedRate( ERC20 src, ERC20 dest, uint256 srcQty ) external view returns (uint256 expectedRate, uint256 worstRate); function getExpectedRateAfterFee( IERC20 src, IERC20 dest, uint256 srcQty, uint256 platformFeeBps, bytes calldata hint ) external view returns (uint256 expectedRate); } // File: contracts/sol6/ISimpleKyberProxy.sol pragma solidity 0.6.6; /* * @title simple Kyber Network proxy interface * add convenient functions to help with kyber proxy API */ interface ISimpleKyberProxy { function swapTokenToEther( IERC20 token, uint256 srcAmount, uint256 minConversionRate ) external returns (uint256 destAmount); function swapEtherToToken(IERC20 token, uint256 minConversionRate) external payable returns (uint256 destAmount); function swapTokenToToken( IERC20 src, uint256 srcAmount, IERC20 dest, uint256 minConversionRate ) external returns (uint256 destAmount); } // File: contracts/sol6/IKyberReserve.sol pragma solidity 0.6.6; interface IKyberReserve { function trade( IERC20 srcToken, uint256 srcAmount, IERC20 destToken, address payable destAddress, uint256 conversionRate, bool validate ) external payable returns (bool); function getConversionRate( IERC20 src, IERC20 dest, uint256 srcQty, uint256 blockNumber ) external view returns (uint256); } // File: contracts/sol6/IKyberHint.sol pragma solidity 0.6.6; interface IKyberHint { enum TradeType {BestOfAll, MaskIn, MaskOut, Split} enum HintErrors { NoError, // Hint is valid NonEmptyDataError, // reserveIDs and splits must be empty for BestOfAll hint ReserveIdDupError, // duplicate reserveID found ReserveIdEmptyError, // reserveIDs array is empty for MaskIn and Split trade type ReserveIdSplitsError, // reserveIDs and splitBpsValues arrays do not have the same length ReserveIdSequenceError, // reserveID sequence in array is not in increasing order ReserveIdNotFound, // reserveID isn't registered or doesn't exist SplitsNotEmptyError, // splitBpsValues is not empty for MaskIn or MaskOut trade type TokenListedError, // reserveID not listed for the token TotalBPSError // total BPS for Split trade type is not 10000 (100%) } function buildTokenToEthHint( IERC20 tokenSrc, TradeType tokenToEthType, bytes32[] calldata tokenToEthReserveIds, uint256[] calldata tokenToEthSplits ) external view returns (bytes memory hint); function buildEthToTokenHint( IERC20 tokenDest, TradeType ethToTokenType, bytes32[] calldata ethToTokenReserveIds, uint256[] calldata ethToTokenSplits ) external view returns (bytes memory hint); function buildTokenToTokenHint( IERC20 tokenSrc, TradeType tokenToEthType, bytes32[] calldata tokenToEthReserveIds, uint256[] calldata tokenToEthSplits, IERC20 tokenDest, TradeType ethToTokenType, bytes32[] calldata ethToTokenReserveIds, uint256[] calldata ethToTokenSplits ) external view returns (bytes memory hint); function parseTokenToEthHint(IERC20 tokenSrc, bytes calldata hint) external view returns ( TradeType tokenToEthType, bytes32[] memory tokenToEthReserveIds, IKyberReserve[] memory tokenToEthAddresses, uint256[] memory tokenToEthSplits ); function parseEthToTokenHint(IERC20 tokenDest, bytes calldata hint) external view returns ( TradeType ethToTokenType, bytes32[] memory ethToTokenReserveIds, IKyberReserve[] memory ethToTokenAddresses, uint256[] memory ethToTokenSplits ); function parseTokenToTokenHint(IERC20 tokenSrc, IERC20 tokenDest, bytes calldata hint) external view returns ( TradeType tokenToEthType, bytes32[] memory tokenToEthReserveIds, IKyberReserve[] memory tokenToEthAddresses, uint256[] memory tokenToEthSplits, TradeType ethToTokenType, bytes32[] memory ethToTokenReserveIds, IKyberReserve[] memory ethToTokenAddresses, uint256[] memory ethToTokenSplits ); } // File: contracts/sol6/KyberNetworkProxy.sol pragma solidity 0.6.6; /** * @title kyberProxy for kyberNetwork contract * The contract provides the following functions: * - Get rates * - Trade execution * - Simple T2E, E2T and T2T trade APIs * - Has some checks in place to safeguard takers */ contract KyberNetworkProxy is IKyberNetworkProxy, ISimpleKyberProxy, WithdrawableNoModifiers, Utils5 { using SafeERC20 for IERC20; IKyberNetwork public kyberNetwork; IKyberHint public kyberHintHandler; // kyberHintHhandler pointer for users. event KyberNetworkSet(IKyberNetwork newKyberNetwork, IKyberNetwork previousKyberNetwork); event KyberHintHandlerSet(IKyberHint kyberHintHandler); constructor(address _admin) public WithdrawableNoModifiers(_admin) { /*empty body*/ } /// @notice Backward compatible function /// @notice Use token address ETH_TOKEN_ADDRESS for ether /// @dev Trade from src to dest token and sends dest token to destAddress /// @param src Source token /// @param srcAmount Amount of src tokens in twei /// @param dest Destination token /// @param destAddress Address to send tokens to /// @param maxDestAmount A limit on the amount of dest tokens in twei /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @param platformWallet Platform wallet address for receiving fees /// @return Amount of actual dest tokens in twei function trade( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet ) external payable override returns (uint256) { bytes memory hint; return doTrade( src, srcAmount, dest, destAddress, maxDestAmount, minConversionRate, platformWallet, 0, hint ); } /// @notice Backward compatible function /// @notice Use token address ETH_TOKEN_ADDRESS for ether /// @dev Trade from src to dest token and sends dest token to destAddress /// @param src Source token /// @param srcAmount Amount of src tokens in twei /// @param dest Destination token /// @param destAddress Address to send tokens to /// @param maxDestAmount A limit on the amount of dest tokens in twei /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @param walletId Platform wallet address for receiving fees /// @param hint Advanced instructions for running the trade /// @return Amount of actual dest tokens in twei function tradeWithHint( ERC20 src, uint256 srcAmount, ERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable walletId, bytes calldata hint ) external payable override returns (uint256) { return doTrade( src, srcAmount, dest, destAddress, maxDestAmount, minConversionRate, walletId, 0, hint ); } /// @notice Use token address ETH_TOKEN_ADDRESS for ether /// @dev Trade from src to dest token and sends dest token to destAddress /// @param src Source token /// @param srcAmount Amount of src tokens in twei /// @param dest Destination token /// @param destAddress Address to send tokens to /// @param maxDestAmount A limit on the amount of dest tokens in twei /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @param platformWallet Platform wallet address for receiving fees /// @param platformFeeBps Part of the trade that is allocated as fee to platform wallet. Ex: 10000 = 100%, 100 = 1% /// @param hint Advanced instructions for running the trade /// @return destAmount Amount of actual dest tokens in twei function tradeWithHintAndFee( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet, uint256 platformFeeBps, bytes calldata hint ) external payable override returns (uint256 destAmount) { return doTrade( src, srcAmount, dest, destAddress, maxDestAmount, minConversionRate, platformWallet, platformFeeBps, hint ); } /// @dev Trade from src to dest token. Sends dest tokens to msg sender /// @param src Source token /// @param srcAmount Amount of src tokens in twei /// @param dest Destination token /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @return Amount of actual dest tokens in twei function swapTokenToToken( IERC20 src, uint256 srcAmount, IERC20 dest, uint256 minConversionRate ) external override returns (uint256) { bytes memory hint; return doTrade( src, srcAmount, dest, msg.sender, MAX_QTY, minConversionRate, address(0), 0, hint ); } /// @dev Trade from eth -> token. Sends token to msg sender /// @param token Destination token /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @return Amount of actual dest tokens in twei function swapEtherToToken(IERC20 token, uint256 minConversionRate) external payable override returns (uint256) { bytes memory hint; return doTrade( ETH_TOKEN_ADDRESS, msg.value, token, msg.sender, MAX_QTY, minConversionRate, address(0), 0, hint ); } /// @dev Trade from token -> eth. Sends eth to msg sender /// @param token Source token /// @param srcAmount Amount of src tokens in twei /// @param minConversionRate The minimal conversion rate. If actual rate is lower, trade reverts /// @return Amount of actual dest tokens in twei function swapTokenToEther( IERC20 token, uint256 srcAmount, uint256 minConversionRate ) external override returns (uint256) { bytes memory hint; return doTrade( token, srcAmount, ETH_TOKEN_ADDRESS, msg.sender, MAX_QTY, minConversionRate, address(0), 0, hint ); } function setKyberNetwork(IKyberNetwork _kyberNetwork) external { onlyAdmin(); require(_kyberNetwork != IKyberNetwork(0), "kyberNetwork 0"); emit KyberNetworkSet(_kyberNetwork, kyberNetwork); kyberNetwork = _kyberNetwork; } function setHintHandler(IKyberHint _kyberHintHandler) external { onlyAdmin(); require(_kyberHintHandler != IKyberHint(0), "kyberHintHandler 0"); emit KyberHintHandlerSet(_kyberHintHandler); kyberHintHandler = _kyberHintHandler; } /// @notice Backward compatible function /// @notice Use token address ETH_TOKEN_ADDRESS for ether /// @dev Get expected rate for a trade from src to dest tokens, with amount srcQty (no platform fee) /// @param src Source token /// @param dest Destination token /// @param srcQty Amount of src tokens in twei /// @return expectedRate for a trade after deducting network fee. Rate = destQty (twei) / srcQty (twei) * 10 ** 18 /// @return worstRate for a trade. Usually expectedRate * 97 / 100 /// Use worstRate value as trade min conversion rate at your own risk function getExpectedRate( ERC20 src, ERC20 dest, uint256 srcQty ) external view override returns (uint256 expectedRate, uint256 worstRate) { bytes memory hint; (expectedRate, ) = kyberNetwork.getExpectedRateWithHintAndFee( src, dest, srcQty, 0, hint ); // use simple backward compatible optoin. worstRate = (expectedRate * 97) / 100; } /// @notice Use token address ETH_TOKEN_ADDRESS for ether /// @dev Get expected rate for a trade from src to dest tokens, amount srcQty and fees /// @param src Source token /// @param dest Destination token /// @param srcQty Amount of src tokens in twei /// @param platformFeeBps Part of the trade that is allocated as fee to platform wallet. Ex: 10000 = 100%, 100 = 1% /// @param hint Advanced instructions for running the trade /// @return expectedRate for a trade after deducting network + platform fee /// Rate = destQty (twei) / srcQty (twei) * 10 ** 18 function getExpectedRateAfterFee( IERC20 src, IERC20 dest, uint256 srcQty, uint256 platformFeeBps, bytes calldata hint ) external view override returns (uint256 expectedRate) { (, expectedRate) = kyberNetwork.getExpectedRateWithHintAndFee( src, dest, srcQty, platformFeeBps, hint ); } function maxGasPrice() external view returns (uint256) { return kyberNetwork.maxGasPrice(); } function enabled() external view returns (bool) { return kyberNetwork.enabled(); } /// helper structure for function doTrade struct UserBalance { uint256 srcTok; uint256 destTok; } function doTrade( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet, uint256 platformFeeBps, bytes memory hint ) internal returns (uint256) { UserBalance memory balanceBefore = prepareTrade(src, dest, srcAmount, destAddress); uint256 reportedDestAmount = kyberNetwork.tradeWithHintAndFee{value: msg.value}( msg.sender, src, srcAmount, dest, destAddress, maxDestAmount, minConversionRate, platformWallet, platformFeeBps, hint ); TradeOutcome memory tradeOutcome = calculateTradeOutcome( src, dest, destAddress, platformFeeBps, balanceBefore ); require( tradeOutcome.userDeltaDestToken == reportedDestAmount, "kyberNetwork returned wrong amount" ); require( tradeOutcome.userDeltaDestToken <= maxDestAmount, "actual dest amount exceeds maxDestAmount" ); require(tradeOutcome.actualRate >= minConversionRate, "rate below minConversionRate"); emit ExecuteTrade( msg.sender, src, dest, destAddress, tradeOutcome.userDeltaSrcToken, tradeOutcome.userDeltaDestToken, platformWallet, platformFeeBps ); return tradeOutcome.userDeltaDestToken; } /// helper structure for function prepareTrade struct TradeOutcome { uint256 userDeltaSrcToken; uint256 userDeltaDestToken; uint256 actualRate; } function prepareTrade( IERC20 src, IERC20 dest, uint256 srcAmount, address destAddress ) internal returns (UserBalance memory balanceBefore) { if (src == ETH_TOKEN_ADDRESS) { require(msg.value == srcAmount, "sent eth not equal to srcAmount"); } else { require(msg.value == 0, "sent eth not 0"); } balanceBefore.srcTok = getBalance(src, msg.sender); balanceBefore.destTok = getBalance(dest, destAddress); if (src == ETH_TOKEN_ADDRESS) { balanceBefore.srcTok += msg.value; } else { src.safeTransferFrom(msg.sender, address(kyberNetwork), srcAmount); } } function calculateTradeOutcome( IERC20 src, IERC20 dest, address destAddress, uint256 platformFeeBps, UserBalance memory balanceBefore ) internal returns (TradeOutcome memory outcome) { uint256 srcTokenBalanceAfter; uint256 destTokenBalanceAfter; srcTokenBalanceAfter = getBalance(src, msg.sender); destTokenBalanceAfter = getBalance(dest, destAddress); //protect from underflow require( destTokenBalanceAfter > balanceBefore.destTok, "wrong amount in destination address" ); require(balanceBefore.srcTok > srcTokenBalanceAfter, "wrong amount in source address"); outcome.userDeltaSrcToken = balanceBefore.srcTok - srcTokenBalanceAfter; outcome.userDeltaDestToken = destTokenBalanceAfter - balanceBefore.destTok; // what would be the src amount after deducting platformFee // not protecting from platform fee uint256 srcTokenAmountAfterDeductingFee = (outcome.userDeltaSrcToken * (BPS - platformFeeBps)) / BPS; outcome.actualRate = calcRateFromQty( srcTokenAmountAfterDeductingFee, outcome.userDeltaDestToken, getUpdateDecimals(src), getUpdateDecimals(dest) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAlerter","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"src","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"dest","type":"address"},{"indexed":false,"internalType":"address","name":"destAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"actualSrcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actualDestAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeBps","type":"uint256"}],"name":"ExecuteTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IKyberHint","name":"kyberHintHandler","type":"address"}],"name":"KyberHintHandlerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IKyberNetwork","name":"newKyberNetwork","type":"address"},{"indexed":false,"internalType":"contract IKyberNetwork","name":"previousKyberNetwork","type":"address"}],"name":"KyberNetworkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"inputs":[{"internalType":"address","name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAlerters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"src","type":"address"},{"internalType":"contract ERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"}],"name":"getExpectedRate","outputs":[{"internalType":"uint256","name":"expectedRate","type":"uint256"},{"internalType":"uint256","name":"worstRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"platformFeeBps","type":"uint256"},{"internalType":"bytes","name":"hint","type":"bytes"}],"name":"getExpectedRateAfterFee","outputs":[{"internalType":"uint256","name":"expectedRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberHintHandler","outputs":[{"internalType":"contract IKyberHint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberNetwork","outputs":[{"internalType":"contract IKyberNetwork","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberHint","name":"_kyberHintHandler","type":"address"}],"name":"setHintHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberNetwork","name":"_kyberNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"}],"name":"swapEtherToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"}],"name":"swapTokenToEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"}],"name":"swapTokenToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"maxDestAmount","type":"uint256"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"},{"internalType":"address payable","name":"platformWallet","type":"address"}],"name":"trade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"src","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract ERC20","name":"dest","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"maxDestAmount","type":"uint256"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"},{"internalType":"address payable","name":"walletId","type":"address"},{"internalType":"bytes","name":"hint","type":"bytes"}],"name":"tradeWithHint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"maxDestAmount","type":"uint256"},{"internalType":"uint256","name":"minConversionRate","type":"uint256"},{"internalType":"address payable","name":"platformWallet","type":"address"},{"internalType":"uint256","name":"platformFeeBps","type":"uint256"},{"internalType":"bytes","name":"hint","type":"bytes"}],"name":"tradeWithHintAndFee","outputs":[{"internalType":"uint256","name":"destAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x6080604052600436106101ac5760003560e01c806375829def116100ec578063ac8a584a1161008a578063b85d950f11610064578063b85d950f146107a3578063cb3c28c7146107d6578063ce56c45414610828578063f851a44014610861576101ac565b8063ac8a584a146106a9578063ae591d54146106dc578063b78b842d1461078e576101ac565b80637acc8678116100c65780637acc8678146105d25780637c423f5414610605578063809a9e551461061a5780639870d7fe14610676576101ac565b806375829def1461055e57806377f50f97146105915780637a2a0456146105a6576101ac565b80633bba21dc11610159578063408ee7fe11610133578063408ee7fe1461040f578063418436bc1461044257806354a325a6146104e45780637409e2eb14610517576101ac565b80633bba21dc146103785780633ccdbb28146103b75780633de39c11146103fa576101ac565b8063267822471161018a578063267822471461024057806327a099d81461025557806329589f61146102ba576101ac565b806301a12fd3146101b157806313c213b7146101e6578063238dafe014610217575b600080fd5b3480156101bd57600080fd5b506101e4600480360360208110156101d457600080fd5b50356001600160a01b0316610876565b005b3480156101f257600080fd5b506101fb610a22565b604080516001600160a01b039092168252519081900360200190f35b34801561022357600080fd5b5061022c610a31565b604080519115158252519081900360200190f35b34801561024c57600080fd5b506101fb610aa7565b34801561026157600080fd5b5061026a610ab6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102a657818101518382015260200161028e565b505050509050019250505060405180910390f35b61036660048036036101008110156102d157600080fd5b6001600160a01b0382358116926020810135926040820135831692606083013581169260808101359260a08201359260c0830135169190810190610100810160e082013564010000000081111561032757600080fd5b82018360208201111561033957600080fd5b8035906020019184600183028401116401000000008311171561035b57600080fd5b509092509050610b18565b60408051918252519081900360200190f35b34801561038457600080fd5b506103666004803603606081101561039b57600080fd5b506001600160a01b038135169060208101359060400135610b70565b3480156103c357600080fd5b506101e4600480360360608110156103da57600080fd5b506001600160a01b03813581169160208101359160409091013516610baf565b34801561040657600080fd5b50610366610c92565b34801561041b57600080fd5b506101e46004803603602081101561043257600080fd5b50356001600160a01b0316610cd7565b34801561044e57600080fd5b50610366600480360360a081101561046557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a0810160808201356401000000008111156104a557600080fd5b8201836020820111156104b757600080fd5b803590602001918460018302840111640100000000831117156104d957600080fd5b509092509050610e2e565b3480156104f057600080fd5b506101e46004803603602081101561050757600080fd5b50356001600160a01b0316610f0b565b34801561052357600080fd5b506103666004803603608081101561053a57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135610fc9565b34801561056a57600080fd5b506101e46004803603602081101561058157600080fd5b50356001600160a01b0316610ff7565b34801561059d57600080fd5b506101e46110a6565b610366600480360360408110156105bc57600080fd5b506001600160a01b038135169060200135611166565b3480156105de57600080fd5b506101e4600480360360208110156105f557600080fd5b50356001600160a01b03166111a6565b34801561061157600080fd5b5061026a611299565b34801561062657600080fd5b5061065d6004803603606081101561063d57600080fd5b506001600160a01b038135811691602081013590911690604001356112f9565b6040805192835260208301919091528051918290030190f35b34801561068257600080fd5b506101e46004803603602081101561069957600080fd5b50356001600160a01b0316611410565b3480156106b557600080fd5b506101e4600480360360208110156106cc57600080fd5b50356001600160a01b0316611569565b61036660048036036101208110156106f357600080fd5b6001600160a01b0382358116926020810135926040820135831692606083013581169260808101359260a08201359260c0830135169160e081013591810190610120810161010082013564010000000081111561074f57600080fd5b82018360208201111561076157600080fd5b8035906020019184600183028401116401000000008311171561078357600080fd5b509092509050611712565b34801561079a57600080fd5b506101fb61176a565b3480156107af57600080fd5b506101e4600480360360208110156107c657600080fd5b50356001600160a01b0316611779565b610366600480360360e08110156107ec57600080fd5b506001600160a01b0381358116916020810135916040820135811691606081013582169160808201359160a08101359160c0909101351661183a565b34801561083457600080fd5b506101e46004803603604081101561084b57600080fd5b50803590602001356001600160a01b031661185d565b34801561086d57600080fd5b506101fb61190b565b61087e61191a565b6001600160a01b03811660009081526003602052604090205460ff166108d9576040805162461bcd60e51b815260206004820152600b60248201526a3737ba1030b632b93a32b960a91b604482015290519081900360640190fd5b6001600160a01b0381166000908152600360205260408120805460ff191690555b600554811015610a1e57816001600160a01b03166005828154811061091b57fe5b6000918252602090912001546001600160a01b03161415610a165760058054600019810190811061094857fe5b600091825260209091200154600580546001600160a01b03909216918390811061096e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060058054806109a757fe5b60008281526020808220830160001990810180546001600160a01b0319169055909201909255604080516001600160a01b03861681529182019290925281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a1610a1e565b6001016108fa565b5050565b6008546001600160a01b031681565b6007546040805163011c6d7f60e51b815290516000926001600160a01b03169163238dafe0916004808301926020929190829003018186803b158015610a7657600080fd5b505afa158015610a8a573d6000803e3d6000fd5b505050506040513d6020811015610aa057600080fd5b5051905090565b6001546001600160a01b031681565b60606004805480602002602001604051908101604052809291908181526020018280548015610b0e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610af0575b5050505050905090565b6000610b628a8a8a8a8a8a8a60008b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196892505050565b9a9950505050505050505050565b60006060610ba6858573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee336b204fce5e3e250261100000008860008089611968565b95945050505050565b610bb761191a565b826001600160a01b031663a9059cbb82846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610c1757600080fd5b505af1158015610c2b573d6000803e3d6000fd5b505050506040513d6020811015610c4157600080fd5b5050604080516001600160a01b0380861682526020820185905283168183015290517f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e69181900360600190a1505050565b60075460408051633de39c1160e01b815290516000926001600160a01b031691633de39c11916004808301926020929190829003018186803b158015610a7657600080fd5b610cdf61191a565b6001600160a01b03811660009081526003602052604090205460ff1615610d3e576040805162461bcd60e51b815260206004820152600e60248201526d616c65727465722065786973747360901b604482015290519081900360640190fd5b600554603211610d84576040805162461bcd60e51b815260206004820152600c60248201526b6d617820616c65727465727360a01b604482015290519081900360640190fd5b604080516001600160a01b03831681526001602082015281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a16001600160a01b03166000818152600360205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319169091179055565b60075460405163011fed1560e71b81526001600160a01b03888116600483019081528882166024840152604483018890526064830187905260a06084840190815260a484018690526000949290921692638ff68a80928b928b928b928b928b928b929060c401848480828437600081840152601f19601f820116905080830192505050975050505050505050604080518083038186803b158015610ed157600080fd5b505afa158015610ee5573d6000803e3d6000fd5b505050506040513d6040811015610efb57600080fd5b5060200151979650505050505050565b610f1361191a565b6001600160a01b038116610f5f576040805162461bcd60e51b815260206004820152600e60248201526d06b796265724e6574776f726b20360941b604482015290519081900360640190fd5b600754604080516001600160a01b038085168252909216602083015280517f8936e1f096bf0a8c9df862b3d1d5b82774cad78116200175f00b5b7ba3010b029281900390910190a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006060610feb868686336b204fce5e3e250261100000008860008089611968565b9150505b949350505050565b610fff61191a565b6001600160a01b038116611048576040805162461bcd60e51b815260206004820152600b60248201526a06e65772061646d696e20360ac1b604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146110f3576040805162461bcd60e51b815260206004820152600b60248201526a6e6f742070656e64696e6760a81b604482015290519081900360640190fd5b600154600054604080516001600160a01b03938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000606061119c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee3486336b204fce5e3e250261100000008860008089611968565b9150505b92915050565b6111ae61191a565b6001600160a01b0381166111f3576040805162461bcd60e51b8152602060048201526007602482015266061646d696e20360cc1b604482015290519081900360640190fd5b604080516001600160a01b038316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600054604080516001600160a01b038085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606005805480602002602001604051908101604052809291908181526020018280548015610b0e576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610af0575050505050905090565b60075460405163011fed1560e71b81526001600160a01b038581166004830190815285821660248401526044830185905260006064840181905260a0608485019081526060805160a487015280519296879691951693638ff68a80938b938b938b938a938a93919260c40190608090808383895b8381101561138557818101518382015260200161136d565b50505050905090810190601f1680156113b25780820380516001836020036101000a031916815260200191505b509650505050505050604080518083038186803b1580156113d257600080fd5b505afa1580156113e6573d6000803e3d6000fd5b505050506040513d60408110156113fc57600080fd5b505196606460618902049650945050505050565b61141861191a565b6001600160a01b03811660009081526002602052604090205460ff1615611478576040805162461bcd60e51b815260206004820152600f60248201526e6f70657261746f722065786973747360881b604482015290519081900360640190fd5b6004546032116114bf576040805162461bcd60e51b815260206004820152600d60248201526c6d6178206f70657261746f727360981b604482015290519081900360640190fd5b604080516001600160a01b03831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a16001600160a01b03166000818152600260205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319169091179055565b61157161191a565b6001600160a01b03811660009081526002602052604090205460ff166115cd576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b604482015290519081900360640190fd5b6001600160a01b0381166000908152600260205260408120805460ff191690555b600454811015610a1e57816001600160a01b03166004828154811061160f57fe5b6000918252602090912001546001600160a01b0316141561170a5760048054600019810190811061163c57fe5b600091825260209091200154600480546001600160a01b03909216918390811061166257fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600480548061169b57fe5b60008281526020808220830160001990810180546001600160a01b0319169055909201909255604080516001600160a01b03861681529182019290925281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1610a1e565b6001016115ee565b600061175b8b8b8b8b8b8b8b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061196892505050565b9b9a5050505050505050505050565b6007546001600160a01b031681565b61178161191a565b6001600160a01b0381166117dc576040805162461bcd60e51b815260206004820152601260248201527f6b7962657248696e7448616e646c657220300000000000000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038316815290517f6deb3a98fd141d661e9c0fb2d847541cc0c629cfb100c61011a76f57cb3b3a9b9181900360200190a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000606061185089898989898989600089611968565b9998505050505050505050565b61186561191a565b6040516000906001600160a01b0383169084908381818185875af1925050503d80600081146118b0576040519150601f19603f3d011682016040523d82523d6000602084013e6118b5565b606091505b50509050806118c357600080fd5b604080518481526001600160a01b038416602082015281517fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de929181900390910190a1505050565b6000546001600160a01b031681565b6000546001600160a01b03163314611966576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9030b236b4b760b11b604482015290519081900360640190fd5b565b60006119726124db565b61197e8b8a8c8b611cda565b90506000600760009054906101000a90046001600160a01b03166001600160a01b031663c43190f534338f8f8f8f8f8f8f8f8f6040518c63ffffffff1660e01b8152600401808b6001600160a01b03166001600160a01b031681526020018a6001600160a01b03166001600160a01b03168152602001898152602001886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001868152602001858152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611a8d578181015183820152602001611a75565b50505050905090810190601f168015611aba5780820380516001836020036101000a031916815260200191505b509b5050505050505050505050506020604051808303818588803b158015611ae157600080fd5b505af1158015611af5573d6000803e3d6000fd5b50505050506040513d6020811015611b0c57600080fd5b50519050611b186124f5565b611b258d8c8c8987611e11565b905081816020015114611b695760405162461bcd60e51b81526004018080602001828103825260228152602001806125176022913960400191505060405180910390fd5b8881602001511115611bac5760405162461bcd60e51b815260040180806020018281038252602881526020018061255c6028913960400191505060405180910390fd5b8781604001511015611c05576040805162461bcd60e51b815260206004820152601c60248201527f726174652062656c6f77206d696e436f6e76657273696f6e5261746500000000604482015290519081900360640190fd5b336001600160a01b03167ff724b4df6617473612b53d7f88ecc6ea983074b30960a049fcd0657ffe8080838e8d8d856000015186602001518d8d60405180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200182815260200197505050505050505060405180910390a2602001519c9b505050505050505050505050565b611ce26124db565b6001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611d6057823414611d5b576040805162461bcd60e51b815260206004820152601f60248201527f73656e7420657468206e6f7420657175616c20746f20737263416d6f756e7400604482015290519081900360640190fd5b611da4565b3415611da4576040805162461bcd60e51b815260206004820152600e60248201526d073656e7420657468206e6f7420360941b604482015290519081900360640190fd5b611dae8533611f1f565b8152611dba8483611f1f565b60208201526001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611def57805134018152610fef565b600754610fef906001600160a01b03878116913391168663ffffffff611fe016565b611e196124f5565b600080611e268833611f1f565b9150611e328787611f1f565b905083602001518111611e765760405162461bcd60e51b81526004018080602001828103825260238152602001806125396023913960400191505060405180910390fd5b83518210611ecb576040805162461bcd60e51b815260206004820152601e60248201527f77726f6e6720616d6f756e7420696e20736f7572636520616464726573730000604482015290519081900360640190fd5b83518290038084526020808601518303908501526000906127109087820302049050611f0d818560200151611eff8c612055565b611f088c612055565b612133565b60408501525091979650505050505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611f5757506001600160a01b038116316111a0565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611fad57600080fd5b505afa158015611fc1573d6000803e3d6000fd5b505050506040513d6020811015611fd757600080fd5b505190506111a0565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17905261204f9085906122ea565b50505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156120845750601261212e565b6001600160a01b0382166000908152600660205260409020548061212b57826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156120db57600080fd5b505afa1580156120ef573d6000803e3d6000fd5b505050506040513d602081101561210557600080fd5b50516001600160a01b038416600090815260066020526040902060ff9091169081905590505b90505b919050565b60006b204fce5e3e25026110000000851115612196576040805162461bcd60e51b815260206004820152601360248201527f737263416d6f756e74203e204d41585f51545900000000000000000000000000604482015290519081900360640190fd5b6b204fce5e3e250261100000008411156121f7576040805162461bcd60e51b815260206004820152601460248201527f64657374416d6f756e74203e204d41585f515459000000000000000000000000604482015290519081900360640190fd5b8282106122785760128383031115612256576040805162461bcd60e51b815260206004820152601860248201527f647374202d20737263203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b84838303600a0a02670de0b6b3a764000085028161227057fe5b049050610fef565b601282840311156122d0576040805162461bcd60e51b815260206004820152601860248201527f737263202d20647374203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b84828403600a0a670de0b6b3a76400008602028161227057fe5b6122fc826001600160a01b03166124a2565b61234d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061238b5780518252601f19909201916020918201910161236c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123ed576040519150601f19603f3d011682016040523d82523d6000602084013e6123f2565b606091505b509150915081612449576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561204f5780806020019051602081101561246557600080fd5b505161204f5760405162461bcd60e51b815260040180806020018281038252602a815260200180612584602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610fef575050151592915050565b604051806040016040528060008152602001600081525090565b6040518060600160405280600081526020016000815260200160008152509056fe6b796265724e6574776f726b2072657475726e65642077726f6e6720616d6f756e7477726f6e6720616d6f756e7420696e2064657374696e6174696f6e206164647265737361637475616c206465737420616d6f756e742065786365656473206d617844657374416d6f756e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212201d101b1dacaca5b40fddb2448028d4ec9feebc8c7898168d47eb2e437459c73364736f6c63430006060033
Deployed Bytecode Sourcemap
32170:14241:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;3023:493:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3023:493:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3023:493:0;-1:-1:-1;;;;;3023:493:0;;:::i;:::-;;32374:34;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32374:34:0;;;:::i;:::-;;;;-1:-1:-1;;;;;32374:34:0;;;;;;;;;;;;;;42182:96;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42182:96:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;1114:27;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1114:27:0;;;:::i;1746:105::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1746:105:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1746:105:0;;;;;;;;;;;;;;;;;34760:616;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;34760:616:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34760:616:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34760:616:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;34760:616:0;;-1:-1:-1;34760:616:0;-1:-1:-1;34760:616:0;:::i;:::-;;;;;;;;;;;;;;;;38853:498;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38853:498:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38853:498:0;;;;;;;;;;;;;:::i;5906:235::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5906:235:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;5906:235:0;;;;;;;;;;;;;;;;;:::i;42067:107::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42067:107:0;;;:::i;1970:359::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1970:359:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1970:359:0;-1:-1:-1;;;;;1970:359:0;;:::i;41637:422::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41637:422:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;41637:422:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;41637:422:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41637:422:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;41637:422:0;;-1:-1:-1;41637:422:0;-1:-1:-1;41637:422:0;:::i;39359:265::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39359:265:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39359:265:0;-1:-1:-1;;;;;39359:265:0;;:::i;37270:503::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37270:503:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;37270:503:0;;;;;;;;;;;;;;;;;;;;:::i;4174:215::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4174:215:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4174:215:0;-1:-1:-1;;;;;4174:215:0;;:::i;2801:214::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2801:214:0;;;:::i;38042:494::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;38042:494:0;;;;;;;;:::i;4554:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4554:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4554:256:0;-1:-1:-1;;;;;4554:256:0;;:::i;1859:103::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1859:103:0;;;:::i;40530:482::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40530:482:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40530:482:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2337:372;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2337:372:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2337:372:0;-1:-1:-1;;;;;2337:372:0;;:::i;3524:509::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3524:509:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3524:509:0;-1:-1:-1;;;;;3524:509:0;;:::i;36210:693::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;36210:693:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36210:693:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36210:693:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;36210:693:0;;-1:-1:-1;36210:693:0;-1:-1:-1;36210:693:0;:::i;32334:33::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32334:33:0;;;:::i;39632:272::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39632:272:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39632:272:0;-1:-1:-1;;;;;39632:272:0;;:::i;33396:622::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;33396:622:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5549:234::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5549:234:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5549:234:0;;;;;;-1:-1:-1;;;;;5549:234:0;;:::i;1087:20::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1087:20:0;;;:::i;3023:493::-;3081:11;:9;:11::i;:::-;-1:-1:-1;;;;;3111:17:0;;;;;;:8;:17;;;;;;;;3103:41;;;;;-1:-1:-1;;;3103:41:0;;;;;;;;;;;;-1:-1:-1;;;3103:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3162:17:0;;;;;;:8;:17;;;;;3155:24;;-1:-1:-1;;3155:24:0;;;3192:317;3216:13;:20;3212:24;;3192:317;;;3282:7;-1:-1:-1;;;;;3262:27:0;:13;3276:1;3262:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3262:16:0;:27;3258:240;;;3329:13;3343:20;;-1:-1:-1;;3343:24:0;;;3329:39;;;;;;;;;;;;;;;;3310:13;:16;;-1:-1:-1;;;;;3329:39:0;;;;3324:1;;3310:16;;;;;;;;;;;;;;:58;;;;;-1:-1:-1;;;;;3310:58:0;;;;;-1:-1:-1;;;;;3310:58:0;;;;;;3387:13;:19;;;;;;;;;;;;;;;;;-1:-1:-1;;3387:19:0;;;;;-1:-1:-1;;;;;;3387:19:0;;;;;;;;;3430:28;;;-1:-1:-1;;;;;3430:28:0;;;;;;;;;;;;;;;;;;;;;;;;3477:5;;3258:240;3238:3;;3192:317;;;;3023:493;:::o;32374:34::-;;;-1:-1:-1;;;;;32374:34:0;;:::o;42182:96::-;42248:12;;:22;;;-1:-1:-1;;;42248:22:0;;;;42224:4;;-1:-1:-1;;;;;42248:12:0;;:20;;:22;;;;;;;;;;;;;;:12;:22;;;2:2:-1;;;;27:1;24;17:12;2:2;42248:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42248:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42248:22:0;;-1:-1:-1;42182:96:0;:::o;1114:27::-;;;-1:-1:-1;;;;;1114:27:0;;:::o;1746:105::-;1793:16;1829:14;1822:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1822:21:0;;;;;;;;;;;;;;;;;;;;;;;1746:105;:::o;34760:616::-;35065:7;35105:263;35131:3;35153:9;35181:4;35204:11;35234:13;35266:17;35302:8;35329:1;35349:4;;35105:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;35105:7:0;;-1:-1:-1;;;35105:263:0:i;:::-;35085:283;34760:616;-1:-1:-1;;;;;;;;;;34760:616:0:o;38853:498::-;39000:7;39020:17;39070:273;39096:5;39120:9;6517:42;39184:10;6663:6;39239:17;39283:1;39304;39324:4;39070:7;:273::i;:::-;39050:293;38853:498;-1:-1:-1;;;;;38853:498:0:o;5906:235::-;6029:11;:9;:11::i;:::-;6051:5;-1:-1:-1;;;;;6051:14:0;;6066:6;6074;6051:30;;;;;;;;;;;;;-1:-1:-1;;;;;6051:30:0;-1:-1:-1;;;;;6051:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6051:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6051:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;6097:36:0;;;-1:-1:-1;;;;;6097:36:0;;;;;6051:30;6097:36;;;;;;;;;;;;;;;;;;;;;;5906:235;;;:::o;42067:107::-;42140:12;;:26;;;-1:-1:-1;;;42140:26:0;;;;42113:7;;-1:-1:-1;;;;;42140:12:0;;:24;;:26;;;;;;;;;;;;;;:12;:26;;;2:2:-1;;;;27:1;24;17:12;1970:359:0;2028:11;:9;:11::i;:::-;-1:-1:-1;;;;;2059:20:0;;;;;;:8;:20;;;;;;;;2058:21;2050:48;;;;;-1:-1:-1;;;2050:48:0;;;;;;;;;;;;-1:-1:-1;;;2050:48:0;;;;;;;;;;;;;;;2140:13;:20;1369:2;-1:-1:-1;2132:62:0;;;;;-1:-1:-1;;;2132:62:0;;;;;;;;;;;;-1:-1:-1;;;2132:62:0;;;;;;;;;;;;;;;2212:30;;;-1:-1:-1;;;;;2212:30:0;;;;2237:4;2212:30;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2253:20:0;;;;;:8;:20;;;;;:27;;-1:-1:-1;;2253:27:0;2276:4;2253:27;;;;;;2291:13;27:10:-1;;23:18;;;45:23;;2291:30:0;;;;;;;-1:-1:-1;;;;;;2291:30:0;;;;;;1970:359::o;41637:422::-;41892:12;;:159;;-1:-1:-1;;;41892:159:0;;-1:-1:-1;;;;;41892:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41840:20;;41892:12;;;;;:42;;41949:3;;41967:4;;41986:6;;42007:14;;42036:4;;;;41892:159;;;42036:4;;;;41892:159;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;41892:159:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41892:159:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41892:159:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41892:159:0;;;;41637:422;-1:-1:-1;;;;;;;41637:422:0:o;39359:265::-;39433:11;:9;:11::i;:::-;-1:-1:-1;;;;;39463:33:0;;39455:60;;;;;-1:-1:-1;;;39455:60:0;;;;;;;;;;;;-1:-1:-1;;;39455:60:0;;;;;;;;;;;;;;;39562:12;;39531:44;;;-1:-1:-1;;;;;39531:44:0;;;;;39562:12;;;39531:44;;;;;;;;;;;;;;;;39588:12;:28;;-1:-1:-1;;;;;;39588:28:0;-1:-1:-1;;;;;39588:28:0;;;;;;;;;;39359:265::o;37270:503::-;37437:7;37457:17;37507:258;37533:3;37555:9;37583:4;37606:10;6663:6;37661:17;37705:1;37726;37746:4;37507:7;:258::i;:::-;37487:278;;;37270:503;;;;;;;:::o;4174:215::-;4233:11;:9;:11::i;:::-;-1:-1:-1;;;;;4263:22:0;;4255:46;;;;;-1:-1:-1;;;4255:46:0;;;;;;;;;;;;-1:-1:-1;;;4255:46:0;;;;;;;;;;;;;;;4317:30;;;-1:-1:-1;;;;;4317:30:0;;;;;;;;;;;;;;;4358:12;:23;;-1:-1:-1;;;;;;4358:23:0;-1:-1:-1;;;;;4358:23:0;;;;;;;;;;4174:215::o;2801:214::-;2849:12;;-1:-1:-1;;;;;2849:12:0;2865:10;2849:26;2841:50;;;;;-1:-1:-1;;;2841:50:0;;;;;;;;;;;;-1:-1:-1;;;2841:50:0;;;;;;;;;;;;;;;2920:12;;;2934:5;2907:33;;;-1:-1:-1;;;;;2920:12:0;;;2907:33;;2934:5;;;;2907:33;;;;;;;;;;;;;;;;2959:12;;;;2951:20;;-1:-1:-1;;;;;;2951:20:0;;;-1:-1:-1;;;;;2959:12:0;;2951:20;;;;2982:25;;;2801:214::o;38042:494::-;38180:7;38205:17;38255:273;6517:42;38317:9;38345:5;38369:10;6663:6;38424:17;38468:1;38489;38509:4;38255:7;:273::i;:::-;38235:293;;;38042:494;;;;;:::o;4554:256::-;4620:11;:9;:11::i;:::-;-1:-1:-1;;;;;4650:22:0;;4642:42;;;;;-1:-1:-1;;;4642:42:0;;;;;;;;;;;;-1:-1:-1;;;4642:42:0;;;;;;;;;;;;;;;4700:30;;;-1:-1:-1;;;;;4700:30:0;;;;;;;;;;;;;;;4769:5;;4746:29;;;-1:-1:-1;;;;;4746:29:0;;;;;4769:5;;;4746:29;;;;;;;;;;;;;;;;4786:5;:16;;-1:-1:-1;;;;;;4786:16:0;-1:-1:-1;;;;;4786:16:0;;;;;;;;;;4554:256::o;1859:103::-;1905:16;1941:13;1934:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1934:20:0;;;;;;;;;;;;;;;;;;;;;;1859:103;:::o;40530:482::-;40759:12;;:146;;-1:-1:-1;;;40759:146:0;;-1:-1:-1;;;;;40759:146:0;;;;;;;;;;;;;;;;;;;;;;40660:20;40759:146;;;;;;;;;;;;;40712:17;40759:146;;;;;;;;40660:20;;;;40712:17;;40759:12;;:42;;40816:3;;40834:4;;40853:6;;40660:20;;40712:17;;40759:146;;;;;;;;;;40660:20;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40759:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40759:146:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40759:146:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40759:146:0;;41001:3;40995:2;40980:17;;40979:25;;-1:-1:-1;40530:482:0;-1:-1:-1;;;;;40530:482:0:o;2337:372::-;2397:11;:9;:11::i;:::-;-1:-1:-1;;;;;2428:22:0;;;;;;:9;:22;;;;;;;;2427:23;2419:51;;;;;-1:-1:-1;;;2419:51:0;;;;;;;;;;;;-1:-1:-1;;;2419:51:0;;;;;;;;;;;;;;;2512:14;:21;1369:2;-1:-1:-1;2504:64:0;;;;;-1:-1:-1;;;2504:64:0;;;;;;;;;;;;-1:-1:-1;;;2504:64:0;;;;;;;;;;;;;;;2586:32;;;-1:-1:-1;;;;;2586:32:0;;;;2613:4;2586:32;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2629:22:0;;;;;:9;:22;;;;;:29;;-1:-1:-1;;2629:29:0;2654:4;2629:29;;;;;;2669:14;27:10:-1;;23:18;;;45:23;;2669:32:0;;;;;;;-1:-1:-1;;;;;;2669:32:0;;;;;;2337:372::o;3524:509::-;3584:11;:9;:11::i;:::-;-1:-1:-1;;;;;3614:19:0;;;;;;:9;:19;;;;;;;;3606:44;;;;;-1:-1:-1;;;3606:44:0;;;;;;;;;;;;-1:-1:-1;;;3606:44:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3668:19:0;;;;;;:9;:19;;;;;3661:26;;-1:-1:-1;;3661:26:0;;;3700:326;3724:14;:21;3720:25;;3700:326;;;3792:8;-1:-1:-1;;;;;3771:29:0;:14;3786:1;3771:17;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3771:17:0;:29;3767:248;;;3841:14;3856:21;;-1:-1:-1;;3856:25:0;;;3841:41;;;;;;;;;;;;;;;;3821:14;:17;;-1:-1:-1;;;;;3841:41:0;;;;3836:1;;3821:17;;;;;;;;;;;;;;:61;;;;;-1:-1:-1;;;;;3821:61:0;;;;;-1:-1:-1;;;;;3821:61:0;;;;;;3901:14;:20;;;;;;;;;;;;;;;;;-1:-1:-1;;3901:20:0;;;;;-1:-1:-1;;;;;;3901:20:0;;;;;;;;;3945:30;;;-1:-1:-1;;;;;3945:30:0;;;;;;;;;;;;;;;;;;;;;;;;3994:5;;3767:248;3747:3;;3700:326;;36210:693;36562:18;36613:282;36639:3;36661:9;36689:4;36712:11;36742:13;36774:17;36810:14;36843;36876:4;;36613:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36613:7:0;;-1:-1:-1;;;36613:282:0:i;:::-;36593:302;36210:693;-1:-1:-1;;;;;;;;;;;36210:693:0:o;32334:33::-;;;-1:-1:-1;;;;;32334:33:0;;:::o;39632:272::-;39706:11;:9;:11::i;:::-;-1:-1:-1;;;;;39736:34:0;;39728:65;;;;;-1:-1:-1;;;39728:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39809:38;;;-1:-1:-1;;;;;39809:38:0;;;;;;;;;;;;;;;39860:16;:36;;-1:-1:-1;;;;;;39860:36:0;-1:-1:-1;;;;;39860:36:0;;;;;;;;;;39632:272::o;33396:622::-;33671:7;33691:17;33741:269;33767:3;33789:9;33817:4;33840:11;33870:13;33902:17;33938:14;33971:1;33991:4;33741:7;:269::i;:::-;33721:289;33396:622;-1:-1:-1;;;;;;;;;33396:622:0:o;5549:234::-;5632:11;:9;:11::i;:::-;5673:30;;5655:12;;-1:-1:-1;;;;;5673:11:0;;;5692:6;;5655:12;5673:30;5655:12;5673:30;5692:6;5673:11;:30;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;5654:49:0;;;5722:7;5714:16;;12:1:-1;9;2:12;5714:16:0;5746:29;;;;;;-1:-1:-1;;;;;5746:29:0;;;;;;;;;;;;;;;;;;;5549:234;;;:::o;1087:20::-;;;-1:-1:-1;;;;;1087:20:0;;:::o;4818:96::-;4886:5;;-1:-1:-1;;;;;4886:5:0;4872:10;:19;4864:42;;;;;-1:-1:-1;;;4864:42:0;;;;;;;;;;;;-1:-1:-1;;;4864:42:0;;;;;;;;;;;;;;;4818:96::o;42419:1705::-;42740:7;42760:32;;:::i;:::-;42795:47;42808:3;42813:4;42819:9;42830:11;42795:12;:47::i;:::-;42760:82;;42855:26;42884:12;;;;;;;;;-1:-1:-1;;;;;42884:12:0;-1:-1:-1;;;;;42884:32:0;;42924:9;42949:10;42974:3;42992:9;43016:4;43035:11;43061:13;43089:17;43121:14;43150;43179:4;42884:310;;;;;;;;;;;;;-1:-1:-1;;;;;42884:310:0;-1:-1:-1;;;;;42884:310:0;;;;;;-1:-1:-1;;;;;42884:310:0;-1:-1:-1;;;;;42884:310:0;;;;;;;;;;;-1:-1:-1;;;;;42884:310:0;-1:-1:-1;;;;;42884:310:0;;;;;;-1:-1:-1;;;;;42884:310:0;-1:-1:-1;;;;;42884:310:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42884:310:0;-1:-1:-1;;;;;42884:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42884:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42884:310:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42884:310:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42884:310:0;;-1:-1:-1;43205:32:0;;:::i;:::-;43240:152;43276:3;43294:4;43313:11;43339:14;43368:13;43240:21;:152::i;:::-;43205:187;;43462:18;43427:12;:31;;;:53;43405:137;;;;-1:-1:-1;;;43405:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43610:13;43575:12;:31;;;:48;;43553:138;;;;-1:-1:-1;;;43553:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43737:17;43710:12;:23;;;:44;;43702:85;;;;;-1:-1:-1;;;43702:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43832:10;-1:-1:-1;;;;;43805:260:0;;43857:3;43875:4;43894:11;43920:12;:30;;;43965:12;:31;;;44011:14;44040;43805:260;;;;-1:-1:-1;;;;;43805:260:0;-1:-1:-1;;;;;43805:260:0;;;;;;-1:-1:-1;;;;;43805:260:0;-1:-1:-1;;;;;43805:260:0;;;;;;-1:-1:-1;;;;;43805:260:0;-1:-1:-1;;;;;43805:260:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43805:260:0;-1:-1:-1;;;;;43805:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;44085:31;;;;42419:1705;-1:-1:-1;;;;;;;;;;;;42419:1705:0:o;44322:725::-;44470:32;;:::i;:::-;-1:-1:-1;;;;;44519:24:0;;6517:42;44519:24;44515:197;;;44581:9;44568;:22;44560:66;;;;;-1:-1:-1;;;44560:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44515:197;;;44667:9;:14;44659:41;;;;;-1:-1:-1;;;44659:41:0;;;;;;;;;;;;-1:-1:-1;;;44659:41:0;;;;;;;;;;;;;;;44747:27;44758:3;44763:10;44747;:27::i;:::-;44724:50;;44809:29;44820:4;44826:11;44809:10;:29::i;:::-;44785:21;;;:53;-1:-1:-1;;;;;44855:24:0;;6517:42;44855:24;44851:189;;;44896:33;;44920:9;44896:33;;;44851:189;;;45003:12;;44962:66;;-1:-1:-1;;;;;44962:20:0;;;;44983:10;;45003:12;45018:9;44962:66;:20;:66;:::i;45055:1353::-;45260:27;;:::i;:::-;45300:28;45339:29;45404:27;45415:3;45420:10;45404;:27::i;:::-;45381:50;;45466:29;45477:4;45483:11;45466:10;:29::i;:::-;45442:53;;45588:13;:21;;;45564;:45;45542:130;;;;-1:-1:-1;;;45542:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45691:20;;:43;-1:-1:-1;45683:86:0;;;;;-1:-1:-1;;;45683:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45810:20;;:43;;;45782:71;;;45917:21;;;;;45893:45;;45864:26;;;:74;45810:20;;6905:5;;46150:20;;;46108:63;46107:71;46065:113;;46212:188;46242:31;46288:7;:26;;;46329:22;46347:3;46329:17;:22::i;:::-;46366:23;46384:4;46366:17;:23::i;:::-;46212:15;:188::i;:::-;46191:18;;;:209;-1:-1:-1;46191:7:0;;45055:1353;-1:-1:-1;;;;;;;45055:1353:0:o;8004:237::-;8075:7;-1:-1:-1;;;;;8099:26:0;;6517:42;8099:26;8095:139;;;-1:-1:-1;;;;;;8149:12:0;;;8142:19;;8095:139;8201:5;-1:-1:-1;;;;;8201:15:0;;8217:4;8201:21;;;;;;;;;;;;;-1:-1:-1;;;;;8201:21:0;-1:-1:-1;;;;;8201:21:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8201:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8201:21:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8201:21:0;;-1:-1:-1;8194:28:0;;20960:205;21088:68;;;-1:-1:-1;;;;;21088:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21088:68:0;;;;;;;;25:18:-1;;61:17;;21088:68:0;182:15:-1;-1:-1;;;179:29;160:49;;21061:96:0;;21081:5;;21061:19;:96::i;:::-;20960:205;;;;:::o;7096:508::-;7155:7;-1:-1:-1;;;;;7179:26:0;;6517:42;7179:26;7175:51;;;-1:-1:-1;6873:2:0;7207:19;;7175:51;-1:-1:-1;;;;;7284:15:0;;7260:21;7284:15;;;:8;:15;;;;;;7439:18;7435:129;;7490:5;-1:-1:-1;;;;;7490:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7490:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7490:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7490:16:0;-1:-1:-1;;;;;7521:15:0;;;;;;:8;7490:16;7521:15;;;;7474:32;;;;7521:31;;;;7474:32;-1:-1:-1;7435:129:0;7583:13;-1:-1:-1;7096:508:0;;;;:::o;10946:775::-;11118:7;6663:6;11146:9;:20;;11138:52;;;;;-1:-1:-1;;;11138:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6663:6;11209:10;:21;;11201:54;;;;;-1:-1:-1;;;11201:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11287:11;11272;:26;11268:446;;6823:2;11338:11;11324;:25;11323:43;;11315:80;;;;;-1:-1:-1;;;11315:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11482:9;11466:11;11452;:25;11447:2;:31;11446:45;6612:6;11419:10;:22;11418:74;;;;;;11410:83;;;;11268:446;6823:2;11549:11;11535;:25;11534:43;;11526:80;;;;;-1:-1:-1;;;11526:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11692:9;11675:11;11661;:25;11656:2;:31;6612:6;11630:10;:22;:58;11629:72;;;;22819:1115;23424:27;23432:5;-1:-1:-1;;;;;23424:25:0;;:27::i;:::-;23416:71;;;;;-1:-1:-1;;;23416:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23561:12;23575:23;23610:5;-1:-1:-1;;;;;23602:19:0;23622:4;23602:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23602:25:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;23560:67:0;;;;23646:7;23638:52;;;;;-1:-1:-1;;;23638:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23707:17;;:21;23703:224;;23849:10;23838:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23838:30:0;23830:85;;;;-1:-1:-1;;;23830:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18171:619;18231:4;18699:20;;18542:66;18739:23;;;;;;:42;;-1:-1:-1;;18766:15:0;;;18731:51;-1:-1:-1;;18171:619:0:o;32170:14241::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://1d101b1dacaca5b40fddb2448028d4ec9feebc8c7898168d47eb2e437459c733
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.