More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,617 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Dodo Swap V1 | 11925785 | 1392 days ago | IN | 0 ETH | 0.00343185 | ||||
Dodo Swap V1 | 11718014 | 1424 days ago | IN | 0 ETH | 0.01098043 | ||||
Dodo Swap V1 | 11718012 | 1424 days ago | IN | 0 ETH | 0.01290216 | ||||
Dodo Swap V1 | 11718012 | 1424 days ago | IN | 0 ETH | 0.00723508 | ||||
External Swap | 11717900 | 1424 days ago | IN | 5 ETH | 0.04125399 | ||||
Dodo Swap V1 | 11717890 | 1424 days ago | IN | 0 ETH | 0.01165028 | ||||
Dodo Swap V1 | 11717858 | 1424 days ago | IN | 0 ETH | 0.01387418 | ||||
Dodo Swap V1 | 11717845 | 1424 days ago | IN | 0 ETH | 0.01096497 | ||||
External Swap | 11717794 | 1424 days ago | IN | 0 ETH | 0.00866778 | ||||
External Swap | 11717787 | 1424 days ago | IN | 10 ETH | 0.03931517 | ||||
Dodo Swap V1 | 11717782 | 1424 days ago | IN | 0 ETH | 0.01302668 | ||||
Dodo Swap V1 | 11717743 | 1424 days ago | IN | 0.01555488 ETH | 0.05060608 | ||||
External Swap | 11717707 | 1424 days ago | IN | 0 ETH | 0.00870678 | ||||
External Swap | 11717686 | 1424 days ago | IN | 0 ETH | 0.00713115 | ||||
External Swap | 11717685 | 1424 days ago | IN | 0 ETH | 0.0077777 | ||||
External Swap | 11717668 | 1424 days ago | IN | 1 ETH | 0.01369258 | ||||
Dodo Swap V1 | 11717633 | 1424 days ago | IN | 0 ETH | 0.01027966 | ||||
Mix Swap V1 | 11717623 | 1424 days ago | IN | 0 ETH | 0.03772224 | ||||
Dodo Swap V1 | 11717620 | 1424 days ago | IN | 0 ETH | 0.01087777 | ||||
Dodo Swap V1 | 11717579 | 1424 days ago | IN | 0 ETH | 0.00834267 | ||||
Dodo Swap V1 | 11717573 | 1424 days ago | IN | 0 ETH | 0.01371225 | ||||
External Swap | 11717570 | 1424 days ago | IN | 0 ETH | 0.01279294 | ||||
External Swap | 11717561 | 1424 days ago | IN | 0 ETH | 0.00804799 | ||||
Dodo Swap V1 | 11717503 | 1424 days ago | IN | 0 ETH | 0.01020817 | ||||
Dodo Swap V1 | 11717478 | 1424 days ago | IN | 0 ETH | 0.00104189 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11717900 | 1424 days ago | 5 ETH | ||||
11717787 | 1424 days ago | 10 ETH | ||||
11717743 | 1424 days ago | 0.01555488 ETH | ||||
11717668 | 1424 days ago | 1 ETH | ||||
11717561 | 1424 days ago | 0.45623985 ETH | ||||
11717561 | 1424 days ago | 0.45623985 ETH | ||||
11717238 | 1424 days ago | 4.93979219 ETH | ||||
11717226 | 1424 days ago | 0.93402131 ETH | ||||
11717226 | 1424 days ago | 0.93402131 ETH | ||||
11717184 | 1424 days ago | 0.34624697 ETH | ||||
11717184 | 1424 days ago | 0.34624697 ETH | ||||
11717152 | 1424 days ago | 3.5 ETH | ||||
11717081 | 1424 days ago | 0.1 ETH | ||||
11717004 | 1424 days ago | 1.3 ETH | ||||
11716880 | 1424 days ago | 0.45 ETH | ||||
11716869 | 1424 days ago | 1.5 ETH | ||||
11716854 | 1424 days ago | 0.16448053 ETH | ||||
11716854 | 1424 days ago | 0.16448053 ETH | ||||
11716827 | 1424 days ago | 1.5 ETH | ||||
11716750 | 1424 days ago | 0.12543895 ETH | ||||
11716750 | 1424 days ago | 0.12543895 ETH | ||||
11716686 | 1424 days ago | 0.54539016 ETH | ||||
11716686 | 1424 days ago | 0.54539016 ETH | ||||
11716570 | 1424 days ago | 0.63496159 ETH | ||||
11716570 | 1424 days ago | 0.63496159 ETH |
Loading...
Loading
Contract Name:
DODOV1Proxy02
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-11 */ // 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 returns (address); function _QUOTE_TOKEN_() external 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); } // 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/DODOV1Proxy02.sol /** * @title DODOV1Proxy02 * @author DODO Breeder * * @notice Entrance of trading in DODO platform */ contract DODOV1Proxy02 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_ = 0; uint256 public _GAS_EXTERNAL_RETURN_ = 0; 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, "DODOV1Proxy02: 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, "DODOV1Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy02: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy02: NOT_SUPPORT_SELL_CHI"); uint256 originGas = gasleft(); if (fromToken != _ETH_ADDRESS_) { IDODOApprove(_DODO_APPROVE_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); } else { require(msg.value == fromTokenAmount, "DODOV1Proxy02: 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_(); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); 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, "DODOV1Proxy02: 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, "DODOV1Proxy02: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy02: NOT_SUPPORT_SELL_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], "DODOV1Proxy02: Not Whitelist Contract"); (bool success, ) = swapTarget.call{value: _fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); require(success, "DODOV1Proxy02: 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, "DODOV1Proxy02: 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, "DODOV1Proxy02: PARAMS_LENGTH_NOT_MATCH"); require(mixPairs.length > 0, "DODOV1Proxy02: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy02: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy02: NOT_SUPPORT_SELL_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, "DODOV1Proxy02: 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_(); 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_(); 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 { 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, "DODOV1Proxy02: 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
[{"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
6101006040526000600255600060035534801561001b57600080fd5b50604051612cca380380612cca8339818101604052608081101561003e57600080fd5b508051602082015160408301516060938401516001600160601b031993851b841660805291841b831660a052831b821660c05290911b1660e05260805160601c60a05160601c60c05160601c60e05160601c612bc6610104600039806106b952806108945280610c695280610ecb5280611714528061193252806122bb525080610765528061103f52806114f9528061158f5280611abe52508061139f52806117e85280611e4a52508061097b5280610d0e5280610f985280611a175250612bc66000f3fe60806040526004361061010d5760003560e01c806369dba8ee11610095578063af1280b011610064578063af1280b01461043f578063b0ef714f14610454578063d6354c3e14610621578063e7cd4a0414610651578063f2fde38b1461068457610114565b806369dba8ee146103b95780636f9170f6146103ce5780638456db15146104155780639f6873221461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d757806346e74298146102c45780634e71e0c8146102d9578063637d7696146102ee57610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b5061012b610d0c565b3480156102e557600080fd5b50610114610d30565b6102b2600480360360e081101561030457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561034357600080fd5b82018360208201111561035557600080fd5b803590602001918460208302840111600160201b8311171561037657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610de3565b3480156103c557600080fd5b506102b26117b6565b3480156103da57600080fd5b50610401600480360360208110156103f157600080fd5b50356001600160a01b03166117bc565b604080519115158252519081900360200190f35b34801561042157600080fd5b5061012b6117d1565b34801561043657600080fd5b506102b26117e0565b34801561044b57600080fd5b5061012b6117e6565b6102b2600480360361010081101561046b57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061180a915050565b34801561062d57600080fd5b506101146004803603604081101561064457600080fd5b508035906020013561235b565b34801561065d57600080fd5b506101146004803603602081101561067457600080fd5b50356001600160a01b03166123b1565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b0316612420565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b898960006109206001600160a01b0383163363ffffffff6124c616565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109f2576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b1580156109c557600080fd5b505af11580156109d9573d6000803e3d6000fd5b506109f2925050506001600160a01b0384168c8b612572565b6001600160a01b038a1660009081526004602052604090205460ff16610a495760405162461bcd60e51b8152600401808060200182810382526025815260200180612a286025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a7a576000610a7c565b345b896040518082805190602001908083835b60208310610aac5780518252601f199092019160209182019101610a8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b0e576040519150601f19603f3d011682016040523d82523d6000602084013e610b13565b606091505b5050905080610b535760405162461bcd60e51b815260040180806020018281038252602d815260200180612a73602d913960400191505060405180910390fd5b610b8733610b706001600160a01b0386163063ffffffff6124c616565b6001600160a01b038616919063ffffffff61263c16565b610bb082610ba46001600160a01b0386163363ffffffff6124c616565b9063ffffffff6126ab16565b955088861015610bf15760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610cfa57806117c002616c3e015a1115610cfa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b50505b50505050505098975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b03163314610d7f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610e34576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b6000855111610e8a576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930323a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610ec95760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161415610f3a5760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610fff576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b505050506110b2565b87341461103d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612b6e6023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b50505050505b60005b86518110156114b35760008782815181106110cc57fe5b602002602001015190508660011660001415611276576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111f57600080fd5b505af1158015611133573d6000803e3d6000fd5b505050506040513d602081101561114957600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d60208110156111c157600080fd5b505190506111df6001600160a01b038316848363ffffffff61257216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d602081101561126c57600080fd5b506114a692505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050506040513d60208110156112dd57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561132b57600080fd5b505afa15801561133f573d6000803e3d6000fd5b505050506040513d602081101561135557600080fd5b505190506113736001600160a01b038316848363ffffffff61257216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b1580156113e557600080fd5b505afa1580156113f9573d6000803e3d6000fd5b505050506040513d602081101561140f57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561147657600080fd5b505af115801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50505050505b50600195861c95016110b5565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115f457604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561153f57600080fd5b505afa158015611553573d6000803e3d6000fd5b505050506040513d602081101561156957600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b50505050611610565b61160d6001600160a01b038a163063ffffffff6126f416565b92505b8683101561164f5760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b6116696001600160a01b038a16338563ffffffff61263c16565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a460025480156117a857600061fde86116e55a859063ffffffff6126ab16565b816116ec57fe5b04905060008282116116fe5781611700565b825b9050806117c002616c3e015a11156117a5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561177857600080fd5b505af115801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000814281101561185b576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b845186511461189b5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a4d6026913960400191505060405180910390fd5b60008651116118f1576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930323a2050414952535f454d505459000000000000604482015290519081900360640190fd5b600087116119305760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031614156119a15760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b60006119bc6001600160a01b038b163363ffffffff6124c616565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611a7e576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b50505050611b31565b883414611abc5760405162461bcd60e51b8152600401808060200182810382526023815260200180612b6e6023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1757600080fd5b505af1158015611b2b573d6000803e3d6000fd5b50505050505b60005b87518110156121b0576000888281518110611b4b57fe5b60200260200101519050878281518110611b6157fe5b602002602001015160001415611d05576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bae57600080fd5b505af1158015611bc2573d6000803e3d6000fd5b505050506040513d6020811015611bd857600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611c2657600080fd5b505afa158015611c3a573d6000803e3d6000fd5b505050506040513d6020811015611c5057600080fd5b50519050611c6e6001600160a01b038316848363ffffffff61257216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050506040513d6020811015611cfb57600080fd5b506121a792505050565b878281518110611d1157fe5b602002602001015160011415611f56576000816001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d5e57600080fd5b505af1158015611d72573d6000803e3d6000fd5b505050506040513d6020811015611d8857600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611dd657600080fd5b505afa158015611dea573d6000803e3d6000fd5b505050506040513d6020811015611e0057600080fd5b50519050611e1e6001600160a01b038316848363ffffffff61257216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b158015611e9057600080fd5b505afa158015611ea4573d6000803e3d6000fd5b505050506040513d6020811015611eba57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b158015611f2157600080fd5b505af1158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b506121a79350505050565b600087600081518110611f6557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b5051885190915061202690839083908b9060009061200657fe5b60200260200101516001600160a01b03166125729092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156120b457818101518382015260200161209c565b505050509050019650505050505050600060405180830381600087803b1580156120dd57600080fd5b505af11580156120f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561211a57600080fd5b8101908080516040519392919084600160201b82111561213957600080fd5b90830190602082018581111561214e57600080fd5b82518660208202830111600160201b8211171561216a57600080fd5b82525081516020918201928201910280838360005b8381101561219757818101518382015260200161217f565b5050505090500160405250505050505b50600101611b34565b506121e5336121ce6001600160a01b038d163063ffffffff6124c616565b6001600160a01b038d16919063ffffffff61263c16565b61220281610ba46001600160a01b038d163363ffffffff6124c616565b9250878310156122435760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a4600354801561234c57806117c002616c3e015a111561234c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561231f57600080fd5b505af1158015612333573d6000803e3d6000fd5b505050506040513d602081101561234957600080fd5b50505b50505098975050505050505050565b6000546001600160a01b031633146123a6576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b031633146123fc576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546001600160a01b0316331461246b576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124d18361274c565b156124e757506001600160a01b0381163161256c565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561253d57600080fd5b505afa158015612551573d6000803e3d6000fd5b505050506040513d602081101561256757600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b1580156125c357600080fd5b505afa1580156125d7573d6000803e3d6000fd5b505050506040513d60208110156125ed57600080fd5b505190508181101561263657801561261a5761261a6001600160a01b03851684600063ffffffff61277116565b6126366001600160a01b0385168460001963ffffffff61277116565b50505050565b80156126a65761264b8361274c565b1561268c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612686573d6000803e3d6000fd5b506126a6565b6126a66001600160a01b038416838363ffffffff61288416565b505050565b6000828211156126ee576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561253d57600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b8015806127f7575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156127c957600080fd5b505afa1580156127dd573d6000803e3d6000fd5b505050506040513d60208110156127f357600080fd5b5051155b6128325760405162461bcd60e51b8152600401808060200182810382526036815260200180612b386036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526126a69084906128d2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526126a69084905b60006060836001600160a01b0316836040518082805190602001908083835b602083106129105780518252601f1990920191602091820191016128f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612972576040519150601f19603f3d011682016040523d82523d6000602084013e612977565b606091505b5091509150816129ce576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612636578080602001905160208110156129ea57600080fd5b50516126365760405162461bcd60e51b815260040180806020018281038252602a815260200180612b0e602a913960400191505060405180910390fdfe444f444f563150726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563150726f787930323a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c6564444f444f563150726f787930323a204e4f545f535550504f52545f53454c4c5f434849444f444f563150726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930323a2052455455524e5f414d4f554e545f5a45524f5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365444f444f563150726f787930323a204554485f414d4f554e545f4e4f545f4d41544348a2646970667358221220d6fcf8d06bbd0461621962e85ccd5924c52690e75ee4fb2d5c374e8d82e8e18e64736f6c63430006090033000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Deployed Bytecode
0x60806040526004361061010d5760003560e01c806369dba8ee11610095578063af1280b011610064578063af1280b01461043f578063b0ef714f14610454578063d6354c3e14610621578063e7cd4a0414610651578063f2fde38b1461068457610114565b806369dba8ee146103b95780636f9170f6146103ce5780638456db15146104155780639f6873221461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d757806346e74298146102c45780634e71e0c8146102d9578063637d7696146102ee57610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b5061012b610d0c565b3480156102e557600080fd5b50610114610d30565b6102b2600480360360e081101561030457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561034357600080fd5b82018360208201111561035557600080fd5b803590602001918460208302840111600160201b8311171561037657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610de3565b3480156103c557600080fd5b506102b26117b6565b3480156103da57600080fd5b50610401600480360360208110156103f157600080fd5b50356001600160a01b03166117bc565b604080519115158252519081900360200190f35b34801561042157600080fd5b5061012b6117d1565b34801561043657600080fd5b506102b26117e0565b34801561044b57600080fd5b5061012b6117e6565b6102b2600480360361010081101561046b57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460208302840111600160201b831117156104dd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561052c57600080fd5b82018360208201111561053e57600080fd5b803590602001918460208302840111600160201b8311171561055f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156105ae57600080fd5b8201836020820111156105c057600080fd5b803590602001918460208302840111600160201b831117156105e157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061180a915050565b34801561062d57600080fd5b506101146004803603604081101561064457600080fd5b508035906020013561235b565b34801561065d57600080fd5b506101146004803603602081101561067457600080fd5b50356001600160a01b03166123b1565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b0316612420565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c81565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b898960006109206001600160a01b0383163363ffffffff6124c616565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146109f2576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b1580156109c557600080fd5b505af11580156109d9573d6000803e3d6000fd5b506109f2925050506001600160a01b0384168c8b612572565b6001600160a01b038a1660009081526004602052604090205460ff16610a495760405162461bcd60e51b8152600401808060200182810382526025815260200180612a286025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a7a576000610a7c565b345b896040518082805190602001908083835b60208310610aac5780518252601f199092019160209182019101610a8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b0e576040519150601f19603f3d011682016040523d82523d6000602084013e610b13565b606091505b5050905080610b535760405162461bcd60e51b815260040180806020018281038252602d815260200180612a73602d913960400191505060405180910390fd5b610b8733610b706001600160a01b0386163063ffffffff6124c616565b6001600160a01b038616919063ffffffff61263c16565b610bb082610ba46001600160a01b0386163363ffffffff6124c616565b9063ffffffff6126ab16565b955088861015610bf15760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610cfa57806117c002616c3e015a1115610cfa577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610ccd57600080fd5b505af1158015610ce1573d6000803e3d6000fd5b505050506040513d6020811015610cf757600080fd5b50505b50505050505098975050505050505050565b7f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514981565b6001546001600160a01b03163314610d7f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610e34576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b6000855111610e8a576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930323a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610ec95760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b03161415610f3a5760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610fff576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b158015610fe257600080fd5b505af1158015610ff6573d6000803e3d6000fd5b505050506110b2565b87341461103d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612b6e6023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561109857600080fd5b505af11580156110ac573d6000803e3d6000fd5b50505050505b60005b86518110156114b35760008782815181106110cc57fe5b602002602001015190508660011660001415611276576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561111f57600080fd5b505af1158015611133573d6000803e3d6000fd5b505050506040513d602081101561114957600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561119757600080fd5b505afa1580156111ab573d6000803e3d6000fd5b505050506040513d60208110156111c157600080fd5b505190506111df6001600160a01b038316848363ffffffff61257216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d602081101561126c57600080fd5b506114a692505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156112b357600080fd5b505af11580156112c7573d6000803e3d6000fd5b505050506040513d60208110156112dd57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561132b57600080fd5b505afa15801561133f573d6000803e3d6000fd5b505050506040513d602081101561135557600080fd5b505190506113736001600160a01b038316848363ffffffff61257216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b1580156113e557600080fd5b505afa1580156113f9573d6000803e3d6000fd5b505050506040513d602081101561140f57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561147657600080fd5b505af115801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50505050505b50600195861c95016110b5565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115f457604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b15801561153f57600080fd5b505afa158015611553573d6000803e3d6000fd5b505050506040513d602081101561156957600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691632e1a7d4d9160248082019260009290919082900301818387803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b50505050611610565b61160d6001600160a01b038a163063ffffffff6126f416565b92505b8683101561164f5760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b6116696001600160a01b038a16338563ffffffff61263c16565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a460025480156117a857600061fde86116e55a859063ffffffff6126ab16565b816116ec57fe5b04905060008282116116fe5781611700565b825b9050806117c002616c3e015a11156117a5577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561177857600080fd5b505af115801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb81565b6000814281101561185b576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0c8e881156141254915160521b604482015290519081900360640190fd5b845186511461189b5760405162461bcd60e51b8152600401808060200182810382526026815260200180612a4d6026913960400191505060405180910390fd5b60008651116118f1576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930323a2050414952535f454d505459000000000000604482015290519081900360640190fd5b600087116119305760405162461bcd60e51b8152600401808060200182810382526021815260200180612aed6021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b031614156119a15760405162461bcd60e51b8152600401808060200182810382526023815260200180612aa06023913960400191505060405180910390fd5b60006119bc6001600160a01b038b163363ffffffff6124c616565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611a7e576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514990921691630a5ea4669160848082019260009290919082900301818387803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b50505050611b31565b883414611abc5760405162461bcd60e51b8152600401808060200182810382526023815260200180612b6e6023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1757600080fd5b505af1158015611b2b573d6000803e3d6000fd5b50505050505b60005b87518110156121b0576000888281518110611b4b57fe5b60200260200101519050878281518110611b6157fe5b602002602001015160001415611d05576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bae57600080fd5b505af1158015611bc2573d6000803e3d6000fd5b505050506040513d6020811015611bd857600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611c2657600080fd5b505afa158015611c3a573d6000803e3d6000fd5b505050506040513d6020811015611c5057600080fd5b50519050611c6e6001600160a01b038316848363ffffffff61257216565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611cd157600080fd5b505af1158015611ce5573d6000803e3d6000fd5b505050506040513d6020811015611cfb57600080fd5b506121a792505050565b878281518110611d1157fe5b602002602001015160011415611f56576000816001600160a01b031663d4b970466040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d5e57600080fd5b505af1158015611d72573d6000803e3d6000fd5b505050506040513d6020811015611d8857600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015611dd657600080fd5b505afa158015611dea573d6000803e3d6000fd5b505050506040513d6020811015611e0057600080fd5b50519050611e1e6001600160a01b038316848363ffffffff61257216565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b158015611e9057600080fd5b505afa158015611ea4573d6000803e3d6000fd5b505050506040513d6020811015611eba57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b158015611f2157600080fd5b505af1158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b506121a79350505050565b600087600081518110611f6557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b5051885190915061202690839083908b9060009061200657fe5b60200260200101516001600160a01b03166125729092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156120b457818101518382015260200161209c565b505050509050019650505050505050600060405180830381600087803b1580156120dd57600080fd5b505af11580156120f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561211a57600080fd5b8101908080516040519392919084600160201b82111561213957600080fd5b90830190602082018581111561214e57600080fd5b82518660208202830111600160201b8211171561216a57600080fd5b82525081516020918201928201910280838360005b8381101561219757818101518382015260200161217f565b5050505090500160405250505050505b50600101611b34565b506121e5336121ce6001600160a01b038d163063ffffffff6124c616565b6001600160a01b038d16919063ffffffff61263c16565b61220281610ba46001600160a01b038d163363ffffffff6124c616565b9250878310156122435760405162461bcd60e51b815260040180806020018281038252602a815260200180612ac3602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a4600354801561234c57806117c002616c3e015a111561234c577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561231f57600080fd5b505af1158015612333573d6000803e3d6000fd5b505050506040513d602081101561234957600080fd5b50505b50505098975050505050505050565b6000546001600160a01b031633146123a6576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b031633146123fc576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546001600160a01b0316331461246b576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006124d18361274c565b156124e757506001600160a01b0381163161256c565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561253d57600080fd5b505afa158015612551573d6000803e3d6000fd5b505050506040513d602081101561256757600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b1580156125c357600080fd5b505afa1580156125d7573d6000803e3d6000fd5b505050506040513d60208110156125ed57600080fd5b505190508181101561263657801561261a5761261a6001600160a01b03851684600063ffffffff61277116565b6126366001600160a01b0385168460001963ffffffff61277116565b50505050565b80156126a65761264b8361274c565b1561268c576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612686573d6000803e3d6000fd5b506126a6565b6126a66001600160a01b038416838363ffffffff61288416565b505050565b6000828211156126ee576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561253d57600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b8015806127f7575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156127c957600080fd5b505afa1580156127dd573d6000803e3d6000fd5b505050506040513d60208110156127f357600080fd5b5051155b6128325760405162461bcd60e51b8152600401808060200182810382526036815260200180612b386036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526126a69084906128d2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526126a69084905b60006060836001600160a01b0316836040518082805190602001908083835b602083106129105780518252601f1990920191602091820191016128f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612972576040519150601f19603f3d011682016040523d82523d6000602084013e612977565b606091505b5091509150816129ce576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115612636578080602001905160208110156129ea57600080fd5b50516126365760405162461bcd60e51b815260040180806020018281038252602a815260200180612b0e602a913960400191505060405180910390fdfe444f444f563150726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563150726f787930323a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c6564444f444f563150726f787930323a204e4f545f535550504f52545f53454c4c5f434849444f444f563150726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930323a2052455455524e5f414d4f554e545f5a45524f5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365444f444f563150726f787930323a204554485f414d4f554e545f4e4f545f4d41544348a2646970667358221220d6fcf8d06bbd0461621962e85ccd5924c52690e75ee4fb2d5c374e8d82e8e18e64736f6c63430006090033
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
23559:10194:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23962:36;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;23962:36:0;;;;;;;;;;;;;;22828:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22828:127:0;-1:-1:-1;;;;;22828:127:0;;:::i;23924:31::-;;;;;;;;;;;;;:::i;22195:22::-;;;;;;;;;;;;;:::i;25296:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25296:119:0;-1:-1:-1;;;;;25296:119:0;;:::i;28497:2013::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28497:2013:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28497:2013:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28497:2013:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28497:2013:0;;-1:-1:-1;;28497:2013:0;;;-1:-1:-1;28497:2013:0;;-1:-1:-1;;28497:2013:0:i;:::-;;;;;;;;;;;;;;;;23828:39;;;;;;;;;;;;;:::i;23134:228::-;;;;;;;;;;;;;:::i;25423:3066::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25423:3066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25423:3066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25423:3066:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25423:3066:0;;-1:-1:-1;;25423:3066:0;;;-1:-1:-1;;;25423:3066:0;;;;:::i;24052:40::-;;;;;;;;;;;;;:::i;24099:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24099:46:0;-1:-1:-1;;;;;24099:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;22224:26;;;;;;;;;;;;;:::i;24005:40::-;;;;;;;;;;;;;:::i;23874:43::-;;;;;;;;;;;;;:::i;30520:3230::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30520:3230:0;;;;;;;;-1:-1:-1;30520:3230:0;;-1:-1:-1;;;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30520:3230:0;;;;;;;;-1:-1:-1;30520:3230:0;;-1:-1:-1;;;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30520:3230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30520:3230:0;;-1:-1:-1;;30520:3230:0;;;-1:-1:-1;30520:3230:0;;-1:-1:-1;;30520:3230:0:i;24953:212::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24953:212:0;;;;;;;:::i;25173:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25173:115:0;-1:-1:-1;;;;;25173:115:0;;:::i;22963:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22963:163:0;-1:-1:-1;;;;;22963:163:0;;:::i;23962:36::-;;;:::o;22828:127::-;22617:13;;-1:-1:-1;;;22617:13:0;;;;22616:14;22608:43;;;;;-1:-1:-1;;;22608:43:0;;;;;;;;;;;;-1:-1:-1;;;22608:43:0;;;;;;;;;;;;;;;22914:4:::1;22898:20:::0;;-1:-1:-1;;;;22898:20:0::1;-1:-1:-1::0;;;22898:20:0::1;::::0;;;22929:18;;-1:-1:-1;;;;;22929:18:0;;::::1;-1:-1:-1::0;;;;;;22929:18:0;;::::1;::::0;;;::::1;::::0;;22828:127::o;23924:31::-;;;:::o;22195:22::-;;;-1:-1:-1;;;;;22195:22:0;;:::o;25296:119::-;22733:7;;-1:-1:-1;;;;;22733:7:0;22719:10;:21;22711:43;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25372:27:0::1;25402:5;25372:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;25372:35:0::1;::::0;;25296:119::o;28497:2013::-;28832:20;28813:8;24511:15;24499:8;:27;;24491:62;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;;;;28891:1:::1;28873:15;:19;28865:65;;;;-1:-1:-1::0;;;28865:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28962:11;-1:-1:-1::0;;;;;28949:24:0::1;:9;-1:-1:-1::0;;;;;28949:24:0::1;;;28941:72;;;;-1:-1:-1::0;;;28941:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29055:9:::0;29094:7;29034:18:::1;29153:47;-1:-1:-1::0;;;;;29153:35:0;::::1;29189:10;29153:47;:35;:47;:::i;:::-;29122:78:::0;-1:-1:-1;;;;;;29217:27:0;::::1;23779:42;29217:27;29213:324;;29261:179;::::0;;-1:-1:-1;;;29261:179:0;;-1:-1:-1;;;;;29261:179:0;;::::1;;::::0;::::1;::::0;29349:10:::1;29261:179:::0;;;;29386:4:::1;29261:179:::0;;;;;;;;;;;;29274:14:::1;29261:40:::0;;::::1;::::0;::::1;::::0;:179;;;;;-1:-1:-1;;29261:179:0;;;;;;;;-1:-1:-1;29261:40:0;:179;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;29455:70:0::1;::::0;-1:-1:-1;;;;;;;;29455:38:0;::::1;29494:13:::0;29509:15;29455:38:::1;:70::i;:::-;-1:-1:-1::0;;;;;29557:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;29549:75;;;;-1:-1:-1::0;;;29549:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29636:12;-1:-1:-1::0;;;;;29654:15:0;;::::1;::::0;29677:27;::::1;23779:42;29677:27;:43;;29719:1;29677:43;;;29707:9;29677:43;29722:14;29654:83;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;29654:83:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29635:102;;;29758:7;29750:65;;;;-1:-1:-1::0;;;29750:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29828:135;29877:10;29902:50;-1:-1:-1::0;;;;;29902:35:0;::::1;29946:4;29902:50;:35;:50;:::i;:::-;-1:-1:-1::0;;;;;29828:34:0;::::1;::::0;:135;::::1;:34;:135;:::i;:::-;29989:73;30041:20:::0;29989:47:::1;-1:-1:-1::0;;;;;29989:35:0;::::1;30025:10;29989:47;:35;:47;:::i;:::-;:51:::0;:73:::1;:51;:73;:::i;:::-;29974:88;;30097:15;30081:12;:31;;30073:86;;;;-1:-1:-1::0;;;30073:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30212:10;-1:-1:-1::0;;;;;30177:77:0::1;30202:8;-1:-1:-1::0;;;;;30177:77:0::1;30190:10;-1:-1:-1::0;;;;;30177:77:0::1;;30224:15;30241:12;30177:77;;;;;;;;;;;;;;;;;;;;;;;;30304:21;::::0;30339:22;;30336:167:::1;;30401:18;30422:4;30401:25;30393:5;:33;30381:9;:45;30378:113;;;30450:11;-1:-1:-1::0;;;;;30445:26:0::1;;30472:18;30445:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;30378:113:0::1;24564:1;;;;;28497:2013:::0;;;;;;;;;;;:::o;23828:39::-;;;:::o;23134:228::-;23200:11;;-1:-1:-1;;;;;23200:11:0;23186:10;:25;23178:51;;;;;-1:-1:-1;;;23178:51:0;;;;;;;;;;;;-1:-1:-1;;;23178:51:0;;;;;;;;;;;;;;;23275:11;;;23266:7;;23245:42;;-1:-1:-1;;;;;23275:11:0;;;;23266:7;;;;23245:42;;;23308:11;;;;23298:21;;-1:-1:-1;;;;;;23298:21:0;;;-1:-1:-1;;;;;23308:11:0;;23298:21;;;;23330:24;;;23134:228::o;25423:3066::-;25723:20;25704:8;24511:15;24499:8;:27;;24491:62;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;;;;25783:1:::1;25764:9;:16;:20;25756:59;;;::::0;;-1:-1:-1;;;25756:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25852:1;25834:15;:19;25826:65;;;;-1:-1:-1::0;;;25826:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25923:11;-1:-1:-1::0;;;;;25910:24:0::1;:9;-1:-1:-1::0;;;;;25910:24:0::1;;;25902:72;;;;-1:-1:-1::0;;;25902:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25985:17;26005:9;25985:29:::0;-1:-1:-1;;;;;;26031:26:0;::::1;23779:42;26031:26;26027:408;;26074:178;::::0;;-1:-1:-1;;;26074:178:0;;-1:-1:-1;;;;;26074:178:0;;::::1;;::::0;::::1;::::0;26161:10:::1;26074:178:::0;;;;26198:4:::1;26074:178:::0;;;;;;;;;;;;26087:14:::1;26074:40:::0;;::::1;::::0;::::1;::::0;:178;;;;;-1:-1:-1;;26074:178:0;;;;;;;;-1:-1:-1;26074:40:0;:178;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26027:408;;;26306:15;26293:9;:28;26285:76;;;;-1:-1:-1::0;;;26285:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26382:6;-1:-1:-1::0;;;;;26376:21:0::1;;26405:15;26376:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26027:408;26452:9;26447:1070;26471:9;:16;26467:1;:20;26447:1070;;;26509:19;26531:9;26541:1;26531:12;;;;;;;;;;;;;;26509:34;;26562:10;26575:1;26562:14;26580:1;26562:19;26558:905;;;26602:19;26632:11;-1:-1:-1::0;;;;;26624:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26624:35:0;26700:44:::1;::::0;;-1:-1:-1;;;26700:44:0;;26738:4:::1;26700:44;::::0;::::1;::::0;;;26624:35;;-1:-1:-1;26678:19:0::1;::::0;-1:-1:-1;;;;;26700:29:0;::::1;::::0;::::1;::::0;:44;;;;;26624:35:::1;::::0;26700:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26700:44:0;;-1:-1:-1;26763:65:0::1;-1:-1:-1::0;;;;;26763:39:0;::::1;26803:11:::0;26700:44;26763:65:::1;:39;:65;:::i;:::-;26855:11;-1:-1:-1::0;;;;;26847:34:0::1;;26882:11;26895:1;26847:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26558:905:0::1;::::0;-1:-1:-1;;;26558:905:0::1;;26942:20;26973:11;-1:-1:-1::0;;;;;26965:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26965:36:0;27042:45:::1;::::0;;-1:-1:-1;;;27042:45:0;;27081:4:::1;27042:45;::::0;::::1;::::0;;;26965:36;;-1:-1:-1;27020:19:0::1;::::0;-1:-1:-1;;;;;27042:30:0;::::1;::::0;::::1;::::0;:45;;;;;26965:36:::1;::::0;27042:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27042:45:0;;-1:-1:-1;27106:66:0::1;-1:-1:-1::0;;;;;27106:40:0;::::1;27147:11:::0;27042:45;27106:66:::1;:40;:66;:::i;:::-;27218:142;::::0;;-1:-1:-1;;;27218:142:0;;-1:-1:-1;;;;;27218:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;27191:24:::1;::::0;27234:18:::1;27218:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27218:142:0;27379:68:::1;::::0;;-1:-1:-1;;;27379:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;27379:68:0;;;;;;;;27218:142;;-1:-1:-1;;;;;;27379:33:0;::::1;::::0;::::1;::::0;:68;;;;;27218:142:::1;::::0;27379:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;26558:905:0::1;-1:-1:-1::0;27504:1:0::1;27490:15:::0;;::::1;::::0;26489:3:::1;26447:1070;;;-1:-1:-1::0;;;;;;27533:24:0;::::1;23779:42;27533:24;27529:254;;;27589:38;::::0;;-1:-1:-1;;;27589:38:0;;27621:4:::1;27589:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;27595:6:0::1;27589:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27589:38:0;27642:36:::1;::::0;;-1:-1:-1;;;27642:36:0;;::::1;::::0;::::1;::::0;;;;;27589:38;;-1:-1:-1;;;;;;27648:6:0::1;27642:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;27642:36:0;;;;;;;;-1:-1:-1;27642:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27529:254;;;27726:45;-1:-1:-1::0;;;;;27726:30:0;::::1;27765:4;27726:45;:30;:45;:::i;:::-;27711:60;;27529:254;27827:15;27811:12;:31;;27803:86;;;;-1:-1:-1::0;;;27803:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27900:59;-1:-1:-1::0;;;;;27900:33:0;::::1;27934:10;27946:12:::0;27900:59:::1;:33;:59;:::i;:::-;28018:10;-1:-1:-1::0;;;;;27985:75:0::1;28009:7;-1:-1:-1::0;;;;;27985:75:0::1;27998:9;-1:-1:-1::0;;;;;27985:75:0::1;;28030:15;28047:12;27985:75;;;;;;;;;;;;;;;;;;;;;;;;28109:21;::::0;28144;;28141:341:::1;;28182:24;28236:5;28209:24;28223:9;28209::::0;;:24:::1;:13;:24;:::i;:::-;:32;;;;;;28182:59;;28256:20;28298:17;28279:16;:36;:75;;28338:16;28279:75;;;28318:17;28279:75;28256:98;;28392:12;28407:4;28392:19;28384:5;:27;28372:9;:39;28369:101;;;28435:11;-1:-1:-1::0;;;;;28430:26:0::1;;28457:12;28430:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;28369:101:0::1;28141:341;;;24564:1;;25423:3066:::0;;;;;;;;;;:::o;24052:40::-;;;;:::o;24099:46::-;;;;;;;;;;;;;;;:::o;22224:26::-;;;-1:-1:-1;;;;;22224:26:0;;:::o;24005:40::-;;;;:::o;23874:43::-;;;:::o;30520:3230::-;30866:20;30847:8;24511:15;24499:8;:27;;24491:62;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;-1:-1:-1;;;24491:62:0;;;;;;;;;;;;;;;30926:10:::1;:17;30907:8;:15;:36;30899:87;;;;-1:-1:-1::0;;;30899:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31023:1;31005:8;:15;:19;30997:58;;;::::0;;-1:-1:-1;;;30997:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31092:1;31074:15;:19;31066:65;;;;-1:-1:-1::0;;;31066:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31163:11;-1:-1:-1::0;;;;;31150:24:0::1;:9;-1:-1:-1::0;;;;;31150:24:0::1;;;31142:72;;;;-1:-1:-1::0;;;31142:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31235:28;31266:46;-1:-1:-1::0;;;;;31266:34:0;::::1;31301:10;31266:46;:34;:46;:::i;:::-;31235:77:::0;-1:-1:-1;;;;;;31329:26:0;::::1;23779:42;31329:26;31325:408;;31372:178;::::0;;-1:-1:-1;;;31372:178:0;;-1:-1:-1;;;;;31372:178:0;;::::1;;::::0;::::1;::::0;31459:10:::1;31372:178:::0;;;;31496:4:::1;31372:178:::0;;;;;;;;;;;;31385:14:::1;31372:40:::0;;::::1;::::0;::::1;::::0;:178;;;;;-1:-1:-1;;31372:178:0;;;;;;;;-1:-1:-1;31372:40:0;:178;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31325:408;;;31604:15;31591:9;:28;31583:76;;;;-1:-1:-1::0;;;31583:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31680:6;-1:-1:-1::0;;;;;31674:21:0::1;;31703:15;31674:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31325:408;31750:9;31745:1314;31769:8;:15;31765:1;:19;31745:1314;;;31806:15;31824:8;31833:1;31824:11;;;;;;;;;;;;;;31806:29;;31854:10;31865:1;31854:13;;;;;;;;;;;;;;31871:1;31854:18;31850:1198;;;31893:19;31923:7;-1:-1:-1::0;;;;;31915:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31915:31:0;31987:44:::1;::::0;;-1:-1:-1;;;31987:44:0;;32025:4:::1;31987:44;::::0;::::1;::::0;;;31915:31;;-1:-1:-1;31965:19:0::1;::::0;-1:-1:-1;;;;;31987:29:0;::::1;::::0;::::1;::::0;:44;;;;;31915:31:::1;::::0;31987:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31987:44:0;;-1:-1:-1;32050:61:0::1;-1:-1:-1::0;;;;;32050:39:0;::::1;32090:7:::0;31987:44;32050:61:::1;:39;:61;:::i;:::-;32138:7;-1:-1:-1::0;;;;;32130:30:0::1;;32161:11;32174:1;32130:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31850:1198:0::1;::::0;-1:-1:-1;;;31850:1198:0::1;;32205:10;32216:1;32205:13;;;;;;;;;;;;;;32222:1;32205:18;32202:846;;;32243:20;32274:7;-1:-1:-1::0;;;;;32266:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32266:32:0;32339:45:::1;::::0;;-1:-1:-1;;;32339:45:0;;32378:4:::1;32339:45;::::0;::::1;::::0;;;32266:32;;-1:-1:-1;32317:19:0::1;::::0;-1:-1:-1;;;;;32339:30:0;::::1;::::0;::::1;::::0;:45;;;;;32266:32:::1;::::0;32339:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32339:45:0;;-1:-1:-1;32403:62:0::1;-1:-1:-1::0;;;;;32403:40:0;::::1;32444:7:::0;32339:45;32403:62:::1;:40;:62;:::i;:::-;32511:138;::::0;;-1:-1:-1;;;32511:138:0;;-1:-1:-1;;;;;32511:138:0;;::::1;;::::0;::::1;::::0;;;;;;;;;32484:24:::1;::::0;32527:18:::1;32511:55;::::0;::::1;::::0;:138;;;;;::::1;::::0;;;;;;;;:55;:138;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32511:138:0;32668:64:::1;::::0;;-1:-1:-1;;;32668:64:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;32668:64:0;;;;;;;;32511:138;;-1:-1:-1;;;;;;32668:29:0;::::1;::::0;::::1;::::0;:64;;;;;32511:138:::1;::::0;32668:64;;;;;;;;;;;:29;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32202:846:0::1;::::0;-1:-1:-1;;;;32202:846:0::1;;32773:19;32802:11;32814:1;32802:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;32795:32:0::1;;32836:4;32795:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;32795:47:0::1;-1:-1:-1::0;;;;;32795:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32795:47:0;32868:14;;32795:47;;-1:-1:-1;32861:64:0::1;::::0;32904:7;;32795:47;;32868:11;;32880:1:::1;::::0;32868:14:::1;;;;;;;;;;-1:-1:-1::0;;;;;32861:42:0::1;;;:64;;;;;:::i;:::-;32949:7;-1:-1:-1::0;;;;;32944:38:0::1;;32983:11;32995:1;32997:11;33017:4;33023:8;32944:88;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;32944:88:0::1;-1:-1:-1::0;;;;;32944:88:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;32944:88:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;32944:88:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;32944:88:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;32944:88:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;32202:846;;-1:-1:-1::0;31786:3:0::1;;31745:1314;;;-1:-1:-1::0;33071:133:0::1;33119:10;33144:49;-1:-1:-1::0;;;;;33144:34:0;::::1;33187:4;33144:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;33071:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;33232:72;33283:20:::0;33232:46:::1;-1:-1:-1::0;;;;;33232:34:0;::::1;33267:10;33232:46;:34;:46;:::i;:72::-;33217:87;;33339:15;33323:12;:31;;33315:86;;;;-1:-1:-1::0;;;33315:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33452:10;-1:-1:-1::0;;;;;33419:75:0::1;33443:7;-1:-1:-1::0;;;;;33419:75:0::1;33432:9;-1:-1:-1::0;;;;;33419:75:0::1;;33464:15;33481:12;33419:75;;;;;;;;;;;;;;;;;;;;;;;;33544:21;::::0;33579:22;;33576:167:::1;;33641:18;33662:4;33641:25;33633:5;:33;33621:9;:45;33618:113;;;33690:11;-1:-1:-1::0;;;;;33685:26:0::1;;33712:18;33685:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;33618:113:0::1;24564:1;;30520:3230:::0;;;;;;;;;;;:::o;24953:212::-;22733:7;;-1:-1:-1;;;;;22733:7:0;22719:10;:21;22711:43;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;;;;25062:21:::1;:40:::0;;;;25113:21:::1;:44:::0;24953:212::o;25173:115::-;22733:7;;-1:-1:-1;;;;;22733:7:0;22719:10;:21;22711:43;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25246:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;25246:34:0::1;25276:4;25246:34;::::0;;25173:115::o;22963:163::-;22733:7;;-1:-1:-1;;;;;22733:7:0;22719:10;:21;22711:43;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;-1:-1:-1;;;22711:43:0;;;;;;;;;;;;;;;23067:7:::1;::::0;;23041:44:::1;::::0;-1:-1:-1;;;;;23041:44:0;;::::1;::::0;23067:7;::::1;::::0;23041:44:::1;::::0;::::1;23096:11;:22:::0;;-1:-1:-1;;;;;;23096:22:0::1;-1:-1:-1::0;;;;;23096:22:0;;;::::1;::::0;;;::::1;::::0;;22963: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://d6fcf8d06bbd0461621962e85ccd5924c52690e75ee4fb2d5c374e8d82e8e18e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.014242 | 138 | $1.97 |
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.