More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,480 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
External Swap | 11755625 | 1544 days ago | IN | 0 ETH | 0.0020755 | ||||
External Swap | 11754474 | 1544 days ago | IN | 0 ETH | 0.03420515 | ||||
External Swap | 11754434 | 1544 days ago | IN | 8.8 ETH | 0.03495533 | ||||
External Swap | 11754433 | 1544 days ago | IN | 0 ETH | 0.02814744 | ||||
External Swap | 11754425 | 1544 days ago | IN | 9 ETH | 0.04809425 | ||||
External Swap | 11754404 | 1544 days ago | IN | 1.7458632 ETH | 0.03188136 | ||||
External Swap | 11754387 | 1544 days ago | IN | 1.8 ETH | 0.00256921 | ||||
External Swap | 11754362 | 1544 days ago | IN | 1.74868443 ETH | 0.00282122 | ||||
External Swap | 11754352 | 1544 days ago | IN | 0.85 ETH | 0.00959246 | ||||
Dodo Swap V1 | 11754252 | 1544 days ago | IN | 0 ETH | 0.0171414 | ||||
External Swap | 11754198 | 1544 days ago | IN | 0 ETH | 0.01365833 | ||||
External Swap | 11754192 | 1544 days ago | IN | 0 ETH | 0.02199037 | ||||
Dodo Swap V1 | 11754159 | 1544 days ago | IN | 0 ETH | 0.01195958 | ||||
External Swap | 11754131 | 1544 days ago | IN | 0 ETH | 0.02337435 | ||||
Dodo Swap V1 | 11754074 | 1544 days ago | IN | 0 ETH | 0.01908537 | ||||
External Swap | 11754046 | 1544 days ago | IN | 5 ETH | 0.04351908 | ||||
External Swap | 11753996 | 1544 days ago | IN | 0 ETH | 0.02528221 | ||||
External Swap | 11753995 | 1544 days ago | IN | 0 ETH | 0.08370369 | ||||
External Swap | 11753991 | 1544 days ago | IN | 5 ETH | 0.0127929 | ||||
External Swap | 11753989 | 1544 days ago | IN | 0 ETH | 0.01463392 | ||||
Dodo Swap V1 | 11753987 | 1544 days ago | IN | 0 ETH | 0.01622719 | ||||
Dodo Swap V1 | 11753962 | 1544 days ago | IN | 1.70119942 ETH | 0.04411756 | ||||
External Swap | 11753851 | 1544 days ago | IN | 0.1 ETH | 0.00700166 | ||||
Dodo Swap V1 | 11753816 | 1544 days ago | IN | 0 ETH | 0.01430735 | ||||
External Swap | 11753816 | 1544 days ago | IN | 0 ETH | 0.01011509 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 11754434 | 1544 days ago | 8.8 ETH | ||||
- | 11754433 | 1544 days ago | 1.32829491 ETH | ||||
- | 11754433 | 1544 days ago | 1.32829491 ETH | ||||
- | 11754425 | 1544 days ago | 9 ETH | ||||
- | 11754404 | 1544 days ago | 1.7458632 ETH | ||||
- | 11754352 | 1544 days ago | 0.85 ETH | ||||
- | 11754198 | 1544 days ago | 0.07297111 ETH | ||||
- | 11754192 | 1544 days ago | 2.58908343 ETH | ||||
- | 11754192 | 1544 days ago | 2.58908343 ETH | ||||
- | 11754131 | 1544 days ago | 0.61555687 ETH | ||||
- | 11754131 | 1544 days ago | 0.61555687 ETH | ||||
- | 11754046 | 1544 days ago | 5 ETH | ||||
- | 11753996 | 1544 days ago | 3.77883387 ETH | ||||
- | 11753996 | 1544 days ago | 3.77883387 ETH | ||||
- | 11753991 | 1544 days ago | 5 ETH | ||||
- | 11753989 | 1544 days ago | 0.0684454 ETH | ||||
- | 11753962 | 1544 days ago | 1.70119942 ETH | ||||
- | 11753851 | 1544 days ago | 0.1 ETH | ||||
- | 11753770 | 1544 days ago | 0.72 ETH | ||||
- | 11753704 | 1544 days ago | 0.1 ETH | ||||
- | 11753466 | 1544 days ago | 0.015 ETH | ||||
- | 11753387 | 1544 days ago | 1.26 ETH | ||||
- | 11753342 | 1544 days ago | 1.23628274 ETH | ||||
- | 11753342 | 1544 days ago | 1.23628274 ETH | ||||
- | 11752923 | 1544 days ago | 5.93110898 ETH |
Loading...
Loading
Contract Name:
DODOV1Proxy03
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-20 */ // File: contracts/intf/IERC20.sol // This is a file copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol pragma solidity 0.6.9; /** * @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); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * @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); } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; 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)); } /** * @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 // 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/SmartRoute/lib/UniversalERC20.sol library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer( IERC20 token, address payable to, uint256 amount ) internal { if (amount > 0) { if (isETH(token)) { to.transfer(amount); } else { token.safeTransfer(to, amount); } } } function universalApproveMax( IERC20 token, address to, uint256 amount ) internal { uint256 allowance = token.allowance(address(this), to); if (allowance < amount) { if (allowance > 0) { token.safeApprove(to, 0); } token.safeApprove(to, uint256(-1)); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) { return token.balanceOf(who); } function isETH(IERC20 token) internal pure returns (bool) { return token == ETH_ADDRESS; } } // File: contracts/SmartRoute/intf/IDODOV1.sol interface IDODOV1 { function init( address owner, address supervisor, address maintainer, address baseToken, address quoteToken, address oracle, uint256 lpFeeRate, uint256 mtFeeRate, uint256 k, uint256 gasPriceLimit ) external; function transferOwnership(address newOwner) external; function claimOwnership() external; function sellBaseToken( uint256 amount, uint256 minReceiveQuote, bytes calldata data ) external returns (uint256); function buyBaseToken( uint256 amount, uint256 maxPayQuote, bytes calldata data ) external returns (uint256); function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote); function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote); function depositBaseTo(address to, uint256 amount) external returns (uint256); function withdrawBase(uint256 amount) external returns (uint256); function withdrawAllBase() external returns (uint256); function depositQuoteTo(address to, uint256 amount) external returns (uint256); function withdrawQuote(uint256 amount) external returns (uint256); function withdrawAllQuote() external returns (uint256); function _BASE_CAPITAL_TOKEN_() external returns (address); function _QUOTE_CAPITAL_TOKEN_() external returns (address); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function _R_STATUS_() external view returns (uint8); function _QUOTE_BALANCE_() external view returns (uint256); function _BASE_BALANCE_() external view returns (uint256); function _K_() external view returns (uint256); function _MT_FEE_RATE_() external view returns (uint256); function _LP_FEE_RATE_() external view returns (uint256); function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget); function getOraclePrice() external view returns (uint256); function getMidPrice() external view returns (uint256 midPrice); } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/SmartRoute/helper/DODOSellHelper.sol // import {DODOMath} from "../lib/DODOMath.sol"; interface IDODOSellHelper { function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256); function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256); } library DODOMath { using SafeMath for uint256; /* Integrate dodo curve fron V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta res = i*delta*(1-k+k(V0^2/V1/V2)) */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { uint256 fairAmount = DecimalMath.mulFloor(i, V1.sub(V2)); // i*delta uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.mulFloor(fairAmount, DecimalMath.ONE.sub(k).add(penalty)); } /* The same with integration expression above, we have: i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Given Q1 and deltaB, solve Q2 This is a quadratic function and the standard version is aQ2^2 + bQ2 + c = 0, where a=1-k -b=(1-k)Q1-kQ0^2/Q1+i*deltaB c=-kQ0^2 and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k) note: another root is negative, abondan if deltaBSig=true, then Q2>Q1 if deltaBSig=false, then Q2<Q1 */ function _SolveQuadraticFunctionForTrade( uint256 Q0, uint256 Q1, uint256 ideltaB, bool deltaBSig, uint256 k ) internal pure returns (uint256) { // calculate -b value and sig // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB uint256 kQ02Q1 = DecimalMath.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1 uint256 b = DecimalMath.mulFloor(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1 bool minusbSig = true; if (deltaBSig) { b = b.add(ideltaB); // (1-k)Q1+i*deltaB } else { kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1 } if (b >= kQ02Q1) { b = b.sub(kQ02Q1); minusbSig = true; } else { b = kQ02Q1.sub(b); minusbSig = false; } // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, Q0).mul(Q0) ); // 4(1-k)kQ0^2 squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0) // final res uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k) uint256 numerator; if (minusbSig) { numerator = b.add(squareRoot); } else { numerator = squareRoot.sub(b); } if (deltaBSig) { return DecimalMath.divFloor(numerator, denominator); } else { return DecimalMath.divCeil(numerator, denominator); } } /* Start from the integration function i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 let fairAmount = i*deltaB */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 k, uint256 fairAmount ) internal pure returns (uint256 V0) { // V0 = V1+V1*(sqrt-1)/2k uint256 sqrt = DecimalMath.divCeil(DecimalMath.mulFloor(k, fairAmount).mul(4), V1); sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt(); uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2)); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, DecimalMath.ONE.add(premium)); } } contract DODOSellHelper { using SafeMath for uint256; enum RStatus {ONE, ABOVE_ONE, BELOW_ONE} uint256 constant ONE = 10**18; struct DODOState { uint256 oraclePrice; uint256 K; uint256 B; uint256 Q; uint256 baseTarget; uint256 quoteTarget; RStatus rStatus; } function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) { return IDODOV1(dodo).querySellBaseToken(amount); } function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) { DODOState memory state; (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget(); state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_()); state.oraclePrice = IDODOV1(dodo).getOraclePrice(); state.Q = IDODOV1(dodo)._QUOTE_BALANCE_(); state.B = IDODOV1(dodo)._BASE_BALANCE_(); state.K = IDODOV1(dodo)._K_(); uint256 boughtAmount; // Determine the status (RStatus) and calculate the amount // based on the state if (state.rStatus == RStatus.ONE) { boughtAmount = _ROneSellQuoteToken(amount, state); } else if (state.rStatus == RStatus.ABOVE_ONE) { boughtAmount = _RAboveSellQuoteToken(amount, state); } else { uint256 backOneBase = state.B.sub(state.baseTarget); uint256 backOneQuote = state.quoteTarget.sub(state.Q); if (amount <= backOneQuote) { boughtAmount = _RBelowSellQuoteToken(amount, state); } else { boughtAmount = backOneBase.add( _ROneSellQuoteToken(amount.sub(backOneQuote), state) ); } } // Calculate fees return DecimalMath.divFloor( boughtAmount, DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add( IDODOV1(dodo)._LP_FEE_RATE_() ) ); } function _ROneSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.baseTarget, DecimalMath.mulFloor(i, amount), false, state.K ); return state.baseTarget.sub(B2); } function _RAboveSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receieBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.B, DecimalMath.mulFloor(i, amount), false, state.K ); return state.B.sub(B2); } function _RBelowSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 Q1 = state.Q.add(amount); uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K); } } // File: contracts/intf/IWETH.sol interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/SmartRoute/intf/IChi.sol interface IChi { function freeUpTo(uint256 value) external returns (uint256); } // File: contracts/SmartRoute/intf/IUni.sol interface IUni { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); function token1() external view returns (address); } // File: contracts/intf/IDODOApprove.sol interface IDODOApprove { function claimTokens(address token,address who,address dest,uint256 amount) external; function getDODOProxy() external view returns (address); } // File: contracts/SmartRoute/intf/IDODOV1Proxy02.sol interface IDODOV1Proxy02 { function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, uint256 deadLine ) external payable returns (uint256 returnAmount); function externalSwap( address fromToken, address toToken, address approveTarget, address to, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, uint256 deadLine ) external payable returns (uint256 returnAmount); function mixSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixPairs, uint256[] memory directions, address[] memory portionPath, uint256 deadLine ) external payable returns (uint256 returnAmount); } // File: contracts/lib/InitializableOwnable.sol /** * @title Ownable * @author DODO Breeder * * @notice Ownership related functions */ contract InitializableOwnable { address public _OWNER_; address public _NEW_OWNER_; bool internal _INITIALIZED_; // ============ Events ============ event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ============ Modifiers ============ modifier notInitialized() { require(!_INITIALIZED_, "DODO_INITIALIZED"); _; } modifier onlyOwner() { require(msg.sender == _OWNER_, "NOT_OWNER"); _; } // ============ Functions ============ function initOwner(address newOwner) public notInitialized { _INITIALIZED_ = true; _OWNER_ = newOwner; } function transferOwnership(address newOwner) public onlyOwner { emit OwnershipTransferPrepared(_OWNER_, newOwner); _NEW_OWNER_ = newOwner; } function claimOwnership() public { require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM"); emit OwnershipTransferred(_OWNER_, _NEW_OWNER_); _OWNER_ = _NEW_OWNER_; _NEW_OWNER_ = address(0); } } // File: contracts/SmartRoute/DODOV1Proxy03.sol /** * @title DODOV1Proxy03 * @author DODO Breeder * * @notice Entrance of trading in DODO platform */ contract DODOV1Proxy03 is IDODOV1Proxy02, InitializableOwnable { using SafeMath for uint256; using UniversalERC20 for IERC20; // ============ Storage ============ address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public immutable _DODO_APPROVE_; address public immutable _DODO_SELL_HELPER_; address public immutable _WETH_; address public immutable _CHI_TOKEN_; uint256 public _GAS_DODO_MAX_RETURN_ = 10; uint256 public _GAS_EXTERNAL_RETURN_ = 5; mapping (address => bool) public isWhiteListed; // ============ Events ============ event OrderHistory( address indexed fromToken, address indexed toToken, address indexed sender, uint256 fromAmount, uint256 returnAmount ); // ============ Modifiers ============ modifier judgeExpired(uint256 deadLine) { require(deadLine >= block.timestamp, "DODOV1Proxy03: EXPIRED"); _; } constructor( address dodoApporve, address dodoSellHelper, address weth, address chiToken ) public { _DODO_APPROVE_ = dodoApporve; _DODO_SELL_HELPER_ = dodoSellHelper; _WETH_ = weth; _CHI_TOKEN_ = chiToken; } fallback() external payable {} receive() external payable {} function updateGasReturn(uint256 newDodoGasReturn, uint256 newExternalGasReturn) public onlyOwner { _GAS_DODO_MAX_RETURN_ = newDodoGasReturn; _GAS_EXTERNAL_RETURN_ = newExternalGasReturn; } function addWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = true; } function removeWhiteList (address contractAddr) public onlyOwner { isWhiteListed[contractAddr] = false; } function dodoSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory dodoPairs, uint256 directions, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(dodoPairs.length > 0, "DODOV1Proxy03: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy03: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_BUY_CHI"); uint256 originGas = gasleft(); if (fromToken != _ETH_ADDRESS_) { IDODOApprove(_DODO_APPROVE_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); } else { require(msg.value == fromTokenAmount, "DODOV1Proxy03: ETH_AMOUNT_NOT_MATCH"); IWETH(_WETH_).deposit{value: fromTokenAmount}(); } for (uint256 i = 0; i < dodoPairs.length; i++) { address curDodoPair = dodoPairs[i]; if (directions & 1 == 0) { address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_(); require(curDodoBase != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); require(curDodoQuote != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curDodoPair, curAmountIn ); IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } directions = directions >> 1; } if (toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); } else { returnAmount = IERC20(toToken).tokenBalanceOf(address(this)); } require(returnAmount >= minReturnAmount, "DODOV1Proxy03: Return amount is not enough"); IERC20(toToken).universalTransfer(msg.sender, returnAmount); emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount); uint256 _gasDodoMaxReturn = _GAS_DODO_MAX_RETURN_; if(_gasDodoMaxReturn > 0) { uint256 calcGasTokenBurn = originGas.sub(gasleft()) / 65000; uint256 gasTokenBurn = calcGasTokenBurn > _gasDodoMaxReturn ? _gasDodoMaxReturn : calcGasTokenBurn; if(gasleft() > 27710 + gasTokenBurn * 6080) IChi(_CHI_TOKEN_).freeUpTo(gasTokenBurn); } } function externalSwap( address fromToken, address toToken, address approveTarget, address swapTarget, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(minReturnAmount > 0, "DODOV1Proxy03: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_BUY_CHI"); address _fromToken = fromToken; address _toToken = toToken; uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender); if (_fromToken != _ETH_ADDRESS_) { IDODOApprove(_DODO_APPROVE_).claimTokens( _fromToken, msg.sender, address(this), fromTokenAmount ); IERC20(_fromToken).universalApproveMax(approveTarget, fromTokenAmount); } require(isWhiteListed[swapTarget], "DODOV1Proxy03: Not Whitelist Contract"); (bool success, ) = swapTarget.call{value: _fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); require(success, "DODOV1Proxy03: External Swap execution Failed"); IERC20(_toToken).universalTransfer( msg.sender, IERC20(_toToken).universalBalanceOf(address(this)) ); returnAmount = IERC20(_toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV1Proxy03: Return amount is not enough"); emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount); uint256 _gasExternalReturn = _GAS_EXTERNAL_RETURN_; if(_gasExternalReturn > 0) { if(gasleft() > 27710 + _gasExternalReturn * 6080) IChi(_CHI_TOKEN_).freeUpTo(_gasExternalReturn); } } function mixSwapV1( address fromToken, address toToken, uint256 fromTokenAmount, uint256 minReturnAmount, address[] memory mixPairs, uint256[] memory directions, address[] memory portionPath, uint256 deadLine ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) { require(mixPairs.length == directions.length, "DODOV1Proxy03: PARAMS_LENGTH_NOT_MATCH"); require(mixPairs.length > 0, "DODOV1Proxy03: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy03: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_BUY_CHI"); uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); if (fromToken != _ETH_ADDRESS_) { IDODOApprove(_DODO_APPROVE_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); } else { require(msg.value == fromTokenAmount, "DODOV1Proxy03: ETH_AMOUNT_NOT_MATCH"); IWETH(_WETH_).deposit{value: fromTokenAmount}(); } for (uint256 i = 0; i < mixPairs.length; i++) { address curPair = mixPairs[i]; if (directions[i] == 0) { address curDodoBase = IDODOV1(curPair)._BASE_TOKEN_(); require(curDodoBase != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curPair, curAmountIn); IDODOV1(curPair).sellBaseToken(curAmountIn, 0, ""); } else if(directions[i] == 1){ address curDodoQuote = IDODOV1(curPair)._QUOTE_TOKEN_(); require(curDodoQuote != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curPair, curAmountIn ); IDODOV1(curPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } else { require(portionPath[0] != _CHI_TOKEN_, "DODOV1Proxy03: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(portionPath[0]).balanceOf(address(this)); IERC20(portionPath[0]).universalApproveMax(curPair, curAmountIn); IUni(curPair).swapExactTokensForTokens(curAmountIn,0,portionPath,address(this),deadLine); } } IERC20(toToken).universalTransfer( msg.sender, IERC20(toToken).universalBalanceOf(address(this)) ); returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV1Proxy03: Return amount is not enough"); emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount); uint256 _gasExternalReturn = _GAS_EXTERNAL_RETURN_; if(_gasExternalReturn > 0) { if(gasleft() > 27710 + _gasExternalReturn * 6080) IChi(_CHI_TOKEN_).freeUpTo(_gasExternalReturn); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"dodoApporve","type":"address"},{"internalType":"address","name":"dodoSellHelper","type":"address"},{"internalType":"address","name":"weth","type":"address"},{"internalType":"address","name":"chiToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"OrderHistory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_CHI_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_APPROVE_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_SELL_HELPER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_GAS_DODO_MAX_RETURN_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_GAS_EXTERNAL_RETURN_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WETH_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"mixPairs","type":"address[]"},{"internalType":"uint256[]","name":"directions","type":"uint256[]"},{"internalType":"address[]","name":"portionPath","type":"address[]"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"mixSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDodoGasReturn","type":"uint256"},{"internalType":"uint256","name":"newExternalGasReturn","type":"uint256"}],"name":"updateGasReturn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610100604052600a600255600560035534801561001b57600080fd5b506040516130c83803806130c88339818101604052608081101561003e57600080fd5b508051602082015160408301516060938401516001600160601b031993851b841660805291841b831660a052831b821660c05290911b1660e05260805160601c60a05160601c60c05160601c60e05160601c612f9c61012c600039806106b9528061089452806109055280610cda5280610f3c5280610fad528061122f528061143152806118d25280611af05280611b615280611e0b52806120295280612263528061264f525080610765528061112152806116b7528061174d5280611ced52508061155d52806119a652806121555250806109ec5280610d7f528061107a5280611c465250612f9c6000f3fe60806040526004361061010d5760003560e01c806369dba8ee11610095578063af1280b011610064578063af1280b01461043f578063b0ef714f14610454578063d6354c3e14610621578063e7cd4a0414610651578063f2fde38b1461068457610114565b806369dba8ee146103b95780636f9170f6146103ce5780638456db15146104155780639f6873221461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d757806346e74298146102c45780634e71e0c8146102d9578063637d7696146102ee57610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b5061012b610d7d565b3480156102e557600080fd5b50610114610da1565b6102b2600480360360e081101561030457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561034357600080fd5b82018360208201111561035557600080fd5b803590602001918460208302840111600160201b8311171561037657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610e54565b3480156103c557600080fd5b506102b2611974565b3480156103da57600080fd5b50610401600480360360208110156103f157600080fd5b50356001600160a01b031661197a565b604080519115158252519081900360200190f35b34801561042157600080fd5b5061012b61198f565b34801561043657600080fd5b506102b261199e565b34801561044b57600080fd5b5061012b6119a4565b6102b2600480360361010081101561046b57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506119c8915050565b34801561062d57600080fd5b506101146004803603604081101561064457600080fd5b50803590602001356126ef565b34801561065d57600080fd5b506101146004803603602081101561067457600080fd5b50356001600160a01b0316612745565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b03166127b4565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614156109745760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b898960006109916001600160a01b0383163363ffffffff61285a16565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a63576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b50610a63925050506001600160a01b0384168c8b612906565b6001600160a01b038a1660009081526004602052604090205460ff16610aba5760405162461bcd60e51b8152600401808060200182810382526025815260200180612eb56025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610aeb576000610aed565b345b896040518082805190602001908083835b60208310610b1d5780518252601f199092019160209182019101610afe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180612f3a602d913960400191505060405180910390fd5b610bf833610be16001600160a01b0386163063ffffffff61285a16565b6001600160a01b038616919063ffffffff6129d016565b610c2182610c156001600160a01b0386163363ffffffff61285a16565b9063ffffffff612a3f16565b955088861015610c625760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610d6b57806117c002616c3e015a1115610d6b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b50505b50505050505098975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314610df0576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610ea5576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b6000855111610efb576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930333a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610f3a5760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161415610fab5760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b0316141561101c5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110e1576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050611194565b87341461111f5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e426023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b50505050505b60005b86518110156116715760008782815181106111ae57fe5b6020026020010151905086600116600014156113c6576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d602081101561122957600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116908216141561129d576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d602081101561131157600080fd5b5051905061132f6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050506040513d60208110156113bc57600080fd5b5061166492505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d602081101561142b57600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116908216141561149f576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d602081101561151357600080fd5b505190506115316001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b1580156115a357600080fd5b505afa1580156115b7573d6000803e3d6000fd5b505050506040513d60208110156115cd57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b50505050505b50600195861c9501611197565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117b257604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156116fd57600080fd5b505afa158015611711573d6000803e3d6000fd5b505050506040513d602081101561172757600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506117ce565b6117cb6001600160a01b038a163063ffffffff612a8816565b92505b8683101561180d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b6118276001600160a01b038a16338563ffffffff6129d016565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a4600254801561196657600061fde86118a35a859063ffffffff612a3f16565b816118aa57fe5b04905060008282116118bc57816118be565b825b9050806117c002616c3e015a1115611963577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506040513d602081101561196057600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008142811015611a19576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b8451865114611a595760405162461bcd60e51b8152600401808060200182810382526026815260200180612e8f6026913960400191505060405180910390fd5b6000865111611aaf576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930333a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008711611aee5760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b03161415611b5f5760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161415611bd05760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b6000611beb6001600160a01b038b163363ffffffff61285a16565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611cad576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b50505050611d60565b883414611ceb5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e426023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d4657600080fd5b505af1158015611d5a573d6000803e3d6000fd5b50505050505b60005b8751811015612544576000888281518110611d7a57fe5b60200260200101519050878281518110611d9057fe5b602002602001015160001415611fa2576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ddb57600080fd5b505afa158015611def573d6000803e3d6000fd5b505050506040513d6020811015611e0557600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415611e79576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611ec357600080fd5b505afa158015611ed7573d6000803e3d6000fd5b505050506040513d6020811015611eed57600080fd5b50519050611f0b6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5061253b92505050565b878281518110611fae57fe5b602002602001015160011415612261576000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611ff957600080fd5b505afa15801561200d573d6000803e3d6000fd5b505050506040513d602081101561202357600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415612097576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120e157600080fd5b505afa1580156120f5573d6000803e3d6000fd5b505050506040513d602081101561210b57600080fd5b505190506121296001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561219b57600080fd5b505afa1580156121af573d6000803e3d6000fd5b505050506040513d60208110156121c557600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561222c57600080fd5b505af1158015612240573d6000803e3d6000fd5b505050506040513d602081101561225657600080fd5b5061253b9350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168760008151811061229857fe5b60200260200101516001600160a01b031614156122ea576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b6000876000815181106122f957fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561235657600080fd5b505afa15801561236a573d6000803e3d6000fd5b505050506040513d602081101561238057600080fd5b505188519091506123ba90839083908b9060009061239a57fe5b60200260200101516001600160a01b03166129069092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612448578181015183820152602001612430565b505050509050019650505050505050600060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156124ae57600080fd5b8101908080516040519392919084600160201b8211156124cd57600080fd5b9083019060208201858111156124e257600080fd5b82518660208202830111600160201b821117156124fe57600080fd5b82525081516020918201928201910280838360005b8381101561252b578181015183820152602001612513565b5050505090500160405250505050505b50600101611d63565b50612579336125626001600160a01b038d163063ffffffff61285a16565b6001600160a01b038d16919063ffffffff6129d016565b61259681610c156001600160a01b038d163363ffffffff61285a16565b9250878310156125d75760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a460035480156126e057806117c002616c3e015a11156126e0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126b357600080fd5b505af11580156126c7573d6000803e3d6000fd5b505050506040513d60208110156126dd57600080fd5b50505b50505098975050505050505050565b6000546001600160a01b0316331461273a576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b03163314612790576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546001600160a01b031633146127ff576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600061286583612ae0565b1561287b57506001600160a01b03811631612900565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561295757600080fd5b505afa15801561296b573d6000803e3d6000fd5b505050506040513d602081101561298157600080fd5b50519050818110156129ca5780156129ae576129ae6001600160a01b03851684600063ffffffff612b0516565b6129ca6001600160a01b0385168460001963ffffffff612b0516565b50505050565b8015612a3a576129df83612ae0565b15612a20576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50612a3a565b612a3a6001600160a01b038416838363ffffffff612c1816565b505050565b600082821115612a82576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b801580612b8b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d6020811015612b8757600080fd5b5051155b612bc65760405162461bcd60e51b8152600401808060200182810382526036815260200180612f046036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a3a908490612c66565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a3a9084905b60006060836001600160a01b0316836040518082805190602001908083835b60208310612ca45780518252601f199092019160209182019101612c85565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d06576040519150601f19603f3d011682016040523d82523d6000602084013e612d0b565b606091505b509150915081612d62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129ca57808060200190516020811015612d7e57600080fd5b50516129ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180612eda602a913960400191505060405180910390fdfe444f444f563150726f787930333a204e4f545f535550504f52545f53454c4c5f434849444f444f563150726f787930333a204e4f545f535550504f52545f4255595f434849444f444f563150726f787930333a2052455455524e5f414d4f554e545f5a45524f444f444f563150726f787930333a204e4f545f535550504f52545f4348490000444f444f563150726f787930333a204554485f414d4f554e545f4e4f545f4d41544348444f444f563150726f787930333a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930333a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930333a204e6f742057686974656c69737420436f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365444f444f563150726f787930333a2045787465726e616c205377617020657865637574696f6e204661696c6564a2646970667358221220b028800e023b4d0e62b3aff02dd14f5553d71437056721d3ef0f3abe1be289e864736f6c63430006090033000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Deployed Bytecode
0x60806040526004361061010d5760003560e01c806369dba8ee11610095578063af1280b011610064578063af1280b01461043f578063b0ef714f14610454578063d6354c3e14610621578063e7cd4a0414610651578063f2fde38b1461068457610114565b806369dba8ee146103b95780636f9170f6146103ce5780638456db15146104155780639f6873221461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d757806346e74298146102c45780634e71e0c8146102d9578063637d7696146102ee57610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b5061012b610d7d565b3480156102e557600080fd5b50610114610da1565b6102b2600480360360e081101561030457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561034357600080fd5b82018360208201111561035557600080fd5b803590602001918460208302840111600160201b8311171561037657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610e54565b3480156103c557600080fd5b506102b2611974565b3480156103da57600080fd5b50610401600480360360208110156103f157600080fd5b50356001600160a01b031661197a565b604080519115158252519081900360200190f35b34801561042157600080fd5b5061012b61198f565b34801561043657600080fd5b506102b261199e565b34801561044b57600080fd5b5061012b6119a4565b6102b2600480360361010081101561046b57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506119c8915050565b34801561062d57600080fd5b506101146004803603604081101561064457600080fd5b50803590602001356126ef565b34801561065d57600080fd5b506101146004803603602081101561067457600080fd5b50356001600160a01b0316612745565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b03166127b4565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c81565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b031614156109745760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b898960006109916001600160a01b0383163363ffffffff61285a16565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a63576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b50610a63925050506001600160a01b0384168c8b612906565b6001600160a01b038a1660009081526004602052604090205460ff16610aba5760405162461bcd60e51b8152600401808060200182810382526025815260200180612eb56025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610aeb576000610aed565b345b896040518082805190602001908083835b60208310610b1d5780518252601f199092019160209182019101610afe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180612f3a602d913960400191505060405180910390fd5b610bf833610be16001600160a01b0386163063ffffffff61285a16565b6001600160a01b038616919063ffffffff6129d016565b610c2182610c156001600160a01b0386163363ffffffff61285a16565b9063ffffffff612a3f16565b955088861015610c625760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610d6b57806117c002616c3e015a1115610d6b577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b50505b50505050505098975050505050505050565b7f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514981565b6001546001600160a01b03163314610df0576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610ea5576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b6000855111610efb576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930333a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610f3a5760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b03161415610fab5760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316886001600160a01b0316141561101c5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110e1576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b50505050611194565b87341461111f5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e426023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b50505050505b60005b86518110156116715760008782815181106111ae57fe5b6020026020010151905086600116600014156113c6576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d602081101561122957600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03908116908216141561129d576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112e757600080fd5b505afa1580156112fb573d6000803e3d6000fd5b505050506040513d602081101561131157600080fd5b5051905061132f6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050506040513d60208110156113bc57600080fd5b5061166492505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d602081101561142b57600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03908116908216141561149f576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d602081101561151357600080fd5b505190506115316001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b1580156115a357600080fd5b505afa1580156115b7573d6000803e3d6000fd5b505050506040513d60208110156115cd57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b50505050505b50600195861c9501611197565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156117b257604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b1580156116fd57600080fd5b505afa158015611711573d6000803e3d6000fd5b505050506040513d602081101561172757600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691632e1a7d4d9160248082019260009290919082900301818387803b15801561179557600080fd5b505af11580156117a9573d6000803e3d6000fd5b505050506117ce565b6117cb6001600160a01b038a163063ffffffff612a8816565b92505b8683101561180d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b6118276001600160a01b038a16338563ffffffff6129d016565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a4600254801561196657600061fde86118a35a859063ffffffff612a3f16565b816118aa57fe5b04905060008282116118bc57816118be565b825b9050806117c002616c3e015a1115611963577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561193657600080fd5b505af115801561194a573d6000803e3d6000fd5b505050506040513d602081101561196057600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb81565b60008142811015611a19576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0cce881156141254915160521b604482015290519081900360640190fd5b8451865114611a595760405162461bcd60e51b8152600401808060200182810382526026815260200180612e8f6026913960400191505060405180910390fd5b6000865111611aaf576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930333a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008711611aee5760405162461bcd60e51b8152600401808060200182810382526021815260200180612e016021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b03161415611b5f5760405162461bcd60e51b8152600401808060200182810382526023815260200180612dbc6023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b03161415611bd05760405162461bcd60e51b8152600401808060200182810382526022815260200180612ddf6022913960400191505060405180910390fd5b6000611beb6001600160a01b038b163363ffffffff61285a16565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611cad576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b158015611c9057600080fd5b505af1158015611ca4573d6000803e3d6000fd5b50505050611d60565b883414611ceb5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e426023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d4657600080fd5b505af1158015611d5a573d6000803e3d6000fd5b50505050505b60005b8751811015612544576000888281518110611d7a57fe5b60200260200101519050878281518110611d9057fe5b602002602001015160001415611fa2576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ddb57600080fd5b505afa158015611def573d6000803e3d6000fd5b505050506040513d6020811015611e0557600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415611e79576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611ec357600080fd5b505afa158015611ed7573d6000803e3d6000fd5b505050506040513d6020811015611eed57600080fd5b50519050611f0b6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5061253b92505050565b878281518110611fae57fe5b602002602001015160011415612261576000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611ff957600080fd5b505afa15801561200d573d6000803e3d6000fd5b505050506040513d602081101561202357600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415612097576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120e157600080fd5b505afa1580156120f5573d6000803e3d6000fd5b505050506040513d602081101561210b57600080fd5b505190506121296001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b15801561219b57600080fd5b505afa1580156121af573d6000803e3d6000fd5b505050506040513d60208110156121c557600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561222c57600080fd5b505af1158015612240573d6000803e3d6000fd5b505050506040513d602081101561225657600080fd5b5061253b9350505050565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168760008151811061229857fe5b60200260200101516001600160a01b031614156122ea576040805162461bcd60e51b815260206004820152601e6024820152600080516020612e22833981519152604482015290519081900360640190fd5b6000876000815181106122f957fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561235657600080fd5b505afa15801561236a573d6000803e3d6000fd5b505050506040513d602081101561238057600080fd5b505188519091506123ba90839083908b9060009061239a57fe5b60200260200101516001600160a01b03166129069092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612448578181015183820152602001612430565b505050509050019650505050505050600060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156124ae57600080fd5b8101908080516040519392919084600160201b8211156124cd57600080fd5b9083019060208201858111156124e257600080fd5b82518660208202830111600160201b821117156124fe57600080fd5b82525081516020918201928201910280838360005b8381101561252b578181015183820152602001612513565b5050505090500160405250505050505b50600101611d63565b50612579336125626001600160a01b038d163063ffffffff61285a16565b6001600160a01b038d16919063ffffffff6129d016565b61259681610c156001600160a01b038d163363ffffffff61285a16565b9250878310156125d75760405162461bcd60e51b815260040180806020018281038252602a815260200180612e65602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a460035480156126e057806117c002616c3e015a11156126e0577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156126b357600080fd5b505af11580156126c7573d6000803e3d6000fd5b505050506040513d60208110156126dd57600080fd5b50505b50505098975050505050505050565b6000546001600160a01b0316331461273a576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b03163314612790576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546001600160a01b031633146127ff576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600061286583612ae0565b1561287b57506001600160a01b03811631612900565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561295757600080fd5b505afa15801561296b573d6000803e3d6000fd5b505050506040513d602081101561298157600080fd5b50519050818110156129ca5780156129ae576129ae6001600160a01b03851684600063ffffffff612b0516565b6129ca6001600160a01b0385168460001963ffffffff612b0516565b50505050565b8015612a3a576129df83612ae0565b15612a20576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50612a3a565b612a3a6001600160a01b038416838363ffffffff612c1816565b505050565b600082821115612a82576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b801580612b8b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d6020811015612b8757600080fd5b5051155b612bc65760405162461bcd60e51b8152600401808060200182810382526036815260200180612f046036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a3a908490612c66565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a3a9084905b60006060836001600160a01b0316836040518082805190602001908083835b60208310612ca45780518252601f199092019160209182019101612c85565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d06576040519150601f19603f3d011682016040523d82523d6000602084013e612d0b565b606091505b509150915081612d62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129ca57808060200190516020811015612d7e57600080fd5b50516129ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180612eda602a913960400191505060405180910390fdfe444f444f563150726f787930333a204e4f545f535550504f52545f53454c4c5f434849444f444f563150726f787930333a204e4f545f535550504f52545f4255595f434849444f444f563150726f787930333a2052455455524e5f414d4f554e545f5a45524f444f444f563150726f787930333a204e4f545f535550504f52545f4348490000444f444f563150726f787930333a204554485f414d4f554e545f4e4f545f4d41544348444f444f563150726f787930333a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930333a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930333a204e6f742057686974656c69737420436f6e74726163745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365444f444f563150726f787930333a2045787465726e616c205377617020657865637574696f6e204661696c6564a2646970667358221220b028800e023b4d0e62b3aff02dd14f5553d71437056721d3ef0f3abe1be289e864736f6c63430006090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
-----Decoded View---------------
Arg [0] : dodoApporve (address): 0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149
Arg [1] : dodoSellHelper (address): 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb
Arg [2] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : chiToken (address): 0x0000000000004946c0e9F43F4Dee607b0eF1fA1c
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149
Arg [1] : 000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Deployed Bytecode Sourcemap
23888:10866:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24291:36;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;24291:36:0;;;;;;;;;;;;;;23159:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23159:127:0;-1:-1:-1;;;;;23159:127:0;;:::i;24253:31::-;;;;;;;;;;;;;:::i;22526:22::-;;;;;;;;;;;;;:::i;25626:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25626:119:0;-1:-1:-1;;;;;25626:119:0;;:::i;29086:2085::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29086:2085:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29086:2085:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29086:2085:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29086:2085:0;;-1:-1:-1;;29086:2085:0;;;-1:-1:-1;29086:2085:0;;-1:-1:-1;;29086:2085:0:i;:::-;;;;;;;;;;;;;;;;24157:39;;;;;;;;;;;;;:::i;23465:228::-;;;;;;;;;;;;;:::i;25753:3325::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25753:3325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25753:3325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25753:3325:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25753:3325:0;;-1:-1:-1;;25753:3325:0;;;-1:-1:-1;;;25753:3325:0;;;;:::i;24382:40::-;;;;;;;;;;;;;:::i;24429:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24429:46:0;-1:-1:-1;;;;;24429:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;22555:26;;;;;;;;;;;;;:::i;24334:41::-;;;;;;;;;;;;;:::i;24203:43::-;;;;;;;;;;;;;:::i;31181:3570::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31181:3570:0;;;;;;;;-1:-1:-1;31181:3570:0;;-1:-1:-1;;;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31181:3570:0;;;;;;;;-1:-1:-1;31181:3570:0;;-1:-1:-1;;;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31181:3570:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31181:3570:0;;-1:-1:-1;;31181:3570:0;;;-1:-1:-1;31181:3570:0;;-1:-1:-1;;31181:3570:0:i;25283:212::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25283:212:0;;;;;;;:::i;25503:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25503:115:0;-1:-1:-1;;;;;25503:115:0;;:::i;23294:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23294:163:0;-1:-1:-1;;;;;23294:163:0;;:::i;24291:36::-;;;:::o;23159:127::-;22948:13;;-1:-1:-1;;;22948:13:0;;;;22947:14;22939:43;;;;;-1:-1:-1;;;22939:43:0;;;;;;;;;;;;-1:-1:-1;;;22939:43:0;;;;;;;;;;;;;;;23245:4:::1;23229:20:::0;;-1:-1:-1;;;;23229:20:0::1;-1:-1:-1::0;;;23229:20:0::1;::::0;;;23260:18;;-1:-1:-1;;;;;23260:18:0;;::::1;-1:-1:-1::0;;;;;;23260:18:0;;::::1;::::0;;;::::1;::::0;;23159:127::o;24253:31::-;;;:::o;22526:22::-;;;-1:-1:-1;;;;;22526:22:0;;:::o;25626:119::-;23064:7;;-1:-1:-1;;;;;23064:7:0;23050:10;:21;23042:43;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25702:27:0::1;25732:5;25702:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;25702:35:0::1;::::0;;25626:119::o;29086:2085::-;29421:20;29402:8;24841:15;24829:8;:27;;24821:62;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;;;;29480:1:::1;29462:15;:19;29454:65;;;;-1:-1:-1::0;;;29454:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29551:11;-1:-1:-1::0;;;;;29538:24:0::1;:9;-1:-1:-1::0;;;;;29538:24:0::1;;;29530:72;;;;-1:-1:-1::0;;;29530:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29632:11;-1:-1:-1::0;;;;;29621:22:0::1;:7;-1:-1:-1::0;;;;;29621:22:0::1;;;29613:69;;;;-1:-1:-1::0;;;29613:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29716:9:::0;29755:7;29695:18:::1;29814:47;-1:-1:-1::0;;;;;29814:35:0;::::1;29850:10;29814:47;:35;:47;:::i;:::-;29783:78:::0;-1:-1:-1;;;;;;29878:27:0;::::1;24108:42;29878:27;29874:324;;29922:179;::::0;;-1:-1:-1;;;29922:179:0;;-1:-1:-1;;;;;29922:179:0;;::::1;;::::0;::::1;::::0;30010:10:::1;29922:179:::0;;;;30047:4:::1;29922:179:::0;;;;;;;;;;;;29935:14:::1;29922:40:::0;;::::1;::::0;::::1;::::0;:179;;;;;-1:-1:-1;;29922:179:0;;;;;;;;-1:-1:-1;29922:40:0;:179;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;30116:70:0::1;::::0;-1:-1:-1;;;;;;;;30116:38:0;::::1;30155:13:::0;30170:15;30116:38:::1;:70::i;:::-;-1:-1:-1::0;;;;;30218:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;30210:75;;;;-1:-1:-1::0;;;30210:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30297:12;-1:-1:-1::0;;;;;30315:15:0;;::::1;::::0;30338:27;::::1;24108:42;30338:27;:43;;30380:1;30338:43;;;30368:9;30338:43;30383:14;30315:83;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;30315:83:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30296:102;;;30419:7;30411:65;;;;-1:-1:-1::0;;;30411:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30489:135;30538:10;30563:50;-1:-1:-1::0;;;;;30563:35:0;::::1;30607:4;30563:50;:35;:50;:::i;:::-;-1:-1:-1::0;;;;;30489:34:0;::::1;::::0;:135;::::1;:34;:135;:::i;:::-;30650:73;30702:20:::0;30650:47:::1;-1:-1:-1::0;;;;;30650:35:0;::::1;30686:10;30650:47;:35;:47;:::i;:::-;:51:::0;:73:::1;:51;:73;:::i;:::-;30635:88;;30758:15;30742:12;:31;;30734:86;;;;-1:-1:-1::0;;;30734:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30873:10;-1:-1:-1::0;;;;;30838:77:0::1;30863:8;-1:-1:-1::0;;;;;30838:77:0::1;30851:10;-1:-1:-1::0;;;;;30838:77:0::1;;30885:15;30902:12;30838:77;;;;;;;;;;;;;;;;;;;;;;;;30965:21;::::0;31000:22;;30997:167:::1;;31062:18;31083:4;31062:25;31054:5;:33;31042:9;:45;31039:113;;;31111:11;-1:-1:-1::0;;;;;31106:26:0::1;;31133:18;31106:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;31039:113:0::1;24894:1;;;;;29086:2085:::0;;;;;;;;;;;:::o;24157:39::-;;;:::o;23465:228::-;23531:11;;-1:-1:-1;;;;;23531:11:0;23517:10;:25;23509:51;;;;;-1:-1:-1;;;23509:51:0;;;;;;;;;;;;-1:-1:-1;;;23509:51:0;;;;;;;;;;;;;;;23606:11;;;23597:7;;23576:42;;-1:-1:-1;;;;;23606:11:0;;;;23597:7;;;;23576:42;;;23639:11;;;;23629:21;;-1:-1:-1;;;;;;23629:21:0;;;-1:-1:-1;;;;;23639:11:0;;23629:21;;;;23661:24;;;23465:228::o;25753:3325::-;26053:20;26034:8;24841:15;24829:8;:27;;24821:62;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;;;;26113:1:::1;26094:9;:16;:20;26086:59;;;::::0;;-1:-1:-1;;;26086:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26182:1;26164:15;:19;26156:65;;;;-1:-1:-1::0;;;26156:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26253:11;-1:-1:-1::0;;;;;26240:24:0::1;:9;-1:-1:-1::0;;;;;26240:24:0::1;;;26232:72;;;;-1:-1:-1::0;;;26232:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26334:11;-1:-1:-1::0;;;;;26323:22:0::1;:7;-1:-1:-1::0;;;;;26323:22:0::1;;;26315:69;;;;-1:-1:-1::0;;;26315:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26397:17;26417:9;26397:29:::0;-1:-1:-1;;;;;;26443:26:0;::::1;24108:42;26443:26;26439:408;;26486:178;::::0;;-1:-1:-1;;;26486:178:0;;-1:-1:-1;;;;;26486:178:0;;::::1;;::::0;::::1;::::0;26573:10:::1;26486:178:::0;;;;26610:4:::1;26486:178:::0;;;;;;;;;;;;26499:14:::1;26486:40:::0;;::::1;::::0;::::1;::::0;:178;;;;;-1:-1:-1;;26486:178:0;;;;;;;;-1:-1:-1;26486:40:0;:178;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26439:408;;;26718:15;26705:9;:28;26697:76;;;;-1:-1:-1::0;;;26697:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26794:6;-1:-1:-1::0;;;;;26788:21:0::1;;26817:15;26788:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26439:408;26864:9;26859:1247;26883:9;:16;26879:1;:20;26859:1247;;;26921:19;26943:9;26953:1;26943:12;;;;;;;;;;;;;;26921:34;;26974:10;26987:1;26974:14;26992:1;26974:19;26970:1082;;;27014:19;27044:11;-1:-1:-1::0;;;;;27036:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27036:35:0;;-1:-1:-1;27113:11:0::1;-1:-1:-1::0;;;;;27098:26:0;;::::1;::::0;;::::1;;;27090:69;;;::::0;;-1:-1:-1;;;27090:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27090:69:0;;;;;;;;;;;;;::::1;;27200:44;::::0;;-1:-1:-1;;;27200:44:0;;27238:4:::1;27200:44;::::0;::::1;::::0;;;27178:19:::1;::::0;-1:-1:-1;;;;;27200:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27200:44:0;;-1:-1:-1;27263:65:0::1;-1:-1:-1::0;;;;;27263:39:0;::::1;27303:11:::0;27200:44;27263:65:::1;:39;:65;:::i;:::-;27355:11;-1:-1:-1::0;;;;;27347:34:0::1;;27382:11;27395:1;27347:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26970:1082:0::1;::::0;-1:-1:-1;;;26970:1082:0::1;;27442:20;27473:11;-1:-1:-1::0;;;;;27465:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27465:36:0;;-1:-1:-1;27544:11:0::1;-1:-1:-1::0;;;;;27528:27:0;;::::1;::::0;;::::1;;;27520:70;;;::::0;;-1:-1:-1;;;27520:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27520:70:0;;;;;;;;;;;;;::::1;;27631:45;::::0;;-1:-1:-1;;;27631:45:0;;27670:4:::1;27631:45;::::0;::::1;::::0;;;27609:19:::1;::::0;-1:-1:-1;;;;;27631:30:0;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27631:45:0;;-1:-1:-1;27695:66:0::1;-1:-1:-1::0;;;;;27695:40:0;::::1;27736:11:::0;27631:45;27695:66:::1;:40;:66;:::i;:::-;27807:142;::::0;;-1:-1:-1;;;27807:142:0;;-1:-1:-1;;;;;27807:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;27780:24:::1;::::0;27823:18:::1;27807:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27807:142:0;27968:68:::1;::::0;;-1:-1:-1;;;27968:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;27968:68:0;;;;;;;;27807:142;;-1:-1:-1;;;;;;27968:33:0;::::1;::::0;::::1;::::0;:68;;;;;27807:142:::1;::::0;27968:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;26970:1082:0::1;-1:-1:-1::0;28093:1:0::1;28079:15:::0;;::::1;::::0;26901:3:::1;26859:1247;;;-1:-1:-1::0;;;;;;28122:24:0;::::1;24108:42;28122:24;28118:254;;;28178:38;::::0;;-1:-1:-1;;;28178:38:0;;28210:4:::1;28178:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;28184:6:0::1;28178:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28178:38:0;28231:36:::1;::::0;;-1:-1:-1;;;28231:36:0;;::::1;::::0;::::1;::::0;;;;;28178:38;;-1:-1:-1;;;;;;28237:6:0::1;28231:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;28231:36:0;;;;;;;;-1:-1:-1;28231:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28118:254;;;28315:45;-1:-1:-1::0;;;;;28315:30:0;::::1;28354:4;28315:45;:30;:45;:::i;:::-;28300:60;;28118:254;28416:15;28400:12;:31;;28392:86;;;;-1:-1:-1::0;;;28392:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28489:59;-1:-1:-1::0;;;;;28489:33:0;::::1;28523:10;28535:12:::0;28489:59:::1;:33;:59;:::i;:::-;28607:10;-1:-1:-1::0;;;;;28574:75:0::1;28598:7;-1:-1:-1::0;;;;;28574:75:0::1;28587:9;-1:-1:-1::0;;;;;28574:75:0::1;;28619:15;28636:12;28574:75;;;;;;;;;;;;;;;;;;;;;;;;28698:21;::::0;28733;;28730:341:::1;;28771:24;28825:5;28798:24;28812:9;28798::::0;;:24:::1;:13;:24;:::i;:::-;:32;;;;;;28771:59;;28845:20;28887:17;28868:16;:36;:75;;28927:16;28868:75;;;28907:17;28868:75;28845:98;;28981:12;28996:4;28981:19;28973:5;:27;28961:9;:39;28958:101;;;29024:11;-1:-1:-1::0;;;;;29019:26:0::1;;29046:12;29019:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;28958:101:0::1;28730:341;;;24894:1;;25753:3325:::0;;;;;;;;;;:::o;24382:40::-;;;;:::o;24429:46::-;;;;;;;;;;;;;;;:::o;22555:26::-;;;-1:-1:-1;;;;;22555:26:0;;:::o;24334:41::-;;;;:::o;24203:43::-;;;:::o;31181:3570::-;31527:20;31508:8;24841:15;24829:8;:27;;24821:62;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;-1:-1:-1;;;24821:62:0;;;;;;;;;;;;;;;31587:10:::1;:17;31568:8;:15;:36;31560:87;;;;-1:-1:-1::0;;;31560:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31684:1;31666:8;:15;:19;31658:58;;;::::0;;-1:-1:-1;;;31658:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31753:1;31735:15;:19;31727:65;;;;-1:-1:-1::0;;;31727:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31824:11;-1:-1:-1::0;;;;;31811:24:0::1;:9;-1:-1:-1::0;;;;;31811:24:0::1;;;31803:72;;;;-1:-1:-1::0;;;31803:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31905:11;-1:-1:-1::0;;;;;31894:22:0::1;:7;-1:-1:-1::0;;;;;31894:22:0::1;;;31886:69;;;;-1:-1:-1::0;;;31886:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31968:28;31999:46;-1:-1:-1::0;;;;;31999:34:0;::::1;32034:10;31999:46;:34;:46;:::i;:::-;31968:77:::0;-1:-1:-1;;;;;;32062:26:0;::::1;24108:42;32062:26;32058:408;;32105:178;::::0;;-1:-1:-1;;;32105:178:0;;-1:-1:-1;;;;;32105:178:0;;::::1;;::::0;::::1;::::0;32192:10:::1;32105:178:::0;;;;32229:4:::1;32105:178:::0;;;;;;;;;;;;32118:14:::1;32105:40:::0;;::::1;::::0;::::1;::::0;:178;;;;;-1:-1:-1;;32105:178:0;;;;;;;;-1:-1:-1;32105:40:0;:178;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32058:408;;;32337:15;32324:9;:28;32316:76;;;;-1:-1:-1::0;;;32316:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32413:6;-1:-1:-1::0;;;;;32407:21:0::1;;32436:15;32407:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32058:408;32483:9;32478:1582;32502:8;:15;32498:1;:19;32478:1582;;;32539:15;32557:8;32566:1;32557:11;;;;;;;;;;;;;;32539:29;;32587:10;32598:1;32587:13;;;;;;;;;;;;;;32604:1;32587:18;32583:1466;;;32626:19;32656:7;-1:-1:-1::0;;;;;32648:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32648:31:0;;-1:-1:-1;32721:11:0::1;-1:-1:-1::0;;;;;32706:26:0;;::::1;::::0;;::::1;;;32698:69;;;::::0;;-1:-1:-1;;;32698:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32698:69:0;;;;;;;;;;;;;::::1;;32808:44;::::0;;-1:-1:-1;;;32808:44:0;;32846:4:::1;32808:44;::::0;::::1;::::0;;;32786:19:::1;::::0;-1:-1:-1;;;;;32808:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32808:44:0;;-1:-1:-1;32871:61:0::1;-1:-1:-1::0;;;;;32871:39:0;::::1;32911:7:::0;32808:44;32871:61:::1;:39;:61;:::i;:::-;32959:7;-1:-1:-1::0;;;;;32951:30:0::1;;32982:11;32995:1;32951:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32583:1466:0::1;::::0;-1:-1:-1;;;32583:1466:0::1;;33026:10;33037:1;33026:13;;;;;;;;;;;;;;33043:1;33026:18;33023:1026;;;33064:20;33095:7;-1:-1:-1::0;;;;;33087:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33087:32:0;;-1:-1:-1;33162:11:0::1;-1:-1:-1::0;;;;;33146:27:0;;::::1;::::0;;::::1;;;33138:70;;;::::0;;-1:-1:-1;;;33138:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33138:70:0;;;;;;;;;;;;;::::1;;33249:45;::::0;;-1:-1:-1;;;33249:45:0;;33288:4:::1;33249:45;::::0;::::1;::::0;;;33227:19:::1;::::0;-1:-1:-1;;;;;33249:30:0;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33249:45:0;;-1:-1:-1;33313:62:0::1;-1:-1:-1::0;;;;;33313:40:0;::::1;33354:7:::0;33249:45;33313:62:::1;:40;:62;:::i;:::-;33421:138;::::0;;-1:-1:-1;;;33421:138:0;;-1:-1:-1;;;;;33421:138:0;;::::1;;::::0;::::1;::::0;;;;;;;;;33394:24:::1;::::0;33437:18:::1;33421:55;::::0;::::1;::::0;:138;;;;;::::1;::::0;;;;;;;;:55;:138;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33421:138:0;33578:64:::1;::::0;;-1:-1:-1;;;33578:64:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;33578:64:0;;;;;;;;33421:138;;-1:-1:-1;;;;;;33578:29:0;::::1;::::0;::::1;::::0;:64;;;;;33421:138:::1;::::0;33578:64;;;;;;;;;;;:29;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33023:1026:0::1;::::0;-1:-1:-1;;;;33023:1026:0::1;;33709:11;-1:-1:-1::0;;;;;33691:29:0::1;:11;33703:1;33691:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33691:29:0::1;;;33683:72;;;::::0;;-1:-1:-1;;;33683:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33683:72:0;;;;;;;;;;;;;::::1;;33774:19;33803:11;33815:1;33803:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33796:32:0::1;;33837:4;33796:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;33796:47:0::1;-1:-1:-1::0;;;;;33796:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33796:47:0;33869:14;;33796:47;;-1:-1:-1;33862:64:0::1;::::0;33905:7;;33796:47;;33869:11;;33881:1:::1;::::0;33869:14:::1;;;;;;;;;;-1:-1:-1::0;;;;;33862:42:0::1;;;:64;;;;;:::i;:::-;33950:7;-1:-1:-1::0;;;;;33945:38:0::1;;33984:11;33996:1;33998:11;34018:4;34024:8;33945:88;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;33945:88:0::1;-1:-1:-1::0;;;;;33945:88:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;33945:88:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;33945:88:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;33945:88:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;33945:88:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;33023:1026;;-1:-1:-1::0;32519:3:0::1;;32478:1582;;;-1:-1:-1::0;34072:133:0::1;34120:10;34145:49;-1:-1:-1::0;;;;;34145:34:0;::::1;34188:4;34145:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;34072:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;34233:72;34284:20:::0;34233:46:::1;-1:-1:-1::0;;;;;34233:34:0;::::1;34268:10;34233:46;:34;:46;:::i;:72::-;34218:87;;34340:15;34324:12;:31;;34316:86;;;;-1:-1:-1::0;;;34316:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34453:10;-1:-1:-1::0;;;;;34420:75:0::1;34444:7;-1:-1:-1::0;;;;;34420:75:0::1;34433:9;-1:-1:-1::0;;;;;34420:75:0::1;;34465:15;34482:12;34420:75;;;;;;;;;;;;;;;;;;;;;;;;34545:21;::::0;34580:22;;34577:167:::1;;34642:18;34663:4;34642:25;34634:5;:33;34622:9;:45;34619:113;;;34691:11;-1:-1:-1::0;;;;;34686:26:0::1;;34713:18;34686:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;34619:113:0::1;24894:1;;31181:3570:::0;;;;;;;;;;;:::o;25283:212::-;23064:7;;-1:-1:-1;;;;;23064:7:0;23050:10;:21;23042:43;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;;;;25392:21:::1;:40:::0;;;;25443:21:::1;:44:::0;25283:212::o;25503:115::-;23064:7;;-1:-1:-1;;;;;23064:7:0;23050:10;:21;23042:43;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25576:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;25576:34:0::1;25606:4;25576:34;::::0;;25503:115::o;23294:163::-;23064:7;;-1:-1:-1;;;;;23064:7:0;23050:10;:21;23042:43;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;-1:-1:-1;;;23042:43:0;;;;;;;;;;;;;;;23398:7:::1;::::0;;23372:44:::1;::::0;-1:-1:-1;;;;;23372:44:0;;::::1;::::0;23398:7;::::1;::::0;23372:44:::1;::::0;::::1;23427:11;:22:::0;;-1:-1:-1;;;;;;23427:22:0::1;-1:-1:-1::0;;;;;23427:22:0;;;::::1;::::0;;;::::1;::::0;;23294:163::o;8213:228::-;8291:7;8315:12;8321:5;8315;:12::i;:::-;8311:123;;;-1:-1:-1;;;;;;8351:11:0;;;8344:18;;8311:123;8402:5;-1:-1:-1;;;;;8402:15:0;;8418:3;8402:20;;;;;;;;;;;;;-1:-1:-1;;;;;8402:20:0;-1:-1:-1;;;;;8402:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8402:20:0;;-1:-1:-1;8311:123:0;8213:228;;;;:::o;7831:374::-;7976:34;;;-1:-1:-1;;;7976:34:0;;8000:4;7976:34;;;;-1:-1:-1;;;;;7976:34:0;;;;;;;;;7956:17;;7976:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7976:34:0;;-1:-1:-1;8025:18:0;;;8021:177;;;8064:13;;8060:78;;8098:24;-1:-1:-1;;;;;8098:17:0;;8116:2;8120:1;8098:24;:17;:24;:::i;:::-;8152:34;-1:-1:-1;;;;;8152:17:0;;8170:2;-1:-1:-1;;8152:34:0;:17;:34;:::i;:::-;7831:374;;;;:::o;7500:323::-;7635:10;;7631:185;;7666:12;7672:5;7666;:12::i;:::-;7662:143;;;7699:19;;-1:-1:-1;;;;;7699:11:0;;;:19;;;;;7711:6;;7699:19;;;;7711:6;7699:11;:19;;;;;;;;;;;;;;;;;;;;;7662:143;;;7759:30;-1:-1:-1;;;;;7759:18:0;;7778:2;7782:6;7759:30;:18;:30;:::i;:::-;7500:323;;;:::o;3511:137::-;3569:7;3602:1;3597;:6;;3589:28;;;;;-1:-1:-1;;;3589:28:0;;;;;;;;;;;;-1:-1:-1;;;3589:28:0;;;;;;;;;;;;;;;-1:-1:-1;3635:5:0;;;3511:137::o;8449:129::-;8523:7;8550:5;-1:-1:-1;;;;;8550:15:0;;8566:3;8550:20;;;;;;;;;;;;;-1:-1:-1;;;;;8550:20:0;-1:-1:-1;;;;;8550:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;8586:104;-1:-1:-1;;;;;8662:20:0;;7448:42;8662:20;8586:104;;;:::o;5125:670::-;5543:10;;;5542:62;;-1:-1:-1;5559:39:0;;;-1:-1:-1;;;5559:39:0;;5583:4;5559:39;;;;-1:-1:-1;;;;;5559:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5559:39:0;:44;5542:62;5520:166;;;;-1:-1:-1;;;5520:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5724:62;;;-1:-1:-1;;;;;5724:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5724:62:0;-1:-1:-1;;;5724:62:0;;;5697:90;;5717:5;;5697:19;:90::i;4613:211::-;4757:58;;;-1:-1:-1;;;;;4757:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4757:58:0;-1:-1:-1;;;4757:58:0;;;4730:86;;4750:5;;6186:1046;6846:12;6860:23;6895:5;-1:-1:-1;;;;;6887:19:0;6907:4;6887:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6887:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6845:67;;;;6931:7;6923:52;;;;;-1:-1:-1;;;6923:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6992:17;;:21;6988:237;;7147:10;7136:30;;;;;;;;;;;;;;;-1:-1:-1;7136:30:0;7128:85;;;;-1:-1:-1;;;7128:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://b028800e023b4d0e62b3aff02dd14f5553d71437056721d3ef0f3abe1be289e8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.014242 | 77 | $1.1 |
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.