Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 9,023 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Dodo Swap V1 | 20453370 | 168 days ago | IN | 0.001602 ETH | 0.00002474 | ||||
Dodo Swap V1 | 12580551 | 1323 days ago | IN | 0.1 ETH | 0.00024761 | ||||
Dodo Swap V1 | 12307660 | 1365 days ago | IN | 0.009 ETH | 0.00089096 | ||||
External Swap | 12242019 | 1375 days ago | IN | 5.65 ETH | 0.04085879 | ||||
External Swap | 12241942 | 1375 days ago | IN | 3 ETH | 0.01586436 | ||||
External Swap | 12240463 | 1375 days ago | IN | 0.4456326 ETH | 0.03020544 | ||||
Dodo Swap V1 | 12238462 | 1376 days ago | IN | 0 ETH | 0.03363485 | ||||
Dodo Swap V1 | 12238439 | 1376 days ago | IN | 0 ETH | 0.02257923 | ||||
Dodo Swap V1 | 12238299 | 1376 days ago | IN | 0 ETH | 0.02772972 | ||||
Dodo Swap V1 | 12238244 | 1376 days ago | IN | 0 ETH | 0.04315797 | ||||
Dodo Swap V1 | 12237408 | 1376 days ago | IN | 0 ETH | 0.04845015 | ||||
Dodo Swap V1 | 12237071 | 1376 days ago | IN | 0 ETH | 0.02507496 | ||||
Dodo Swap V1 | 12236666 | 1376 days ago | IN | 0 ETH | 0.02908161 | ||||
Dodo Swap V1 | 12236417 | 1376 days ago | IN | 0 ETH | 0.02393629 | ||||
Dodo Swap V1 | 12236189 | 1376 days ago | IN | 0 ETH | 0.02588236 | ||||
Dodo Swap V1 | 12236127 | 1376 days ago | IN | 0 ETH | 0.03741281 | ||||
Dodo Swap V1 | 12236108 | 1376 days ago | IN | 0 ETH | 0.0275414 | ||||
Dodo Swap V1 | 12235947 | 1376 days ago | IN | 0 ETH | 0.03978374 | ||||
Dodo Swap V1 | 12235391 | 1376 days ago | IN | 0 ETH | 0.02336947 | ||||
External Swap | 12233770 | 1376 days ago | IN | 0 ETH | 0.01813264 | ||||
External Swap | 12233688 | 1376 days ago | IN | 0.9 ETH | 0.02613945 | ||||
External Swap | 12233572 | 1376 days ago | IN | 0 ETH | 0.02353894 | ||||
Dodo Swap V1 | 12232550 | 1377 days ago | IN | 0 ETH | 0.05939028 | ||||
Dodo Swap V1 | 12231869 | 1377 days ago | IN | 0 ETH | 0.0211788 | ||||
Dodo Swap V1 | 12231625 | 1377 days ago | IN | 0 ETH | 0.02705123 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
12242019 | 1375 days ago | 5.65 ETH | ||||
12241942 | 1375 days ago | 3 ETH | ||||
12240463 | 1375 days ago | 0.4456326 ETH | ||||
12233770 | 1376 days ago | 0.80082298 ETH | ||||
12233770 | 1376 days ago | 0.80082298 ETH | ||||
12233688 | 1376 days ago | 0.9 ETH | ||||
12233572 | 1376 days ago | 0.90450821 ETH | ||||
12233572 | 1376 days ago | 0.90450821 ETH | ||||
12228187 | 1377 days ago | 9.53377238 ETH | ||||
12228187 | 1377 days ago | 9.53377238 ETH | ||||
12224133 | 1378 days ago | 2.90592884 ETH | ||||
12224133 | 1378 days ago | 2.90592884 ETH | ||||
12221787 | 1378 days ago | 1.84516351 ETH | ||||
12221727 | 1378 days ago | 4.12097655 ETH | ||||
12221727 | 1378 days ago | 4.12097655 ETH | ||||
12220453 | 1378 days ago | 2.77119741 ETH | ||||
12220453 | 1378 days ago | 2.77119741 ETH | ||||
12209035 | 1380 days ago | 0.07622893 ETH | ||||
12209035 | 1380 days ago | 0.07622893 ETH | ||||
12203977 | 1381 days ago | 0.11250531 ETH | ||||
12203977 | 1381 days ago | 0.11250531 ETH | ||||
12202899 | 1381 days ago | 0.47680449 ETH | ||||
12202899 | 1381 days ago | 0.47680449 ETH | ||||
12197828 | 1382 days ago | 1.86509175 ETH | ||||
12197828 | 1382 days ago | 1.86509175 ETH |
Loading...
Loading
Contract Name:
DODOV1Proxy04
Compiler Version
v0.6.9+commit.3e3065ac
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-26 */ // File: contracts/intf/IERC20.sol // This is a file copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.9; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); } // File: contracts/lib/SafeMath.sol /** * @title SafeMath * @author DODO Breeder * * @notice Math operations with safety checks that revert on error */ library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "MUL_ERROR"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "DIVIDING_ERROR"); return a / b; } function divCeil(uint256 a, uint256 b) internal pure returns (uint256) { uint256 quotient = div(a, b); uint256 remainder = a - quotient * b; if (remainder > 0) { return quotient + 1; } else { return quotient; } } function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SUB_ERROR"); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ADD_ERROR"); return c; } function sqrt(uint256 x) internal pure returns (uint256 y) { uint256 z = x / 2 + 1; y = x; while (z < y) { y = z; z = (x / z + z) / 2; } } } // File: contracts/lib/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/SmartRoute/lib/UniversalERC20.sol library UniversalERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); function universalTransfer( IERC20 token, address payable to, uint256 amount ) internal { if (amount > 0) { if (isETH(token)) { to.transfer(amount); } else { token.safeTransfer(to, amount); } } } function universalApproveMax( IERC20 token, address to, uint256 amount ) internal { uint256 allowance = token.allowance(address(this), to); if (allowance < amount) { if (allowance > 0) { token.safeApprove(to, 0); } token.safeApprove(to, uint256(-1)); } } function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) { if (isETH(token)) { return who.balance; } else { return token.balanceOf(who); } } function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) { return token.balanceOf(who); } function isETH(IERC20 token) internal pure returns (bool) { return token == ETH_ADDRESS; } } // File: contracts/SmartRoute/intf/IDODOV1.sol interface IDODOV1 { function init( address owner, address supervisor, address maintainer, address baseToken, address quoteToken, address oracle, uint256 lpFeeRate, uint256 mtFeeRate, uint256 k, uint256 gasPriceLimit ) external; function transferOwnership(address newOwner) external; function claimOwnership() external; function sellBaseToken( uint256 amount, uint256 minReceiveQuote, bytes calldata data ) external returns (uint256); function buyBaseToken( uint256 amount, uint256 maxPayQuote, bytes calldata data ) external returns (uint256); function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote); function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote); function depositBaseTo(address to, uint256 amount) external returns (uint256); function withdrawBase(uint256 amount) external returns (uint256); function withdrawAllBase() external returns (uint256); function depositQuoteTo(address to, uint256 amount) external returns (uint256); function withdrawQuote(uint256 amount) external returns (uint256); function withdrawAllQuote() external returns (uint256); function _BASE_CAPITAL_TOKEN_() external returns (address); function _QUOTE_CAPITAL_TOKEN_() external returns (address); function _BASE_TOKEN_() external view returns (address); function _QUOTE_TOKEN_() external view returns (address); function _R_STATUS_() external view returns (uint8); function _QUOTE_BALANCE_() external view returns (uint256); function _BASE_BALANCE_() external view returns (uint256); function _K_() external view returns (uint256); function _MT_FEE_RATE_() external view returns (uint256); function _LP_FEE_RATE_() external view returns (uint256); function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget); function getOraclePrice() external view returns (uint256); function getMidPrice() external view returns (uint256 midPrice); } // File: contracts/lib/DecimalMath.sol /** * @title DecimalMath * @author DODO Breeder * * @notice Functions for fixed point number with 18 decimals */ library DecimalMath { using SafeMath for uint256; uint256 internal constant ONE = 10**18; uint256 internal constant ONE2 = 10**36; function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d) / (10**18); } function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(d).divCeil(10**18); } function divFloor(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).div(d); } function divCeil(uint256 target, uint256 d) internal pure returns (uint256) { return target.mul(10**18).divCeil(d); } function reciprocalFloor(uint256 target) internal pure returns (uint256) { return uint256(10**36).div(target); } function reciprocalCeil(uint256 target) internal pure returns (uint256) { return uint256(10**36).divCeil(target); } } // File: contracts/SmartRoute/helper/DODOSellHelper.sol // import {DODOMath} from "../lib/DODOMath.sol"; interface IDODOSellHelper { function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256); function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256); } library DODOMath { using SafeMath for uint256; /* Integrate dodo curve fron V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta res = i*delta*(1-k+k(V0^2/V1/V2)) */ function _GeneralIntegrate( uint256 V0, uint256 V1, uint256 V2, uint256 i, uint256 k ) internal pure returns (uint256) { uint256 fairAmount = DecimalMath.mulFloor(i, V1.sub(V2)); // i*delta uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2); uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2) return DecimalMath.mulFloor(fairAmount, DecimalMath.ONE.sub(k).add(penalty)); } /* The same with integration expression above, we have: i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Given Q1 and deltaB, solve Q2 This is a quadratic function and the standard version is aQ2^2 + bQ2 + c = 0, where a=1-k -b=(1-k)Q1-kQ0^2/Q1+i*deltaB c=-kQ0^2 and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k) note: another root is negative, abondan if deltaBSig=true, then Q2>Q1 if deltaBSig=false, then Q2<Q1 */ function _SolveQuadraticFunctionForTrade( uint256 Q0, uint256 Q1, uint256 ideltaB, bool deltaBSig, uint256 k ) internal pure returns (uint256) { // calculate -b value and sig // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB uint256 kQ02Q1 = DecimalMath.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1 uint256 b = DecimalMath.mulFloor(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1 bool minusbSig = true; if (deltaBSig) { b = b.add(ideltaB); // (1-k)Q1+i*deltaB } else { kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1 } if (b >= kQ02Q1) { b = b.sub(kQ02Q1); minusbSig = true; } else { b = kQ02Q1.sub(b); minusbSig = false; } // calculate sqrt uint256 squareRoot = DecimalMath.mulFloor( DecimalMath.ONE.sub(k).mul(4), DecimalMath.mulFloor(k, Q0).mul(Q0) ); // 4(1-k)kQ0^2 squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0) // final res uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k) uint256 numerator; if (minusbSig) { numerator = b.add(squareRoot); } else { numerator = squareRoot.sub(b); } if (deltaBSig) { return DecimalMath.divFloor(numerator, denominator); } else { return DecimalMath.divCeil(numerator, denominator); } } /* Start from the integration function i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2) Assume Q2=Q0, Given Q1 and deltaB, solve Q0 let fairAmount = i*deltaB */ function _SolveQuadraticFunctionForTarget( uint256 V1, uint256 k, uint256 fairAmount ) internal pure returns (uint256 V0) { // V0 = V1+V1*(sqrt-1)/2k uint256 sqrt = DecimalMath.divCeil(DecimalMath.mulFloor(k, fairAmount).mul(4), V1); sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt(); uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2)); // V0 is greater than or equal to V1 according to the solution return DecimalMath.mulFloor(V1, DecimalMath.ONE.add(premium)); } } contract DODOSellHelper { using SafeMath for uint256; enum RStatus {ONE, ABOVE_ONE, BELOW_ONE} uint256 constant ONE = 10**18; struct DODOState { uint256 oraclePrice; uint256 K; uint256 B; uint256 Q; uint256 baseTarget; uint256 quoteTarget; RStatus rStatus; } function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) { return IDODOV1(dodo).querySellBaseToken(amount); } function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) { DODOState memory state; (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget(); state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_()); state.oraclePrice = IDODOV1(dodo).getOraclePrice(); state.Q = IDODOV1(dodo)._QUOTE_BALANCE_(); state.B = IDODOV1(dodo)._BASE_BALANCE_(); state.K = IDODOV1(dodo)._K_(); uint256 boughtAmount; // Determine the status (RStatus) and calculate the amount // based on the state if (state.rStatus == RStatus.ONE) { boughtAmount = _ROneSellQuoteToken(amount, state); } else if (state.rStatus == RStatus.ABOVE_ONE) { boughtAmount = _RAboveSellQuoteToken(amount, state); } else { uint256 backOneBase = state.B.sub(state.baseTarget); uint256 backOneQuote = state.quoteTarget.sub(state.Q); if (amount <= backOneQuote) { boughtAmount = _RBelowSellQuoteToken(amount, state); } else { boughtAmount = backOneBase.add( _ROneSellQuoteToken(amount.sub(backOneQuote), state) ); } } // Calculate fees return DecimalMath.divFloor( boughtAmount, DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add( IDODOV1(dodo)._LP_FEE_RATE_() ) ); } function _ROneSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.baseTarget, DecimalMath.mulFloor(i, amount), false, state.K ); return state.baseTarget.sub(B2); } function _RAboveSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receieBaseToken) { uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade( state.baseTarget, state.B, DecimalMath.mulFloor(i, amount), false, state.K ); return state.B.sub(B2); } function _RBelowSellQuoteToken(uint256 amount, DODOState memory state) internal pure returns (uint256 receiveBaseToken) { uint256 Q1 = state.Q.add(amount); uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice); return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K); } } // File: contracts/intf/IWETH.sol interface IWETH { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function deposit() external payable; function withdraw(uint256 wad) external; } // File: contracts/SmartRoute/intf/IChi.sol interface IChi { function freeUpTo(uint256 value) external returns (uint256); } // File: contracts/SmartRoute/intf/IUni.sol interface IUni { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); function token1() external view returns (address); } // File: contracts/intf/IDODOApprove.sol interface IDODOApprove { function claimTokens(address token,address who,address dest,uint256 amount) external; function getDODOProxy() external view returns (address); } // File: contracts/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/DODOApproveProxy.sol interface IDODOApproveProxy { function isAllowedProxy(address _proxy) external view returns (bool); function claimTokens(address token,address who,address dest,uint256 amount) external; } /** * @title DODOApproveProxy * @author DODO Breeder * * @notice Allow different version dodoproxy to claim from DODOApprove */ contract DODOApproveProxy is InitializableOwnable { // ============ Storage ============ uint256 private constant _TIMELOCK_DURATION_ = 3 days; mapping (address => bool) public _IS_ALLOWED_PROXY_; uint256 public _TIMELOCK_; address public _PENDING_ADD_DODO_PROXY_; address public immutable _DODO_APPROVE_; // ============ Modifiers ============ modifier notLocked() { require( _TIMELOCK_ <= block.timestamp, "SetProxy is timelocked" ); _; } constructor(address dodoApporve) public { _DODO_APPROVE_ = dodoApporve; } function init(address owner, address[] memory proxies) external { initOwner(owner); for(uint i = 0; i < proxies.length; i++) _IS_ALLOWED_PROXY_[proxies[i]] = true; } function unlockAddProxy(address newDodoProxy) public onlyOwner { _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_; _PENDING_ADD_DODO_PROXY_ = newDodoProxy; } function lockAddProxy() public onlyOwner { _PENDING_ADD_DODO_PROXY_ = address(0); _TIMELOCK_ = 0; } function addDODOProxy() external onlyOwner notLocked() { _IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true; lockAddProxy(); } function removeDODOProxy (address oldDodoProxy) public onlyOwner { _IS_ALLOWED_PROXY_[oldDodoProxy] = false; } function claimTokens( address token, address who, address dest, uint256 amount ) external { require(_IS_ALLOWED_PROXY_[msg.sender], "DODOApproveProxy:Access restricted"); IDODOApprove(_DODO_APPROVE_).claimTokens( token, who, dest, amount ); } function isAllowedProxy(address _proxy) external view returns (bool) { return _IS_ALLOWED_PROXY_[_proxy]; } } // 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/SmartRoute/DODOV1Proxy04.sol /** * @title DODOV1Proxy04 * @author DODO Breeder * * @notice Entrance of trading in DODO platform */ contract DODOV1Proxy04 is IDODOV1Proxy02, InitializableOwnable { using SafeMath for uint256; using UniversalERC20 for IERC20; // ============ Storage ============ address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public immutable _DODO_APPROVE_PROXY_; address public immutable _DODO_SELL_HELPER_; address public immutable _WETH_; address public immutable _CHI_TOKEN_; uint256 public _GAS_DODO_MAX_RETURN_ = 10; uint256 public _GAS_EXTERNAL_RETURN_ = 5; mapping (address => bool) public isWhiteListed; // ============ Events ============ event OrderHistory( address indexed fromToken, address indexed toToken, address indexed sender, uint256 fromAmount, uint256 returnAmount ); // ============ Modifiers ============ modifier judgeExpired(uint256 deadLine) { require(deadLine >= block.timestamp, "DODOV1Proxy04: EXPIRED"); _; } constructor( address dodoApproveProxy, address dodoSellHelper, address weth, address chiToken ) public { _DODO_APPROVE_PROXY_ = dodoApproveProxy; _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, "DODOV1Proxy04: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy04: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_BUY_CHI"); uint256 originGas = gasleft(); if (fromToken != _ETH_ADDRESS_) { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); } else { require(msg.value == fromTokenAmount, "DODOV1Proxy04: ETH_AMOUNT_NOT_MATCH"); IWETH(_WETH_).deposit{value: fromTokenAmount}(); } for (uint256 i = 0; i < dodoPairs.length; i++) { address curDodoPair = dodoPairs[i]; if (directions & 1 == 0) { address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_(); require(curDodoBase != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn); IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, ""); } else { address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_(); require(curDodoQuote != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curDodoPair, curAmountIn ); IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } directions = directions >> 1; } if (toToken == _ETH_ADDRESS_) { returnAmount = IWETH(_WETH_).balanceOf(address(this)); IWETH(_WETH_).withdraw(returnAmount); } else { returnAmount = IERC20(toToken).tokenBalanceOf(address(this)); } require(returnAmount >= minReturnAmount, "DODOV1Proxy04: 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, "DODOV1Proxy04: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_BUY_CHI"); address _fromToken = fromToken; address _toToken = toToken; uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender); if (_fromToken != _ETH_ADDRESS_) { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens( _fromToken, msg.sender, address(this), fromTokenAmount ); IERC20(_fromToken).universalApproveMax(approveTarget, fromTokenAmount); } require(isWhiteListed[swapTarget], "DODOV1Proxy04: Not Whitelist Contract"); (bool success, ) = swapTarget.call{value: _fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); require(success, "DODOV1Proxy04: 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, "DODOV1Proxy04: 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, "DODOV1Proxy04: PARAMS_LENGTH_NOT_MATCH"); require(mixPairs.length > 0, "DODOV1Proxy04: PAIRS_EMPTY"); require(minReturnAmount > 0, "DODOV1Proxy04: RETURN_AMOUNT_ZERO"); require(fromToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_SELL_CHI"); require(toToken != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_BUY_CHI"); uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); if (fromToken != _ETH_ADDRESS_) { IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens( fromToken, msg.sender, address(this), fromTokenAmount ); } else { require(msg.value == fromTokenAmount, "DODOV1Proxy04: ETH_AMOUNT_NOT_MATCH"); IWETH(_WETH_).deposit{value: fromTokenAmount}(); } for (uint256 i = 0; i < mixPairs.length; i++) { address curPair = mixPairs[i]; if (directions[i] == 0) { address curDodoBase = IDODOV1(curPair)._BASE_TOKEN_(); require(curDodoBase != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this)); IERC20(curDodoBase).universalApproveMax(curPair, curAmountIn); IDODOV1(curPair).sellBaseToken(curAmountIn, 0, ""); } else if(directions[i] == 1){ address curDodoQuote = IDODOV1(curPair)._QUOTE_TOKEN_(); require(curDodoQuote != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this)); IERC20(curDodoQuote).universalApproveMax(curPair, curAmountIn); uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( curPair, curAmountIn ); IDODOV1(curPair).buyBaseToken(canBuyBaseAmount, curAmountIn, ""); } else { require(portionPath[0] != _CHI_TOKEN_, "DODOV1Proxy04: NOT_SUPPORT_CHI"); uint256 curAmountIn = IERC20(portionPath[0]).balanceOf(address(this)); IERC20(portionPath[0]).universalApproveMax(curPair, curAmountIn); IUni(curPair).swapExactTokensForTokens(curAmountIn,0,portionPath,address(this),deadLine); } } IERC20(toToken).universalTransfer( msg.sender, IERC20(toToken).universalBalanceOf(address(this)) ); returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV1Proxy04: 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":"dodoApproveProxy","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_PROXY_","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
610100604052600a600255600560035534801561001b57600080fd5b506040516130c83803806130c88339818101604052608081101561003e57600080fd5b508051602082015160408301516060938401516001600160601b031993851b841660805291841b831660a052831b821660c05290911b1660e05260805160601c60a05160601c60c05160601c60e05160601c612f9c61012c600039806106b9528061089452806109055280610cda5280610f185280610f89528061120b528061140d52806118ae5280611acc5280611b3d5280611de75280612005528061223f528061262b52508061076552806110fd528061169352806117295280611cc9525080611539528061198252806121315250806109ec52806110565280611c2252806127925250612f9c6000f3fe60806040526004361061010d5760003560e01c80636f9170f611610095578063b0ef714f11610064578063b0ef714f1461043f578063d6354c3e1461060c578063e7cd4a041461063c578063eb99be121461066f578063f2fde38b1461068457610114565b80636f9170f6146103b95780638456db15146104005780639f68732214610415578063af1280b01461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d75780634e71e0c8146102c4578063637d7696146102d957806369dba8ee146103a457610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b50610114610d7d565b6102b2600480360360e08110156102ef57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561032e57600080fd5b82018360208201111561034057600080fd5b803590602001918460208302840111600160201b8311171561036157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610e30565b3480156103b057600080fd5b506102b2611950565b3480156103c557600080fd5b506103ec600480360360208110156103dc57600080fd5b50356001600160a01b0316611956565b604080519115158252519081900360200190f35b34801561040c57600080fd5b5061012b61196b565b34801561042157600080fd5b506102b261197a565b34801561043657600080fd5b5061012b611980565b6102b2600480360361010081101561045657600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460208302840111600160201b831117156104c857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561051757600080fd5b82018360208201111561052957600080fd5b803590602001918460208302840111600160201b8311171561054a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561059957600080fd5b8201836020820111156105ab57600080fd5b803590602001918460208302840111600160201b831117156105cc57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506119a4915050565b34801561061857600080fd5b506101146004803603604081101561062f57600080fd5b50803590602001356126cb565b34801561064857600080fd5b506101146004803603602081101561065f57600080fd5b50356001600160a01b0316612721565b34801561067b57600080fd5b5061012b612790565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b03166127b4565b7f000000000000000000000000000000000000000000000000000000000000000081565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614156109745760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b898960006109916001600160a01b0383163363ffffffff61285a16565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a63576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b50610a63925050506001600160a01b0384168c8b612906565b6001600160a01b038a1660009081526004602052604090205460ff16610aba5760405162461bcd60e51b8152600401808060200182810382526025815260200180612e5b6025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610aeb576000610aed565b345b896040518082805190602001908083835b60208310610b1d5780518252601f199092019160209182019101610afe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180612e0c602d913960400191505060405180910390fd5b610bf833610be16001600160a01b0386163063ffffffff61285a16565b6001600160a01b038616919063ffffffff6129d016565b610c2182610c156001600160a01b0386163363ffffffff61285a16565b9063ffffffff612a3f16565b955088861015610c625760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610d6b57806117c002616c3e015a1115610d6b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b50505b50505050505098975050505050505050565b6001546001600160a01b03163314610dcc576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610e81576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b6000855111610ed7576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930343a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610f165760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161415610f875760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b03161415610ff85760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110bd576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b1580156110a057600080fd5b505af11580156110b4573d6000803e3d6000fd5b50505050611170565b8734146110fb5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e806023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561115657600080fd5b505af115801561116a573d6000803e3d6000fd5b50505050505b60005b865181101561164d57600087828151811061118a57fe5b6020026020010151905086600116600014156113a2576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415611279576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112c357600080fd5b505afa1580156112d7573d6000803e3d6000fd5b505050506040513d60208110156112ed57600080fd5b5051905061130b6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561136e57600080fd5b505af1158015611382573d6000803e3d6000fd5b505050506040513d602081101561139857600080fd5b5061164092505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156113dd57600080fd5b505afa1580156113f1573d6000803e3d6000fd5b505050506040513d602081101561140757600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116908216141561147b576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156114c557600080fd5b505afa1580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b5051905061150d6001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d60208110156115a957600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561161057600080fd5b505af1158015611624573d6000803e3d6000fd5b505050506040513d602081101561163a57600080fd5b50505050505b50600195861c9501611173565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561178e57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156116d957600080fd5b505afa1580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561177157600080fd5b505af1158015611785573d6000803e3d6000fd5b505050506117aa565b6117a76001600160a01b038a163063ffffffff612a8816565b92505b868310156117e95760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b6118036001600160a01b038a16338563ffffffff6129d016565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a4600254801561194257600061fde861187f5a859063ffffffff612a3f16565b8161188657fe5b0490506000828211611898578161189a565b825b9050806117c002616c3e015a111561193f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561191257600080fd5b505af1158015611926573d6000803e3d6000fd5b505050506040513d602081101561193c57600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081428110156119f5576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b8451865114611a355760405162461bcd60e51b8152600401808060200182810382526026815260200180612dbc6026913960400191505060405180910390fd5b6000865111611a8b576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930343a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008711611aca5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a6001600160a01b03161415611b3b5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161415611bac5760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b6000611bc76001600160a01b038b163363ffffffff61285a16565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c89576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b50505050611d3c565b883414611cc75760405162461bcd60e51b8152600401808060200182810382526023815260200180612e806023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b50505050505b60005b8751811015612520576000888281518110611d5657fe5b60200260200101519050878281518110611d6c57fe5b602002602001015160001415611f7e576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d6020811015611de157600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415611e55576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e9f57600080fd5b505afa158015611eb3573d6000803e3d6000fd5b505050506040513d6020811015611ec957600080fd5b50519050611ee76001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611f4a57600080fd5b505af1158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b5061251792505050565b878281518110611f8a57fe5b60200260200101516001141561223d576000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd557600080fd5b505afa158015611fe9573d6000803e3d6000fd5b505050506040513d6020811015611fff57600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169082161415612073576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120bd57600080fd5b505afa1580156120d1573d6000803e3d6000fd5b505050506040513d60208110156120e757600080fd5b505190506121056001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561220857600080fd5b505af115801561221c573d6000803e3d6000fd5b505050506040513d602081101561223257600080fd5b506125179350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168760008151811061227457fe5b60200260200101516001600160a01b031614156122c6576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b6000876000815181106122d557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561233257600080fd5b505afa158015612346573d6000803e3d6000fd5b505050506040513d602081101561235c57600080fd5b5051885190915061239690839083908b9060009061237657fe5b60200260200101516001600160a01b03166129069092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561242457818101518382015260200161240c565b505050509050019650505050505050600060405180830381600087803b15801561244d57600080fd5b505af1158015612461573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561248a57600080fd5b8101908080516040519392919084600160201b8211156124a957600080fd5b9083019060208201858111156124be57600080fd5b82518660208202830111600160201b821117156124da57600080fd5b82525081516020918201928201910280838360005b838110156125075781810151838201526020016124ef565b5050505090500160405250505050505b50600101611d3f565b506125553361253e6001600160a01b038d163063ffffffff61285a16565b6001600160a01b038d16919063ffffffff6129d016565b61257281610c156001600160a01b038d163363ffffffff61285a16565b9250878310156125b35760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a460035480156126bc57806117c002616c3e015a11156126bc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561268f57600080fd5b505af11580156126a3573d6000803e3d6000fd5b505050506040513d60208110156126b957600080fd5b50505b50505098975050505050505050565b6000546001600160a01b03163314612716576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b0316331461276c576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031633146127ff576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600061286583612ae0565b1561287b57506001600160a01b03811631612900565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561295757600080fd5b505afa15801561296b573d6000803e3d6000fd5b505050506040513d602081101561298157600080fd5b50519050818110156129ca5780156129ae576129ae6001600160a01b03851684600063ffffffff612b0516565b6129ca6001600160a01b0385168460001963ffffffff612b0516565b50505050565b8015612a3a576129df83612ae0565b15612a20576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50612a3a565b612a3a6001600160a01b038416838363ffffffff612c1816565b505050565b600082821115612a82576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b801580612b8b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d6020811015612b8757600080fd5b5051155b612bc65760405162461bcd60e51b8152600401808060200182810382526036815260200180612f316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a3a908490612c66565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a3a9084905b60006060836001600160a01b0316836040518082805190602001908083835b60208310612ca45780518252601f199092019160209182019101612c85565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d06576040519150601f19603f3d011682016040523d82523d6000602084013e612d0b565b606091505b509150915081612d62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129ca57808060200190516020811015612d7e57600080fd5b50516129ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180612ee7602a913960400191505060405180910390fdfe444f444f563150726f787930343a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930343a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930343a2045787465726e616c205377617020657865637574696f6e204661696c6564444f444f563150726f787930343a204e4f545f535550504f52545f4255595f434849444f444f563150726f787930343a204e6f742057686974656c69737420436f6e7472616374444f444f563150726f787930343a204554485f414d4f554e545f4e4f545f4d41544348444f444f563150726f787930343a2052455455524e5f414d4f554e545f5a45524f444f444f563150726f787930343a204e4f545f535550504f52545f53454c4c5f4348495361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563150726f787930343a204e4f545f535550504f52545f43484900005361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dcaa746532e4098d23ab0e81273b1f02097afe986ff3439ed67ba59c88b23db364736f6c63430006090033000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Deployed Bytecode
0x60806040526004361061010d5760003560e01c80636f9170f611610095578063b0ef714f11610064578063b0ef714f1461043f578063d6354c3e1461060c578063e7cd4a041461063c578063eb99be121461066f578063f2fde38b1461068457610114565b80636f9170f6146103b95780638456db15146104005780639f68732214610415578063af1280b01461042a57610114565b80632042e5c2116100dc5780632042e5c2146101a457806338f4c188146101d75780634e71e0c8146102c4578063637d7696146102d957806369dba8ee146103a457610114565b8063056fc2ee146101165780630d009297146101475780630d4eec8f1461017a57806316048bc41461018f57610114565b3661011457005b005b34801561012257600080fd5b5061012b6106b7565b604080516001600160a01b039092168252519081900360200190f35b34801561015357600080fd5b506101146004803603602081101561016a57600080fd5b50356001600160a01b03166106db565b34801561018657600080fd5b5061012b610763565b34801561019b57600080fd5b5061012b610787565b3480156101b057600080fd5b50610114600480360360208110156101c757600080fd5b50356001600160a01b0316610796565b6102b260048036036101008110156101ee57600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561023c57600080fd5b82018360208201111561024e57600080fd5b803590602001918460018302840111600160201b8311171561026f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610802915050565b60408051918252519081900360200190f35b3480156102d057600080fd5b50610114610d7d565b6102b2600480360360e08110156102ef57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561032e57600080fd5b82018360208201111561034057600080fd5b803590602001918460208302840111600160201b8311171561036157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060200135610e30565b3480156103b057600080fd5b506102b2611950565b3480156103c557600080fd5b506103ec600480360360208110156103dc57600080fd5b50356001600160a01b0316611956565b604080519115158252519081900360200190f35b34801561040c57600080fd5b5061012b61196b565b34801561042157600080fd5b506102b261197a565b34801561043657600080fd5b5061012b611980565b6102b2600480360361010081101561045657600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561049557600080fd5b8201836020820111156104a757600080fd5b803590602001918460208302840111600160201b831117156104c857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561051757600080fd5b82018360208201111561052957600080fd5b803590602001918460208302840111600160201b8311171561054a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561059957600080fd5b8201836020820111156105ab57600080fd5b803590602001918460208302840111600160201b831117156105cc57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506119a4915050565b34801561061857600080fd5b506101146004803603604081101561062f57600080fd5b50803590602001356126cb565b34801561064857600080fd5b506101146004803603602081101561065f57600080fd5b50356001600160a01b0316612721565b34801561067b57600080fd5b5061012b612790565b34801561069057600080fd5b50610114600480360360208110156106a757600080fd5b50356001600160a01b03166127b4565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c81565b600154600160a01b900460ff161561072d576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b039092166001600160a01b0319909216919091179055565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000546001600160a01b031681565b6000546001600160a01b031633146107e1576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60008142811015610853576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b600085116108925760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b031614156109035760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b031614156109745760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b898960006109916001600160a01b0383163363ffffffff61285a16565b90506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610a63576040805163052f523360e11b81526001600160a01b038581166004830152336024830152306044830152606482018c905291517f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61990921691630a5ea4669160848082019260009290919082900301818387803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b50610a63925050506001600160a01b0384168c8b612906565b6001600160a01b038a1660009081526004602052604090205460ff16610aba5760405162461bcd60e51b8152600401808060200182810382526025815260200180612e5b6025913960400191505060405180910390fd5b60006001600160a01b03808c1690851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610aeb576000610aed565b345b896040518082805190602001908083835b60208310610b1d5780518252601f199092019160209182019101610afe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610bc45760405162461bcd60e51b815260040180806020018281038252602d815260200180612e0c602d913960400191505060405180910390fd5b610bf833610be16001600160a01b0386163063ffffffff61285a16565b6001600160a01b038616919063ffffffff6129d016565b610c2182610c156001600160a01b0386163363ffffffff61285a16565b9063ffffffff612a3f16565b955088861015610c625760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b336001600160a01b0316836001600160a01b0316856001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878d8a604051808381526020018281526020019250505060405180910390a46003548015610d6b57806117c002616c3e015a1115610d6b577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610d3e57600080fd5b505af1158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b50505b50505050505098975050505050505050565b6001546001600160a01b03163314610dcc576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60008142811015610e81576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b6000855111610ed7576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930343a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008611610f165760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b03161415610f875760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316886001600160a01b03161415610ff85760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b60005a90506001600160a01b038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110bd576040805163052f523360e11b81526001600160a01b038c81166004830152336024830152306044830152606482018b905291517f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61990921691630a5ea4669160848082019260009290919082900301818387803b1580156110a057600080fd5b505af11580156110b4573d6000803e3d6000fd5b50505050611170565b8734146110fb5760405162461bcd60e51b8152600401808060200182810382526023815260200180612e806023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b15801561115657600080fd5b505af115801561116a573d6000803e3d6000fd5b50505050505b60005b865181101561164d57600087828151811061118a57fe5b6020026020010151905086600116600014156113a2576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415611279576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156112c357600080fd5b505afa1580156112d7573d6000803e3d6000fd5b505050506040513d60208110156112ed57600080fd5b5051905061130b6001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561136e57600080fd5b505af1158015611382573d6000803e3d6000fd5b505050506040513d602081101561139857600080fd5b5061164092505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156113dd57600080fd5b505afa1580156113f1573d6000803e3d6000fd5b505050506040513d602081101561140757600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03908116908216141561147b576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156114c557600080fd5b505afa1580156114d9573d6000803e3d6000fd5b505050506040513d60208110156114ef57600080fd5b5051905061150d6001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d60208110156115a957600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561161057600080fd5b505af1158015611624573d6000803e3d6000fd5b505050506040513d602081101561163a57600080fd5b50505050505b50600195861c9501611173565b506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561178e57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a08231916024808301926020929190829003018186803b1580156116d957600080fd5b505afa1580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519194506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21691632e1a7d4d9160248082019260009290919082900301818387803b15801561177157600080fd5b505af1158015611785573d6000803e3d6000fd5b505050506117aa565b6117a76001600160a01b038a163063ffffffff612a8816565b92505b868310156117e95760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b6118036001600160a01b038a16338563ffffffff6129d016565b336001600160a01b0316896001600160a01b03168b6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878b87604051808381526020018281526020019250505060405180910390a4600254801561194257600061fde861187f5a859063ffffffff612a3f16565b8161188657fe5b0490506000828211611898578161189a565b825b9050806117c002616c3e015a111561193f577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561191257600080fd5b505af1158015611926573d6000803e3d6000fd5b505050506040513d602081101561193c57600080fd5b50505b50505b505050979650505050505050565b60035481565b60046020526000908152604090205460ff1681565b6001546001600160a01b031681565b60025481565b7f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb81565b600081428110156119f5576040805162461bcd60e51b81526020600482015260166024820152751113d113d58c541c9bde1e4c0d0e881156141254915160521b604482015290519081900360640190fd5b8451865114611a355760405162461bcd60e51b8152600401808060200182810382526026815260200180612dbc6026913960400191505060405180910390fd5b6000865111611a8b576040805162461bcd60e51b815260206004820152601a60248201527f444f444f563150726f787930343a2050414952535f454d505459000000000000604482015290519081900360640190fd5b60008711611aca5760405162461bcd60e51b8152600401808060200182810382526021815260200180612ea36021913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168a6001600160a01b03161415611b3b5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ec46023913960400191505060405180910390fd5b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316896001600160a01b03161415611bac5760405162461bcd60e51b8152600401808060200182810382526022815260200180612e396022913960400191505060405180910390fd5b6000611bc76001600160a01b038b163363ffffffff61285a16565b90506001600160a01b038b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c89576040805163052f523360e11b81526001600160a01b038d81166004830152336024830152306044830152606482018c905291517f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61990921691630a5ea4669160848082019260009290919082900301818387803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b50505050611d3c565b883414611cc75760405162461bcd60e51b8152600401808060200182810382526023815260200180612e806023913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08a6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b50505050505b60005b8751811015612520576000888281518110611d5657fe5b60200260200101519050878281518110611d6c57fe5b602002602001015160001415611f7e576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db757600080fd5b505afa158015611dcb573d6000803e3d6000fd5b505050506040513d6020811015611de157600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415611e55576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015611e9f57600080fd5b505afa158015611eb3573d6000803e3d6000fd5b505050506040513d6020811015611ec957600080fd5b50519050611ee76001600160a01b038316848363ffffffff61290616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b158015611f4a57600080fd5b505af1158015611f5e573d6000803e3d6000fd5b505050506040513d6020811015611f7457600080fd5b5061251792505050565b878281518110611f8a57fe5b60200260200101516001141561223d576000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611fd557600080fd5b505afa158015611fe9573d6000803e3d6000fd5b505050506040513d6020811015611fff57600080fd5b505190507f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b039081169082161415612073576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120bd57600080fd5b505afa1580156120d1573d6000803e3d6000fd5b505050506040513d60208110156120e757600080fd5b505190506121056001600160a01b038316848363ffffffff61290616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb169163ca19ebd9916044808301926020929190829003018186803b15801561217757600080fd5b505afa15801561218b573d6000803e3d6000fd5b505050506040513d60208110156121a157600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b15801561220857600080fd5b505af115801561221c573d6000803e3d6000fd5b505050506040513d602081101561223257600080fd5b506125179350505050565b7f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b03168760008151811061227457fe5b60200260200101516001600160a01b031614156122c6576040805162461bcd60e51b815260206004820152601e6024820152600080516020612f11833981519152604482015290519081900360640190fd5b6000876000815181106122d557fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561233257600080fd5b505afa158015612346573d6000803e3d6000fd5b505050506040513d602081101561235c57600080fd5b5051885190915061239690839083908b9060009061237657fe5b60200260200101516001600160a01b03166129069092919063ffffffff16565b816001600160a01b03166338ed17398260008b308c6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561242457818101518382015260200161240c565b505050509050019650505050505050600060405180830381600087803b15801561244d57600080fd5b505af1158015612461573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561248a57600080fd5b8101908080516040519392919084600160201b8211156124a957600080fd5b9083019060208201858111156124be57600080fd5b82518660208202830111600160201b821117156124da57600080fd5b82525081516020918201928201910280838360005b838110156125075781810151838201526020016124ef565b5050505090500160405250505050505b50600101611d3f565b506125553361253e6001600160a01b038d163063ffffffff61285a16565b6001600160a01b038d16919063ffffffff6129d016565b61257281610c156001600160a01b038d163363ffffffff61285a16565b9250878310156125b35760405162461bcd60e51b815260040180806020018281038252602a815260200180612de2602a913960400191505060405180910390fd5b336001600160a01b03168a6001600160a01b03168c6001600160a01b03167f92ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a52217878c87604051808381526020018281526020019250505060405180910390a460035480156126bc57806117c002616c3e015a11156126bc577f0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c6001600160a01b0316636366b936826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561268f57600080fd5b505af11580156126a3573d6000803e3d6000fd5b505050506040513d60208110156126b957600080fd5b50505b50505098975050505050505050565b6000546001600160a01b03163314612716576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600291909155600355565b6000546001600160a01b0316331461276c576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b7f000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc61981565b6000546001600160a01b031633146127ff576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600061286583612ae0565b1561287b57506001600160a01b03811631612900565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b505afa1580156128e5573d6000803e3d6000fd5b505050506040513d60208110156128fb57600080fd5b505190505b92915050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561295757600080fd5b505afa15801561296b573d6000803e3d6000fd5b505050506040513d602081101561298157600080fd5b50519050818110156129ca5780156129ae576129ae6001600160a01b03851684600063ffffffff612b0516565b6129ca6001600160a01b0385168460001963ffffffff612b0516565b50505050565b8015612a3a576129df83612ae0565b15612a20576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612a1a573d6000803e3d6000fd5b50612a3a565b612a3a6001600160a01b038416838363ffffffff612c1816565b505050565b600082821115612a82576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d157600080fd5b6001600160a01b03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14919050565b801580612b8b575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612b5d57600080fd5b505afa158015612b71573d6000803e3d6000fd5b505050506040513d6020811015612b8757600080fd5b5051155b612bc65760405162461bcd60e51b8152600401808060200182810382526036815260200180612f316036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612a3a908490612c66565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612a3a9084905b60006060836001600160a01b0316836040518082805190602001908083835b60208310612ca45780518252601f199092019160209182019101612c85565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612d06576040519150601f19603f3d011682016040523d82523d6000602084013e612d0b565b606091505b509150915081612d62576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156129ca57808060200190516020811015612d7e57600080fd5b50516129ca5760405162461bcd60e51b815260040180806020018281038252602a815260200180612ee7602a913960400191505060405180910390fdfe444f444f563150726f787930343a20504152414d535f4c454e4754485f4e4f545f4d41544348444f444f563150726f787930343a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563150726f787930343a2045787465726e616c205377617020657865637574696f6e204661696c6564444f444f563150726f787930343a204e4f545f535550504f52545f4255595f434849444f444f563150726f787930343a204e6f742057686974656c69737420436f6e7472616374444f444f563150726f787930343a204554485f414d4f554e545f4e4f545f4d41544348444f444f563150726f787930343a2052455455524e5f414d4f554e545f5a45524f444f444f563150726f787930343a204e4f545f535550504f52545f53454c4c5f4348495361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563150726f787930343a204e4f545f535550504f52545f43484900005361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dcaa746532e4098d23ab0e81273b1f02097afe986ff3439ed67ba59c88b23db364736f6c63430006090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
-----Decoded View---------------
Arg [0] : dodoApproveProxy (address): 0x335aC99bb3E51BDbF22025f092Ebc1Cf2c5cC619
Arg [1] : dodoSellHelper (address): 0x533dA777aeDCE766CEAe696bf90f8541A4bA80Eb
Arg [2] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : chiToken (address): 0x0000000000004946c0e9F43F4Dee607b0eF1fA1c
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000335ac99bb3e51bdbf22025f092ebc1cf2c5cc619
Arg [1] : 000000000000000000000000533da777aedce766ceae696bf90f8541a4ba80eb
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000004946c0e9f43f4dee607b0ef1fa1c
Deployed Bytecode Sourcemap
26272:10921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26681:36;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;26681:36:0;;;;;;;;;;;;;;22113:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22113:127:0;-1:-1:-1;;;;;22113:127:0;;:::i;26643:31::-;;;;;;;;;;;;;:::i;21480:22::-;;;;;;;;;;;;;:::i;28032:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28032:119:0;-1:-1:-1;;;;;28032:119:0;;:::i;31503:2096::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31503:2096:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31503:2096:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31503:2096:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31503:2096:0;;-1:-1:-1;;31503:2096:0;;;-1:-1:-1;31503:2096:0;;-1:-1:-1;;31503:2096:0:i;:::-;;;;;;;;;;;;;;;;22419:228;;;;;;;;;;;;;:::i;28159:3336::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28159:3336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28159:3336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28159:3336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28159:3336:0;;-1:-1:-1;;28159:3336:0;;;-1:-1:-1;;;28159:3336:0;;;;:::i;26772:40::-;;;;;;;;;;;;;:::i;26819:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26819:46:0;-1:-1:-1;;;;;26819:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;21509:26;;;;;;;;;;;;;:::i;26724:41::-;;;;;;;;;;;;;:::i;26593:43::-;;;;;;;;;;;;;:::i;33609:3581::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33609:3581:0;;;;;;;;-1:-1:-1;33609:3581:0;;-1:-1:-1;;;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33609:3581:0;;;;;;;;-1:-1:-1;33609:3581:0;;-1:-1:-1;;;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33609:3581:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33609:3581:0;;-1:-1:-1;;33609:3581:0;;;-1:-1:-1;33609:3581:0;;-1:-1:-1;;33609:3581:0:i;27689:212::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27689:212:0;;;;;;;:::i;27909:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27909:115:0;-1:-1:-1;;;;;27909:115:0;;:::i;26541:45::-;;;;;;;;;;;;;:::i;22248:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22248:163:0;-1:-1:-1;;;;;22248:163:0;;:::i;26681:36::-;;;:::o;22113:127::-;21902:13;;-1:-1:-1;;;21902:13:0;;;;21901:14;21893:43;;;;;-1:-1:-1;;;21893:43:0;;;;;;;;;;;;-1:-1:-1;;;21893:43:0;;;;;;;;;;;;;;;22199:4:::1;22183:20:::0;;-1:-1:-1;;;;22183:20:0::1;-1:-1:-1::0;;;22183:20:0::1;::::0;;;22214:18;;-1:-1:-1;;;;;22214:18:0;;::::1;-1:-1:-1::0;;;;;;22214:18:0;;::::1;::::0;;;::::1;::::0;;22113:127::o;26643:31::-;;;:::o;21480:22::-;;;-1:-1:-1;;;;;21480:22:0;;:::o;28032:119::-;22018:7;;-1:-1:-1;;;;;22018:7:0;22004:10;:21;21996:43;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28108:27:0::1;28138:5;28108:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;28108:35:0::1;::::0;;28032:119::o;31503:2096::-;31838:20;31819:8;27231:15;27219:8;:27;;27211:62;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;;;;31897:1:::1;31879:15;:19;31871:65;;;;-1:-1:-1::0;;;31871:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31968:11;-1:-1:-1::0;;;;;31955:24:0::1;:9;-1:-1:-1::0;;;;;31955:24:0::1;;;31947:72;;;;-1:-1:-1::0;;;31947:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32049:11;-1:-1:-1::0;;;;;32038:22:0::1;:7;-1:-1:-1::0;;;;;32038:22:0::1;;;32030:69;;;;-1:-1:-1::0;;;32030:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32133:9:::0;32172:7;32112:18:::1;32231:47;-1:-1:-1::0;;;;;32231:35:0;::::1;32267:10;32231:47;:35;:47;:::i;:::-;32200:78:::0;-1:-1:-1;;;;;;32295:27:0;::::1;26492:42;32295:27;32291:335;;32339:190;::::0;;-1:-1:-1;;;32339:190:0;;-1:-1:-1;;;;;32339:190:0;;::::1;;::::0;::::1;::::0;32438:10:::1;32339:190:::0;;;;32475:4:::1;32339:190:::0;;;;;;;;;;;;32357:20:::1;32339:51:::0;;::::1;::::0;::::1;::::0;:190;;;;;-1:-1:-1;;32339:190:0;;;;;;;;-1:-1:-1;32339:51:0;:190;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;32544:70:0::1;::::0;-1:-1:-1;;;;;;;;32544:38:0;::::1;32583:13:::0;32598:15;32544:38:::1;:70::i;:::-;-1:-1:-1::0;;;;;32646:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;32638:75;;;;-1:-1:-1::0;;;32638:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32725:12;-1:-1:-1::0;;;;;32743:15:0;;::::1;::::0;32766:27;::::1;26492:42;32766:27;:43;;32808:1;32766:43;;;32796:9;32766:43;32811:14;32743:83;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;32743:83:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32724:102;;;32847:7;32839:65;;;;-1:-1:-1::0;;;32839:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32917:135;32966:10;32991:50;-1:-1:-1::0;;;;;32991:35:0;::::1;33035:4;32991:50;:35;:50;:::i;:::-;-1:-1:-1::0;;;;;32917:34:0;::::1;::::0;:135;::::1;:34;:135;:::i;:::-;33078:73;33130:20:::0;33078:47:::1;-1:-1:-1::0;;;;;33078:35:0;::::1;33114:10;33078:47;:35;:47;:::i;:::-;:51:::0;:73:::1;:51;:73;:::i;:::-;33063:88;;33186:15;33170:12;:31;;33162:86;;;;-1:-1:-1::0;;;33162:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33301:10;-1:-1:-1::0;;;;;33266:77:0::1;33291:8;-1:-1:-1::0;;;;;33266:77:0::1;33279:10;-1:-1:-1::0;;;;;33266:77:0::1;;33313:15;33330:12;33266:77;;;;;;;;;;;;;;;;;;;;;;;;33393:21;::::0;33428:22;;33425:167:::1;;33490:18;33511:4;33490:25;33482:5;:33;33470:9;:45;33467:113;;;33539:11;-1:-1:-1::0;;;;;33534:26:0::1;;33561:18;33534:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;33467:113:0::1;27284:1;;;;;31503:2096:::0;;;;;;;;;;;:::o;22419:228::-;22485:11;;-1:-1:-1;;;;;22485:11:0;22471:10;:25;22463:51;;;;;-1:-1:-1;;;22463:51:0;;;;;;;;;;;;-1:-1:-1;;;22463:51:0;;;;;;;;;;;;;;;22560:11;;;22551:7;;22530:42;;-1:-1:-1;;;;;22560:11:0;;;;22551:7;;;;22530:42;;;22593:11;;;;22583:21;;-1:-1:-1;;;;;;22583:21:0;;;-1:-1:-1;;;;;22593:11:0;;22583:21;;;;22615:24;;;22419:228::o;28159:3336::-;28459:20;28440:8;27231:15;27219:8;:27;;27211:62;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;;;;28519:1:::1;28500:9;:16;:20;28492:59;;;::::0;;-1:-1:-1;;;28492:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28588:1;28570:15;:19;28562:65;;;;-1:-1:-1::0;;;28562:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28659:11;-1:-1:-1::0;;;;;28646:24:0::1;:9;-1:-1:-1::0;;;;;28646:24:0::1;;;28638:72;;;;-1:-1:-1::0;;;28638:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28740:11;-1:-1:-1::0;;;;;28729:22:0::1;:7;-1:-1:-1::0;;;;;28729:22:0::1;;;28721:69;;;;-1:-1:-1::0;;;28721:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28803:17;28823:9;28803:29:::0;-1:-1:-1;;;;;;28849:26:0;::::1;26492:42;28849:26;28845:419;;28892:189;::::0;;-1:-1:-1;;;28892:189:0;;-1:-1:-1;;;;;28892:189:0;;::::1;;::::0;::::1;::::0;28990:10:::1;28892:189:::0;;;;29027:4:::1;28892:189:::0;;;;;;;;;;;;28910:20:::1;28892:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;28892:189:0;;;;;;;;-1:-1:-1;28892:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28845:419;;;29135:15;29122:9;:28;29114:76;;;;-1:-1:-1::0;;;29114:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29211:6;-1:-1:-1::0;;;;;29205:21:0::1;;29234:15;29205:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28845:419;29281:9;29276:1247;29300:9;:16;29296:1;:20;29276:1247;;;29338:19;29360:9;29370:1;29360:12;;;;;;;;;;;;;;29338:34;;29391:10;29404:1;29391:14;29409:1;29391:19;29387:1082;;;29431:19;29461:11;-1:-1:-1::0;;;;;29453:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29453:35:0;;-1:-1:-1;29530:11:0::1;-1:-1:-1::0;;;;;29515:26:0;;::::1;::::0;;::::1;;;29507:69;;;::::0;;-1:-1:-1;;;29507:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29507:69:0;;;;;;;;;;;;;::::1;;29617:44;::::0;;-1:-1:-1;;;29617:44:0;;29655:4:::1;29617:44;::::0;::::1;::::0;;;29595:19:::1;::::0;-1:-1:-1;;;;;29617:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29617:44:0;;-1:-1:-1;29680:65:0::1;-1:-1:-1::0;;;;;29680:39:0;::::1;29720:11:::0;29617:44;29680:65:::1;:39;:65;:::i;:::-;29772:11;-1:-1:-1::0;;;;;29764:34:0::1;;29799:11;29812:1;29764:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29387:1082:0::1;::::0;-1:-1:-1;;;29387:1082:0::1;;29859:20;29890:11;-1:-1:-1::0;;;;;29882:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29882:36:0;;-1:-1:-1;29961:11:0::1;-1:-1:-1::0;;;;;29945:27:0;;::::1;::::0;;::::1;;;29937:70;;;::::0;;-1:-1:-1;;;29937:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29937:70:0;;;;;;;;;;;;;::::1;;30048:45;::::0;;-1:-1:-1;;;30048:45:0;;30087:4:::1;30048:45;::::0;::::1;::::0;;;30026:19:::1;::::0;-1:-1:-1;;;;;30048:30:0;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30048:45:0;;-1:-1:-1;30112:66:0::1;-1:-1:-1::0;;;;;30112:40:0;::::1;30153:11:::0;30048:45;30112:66:::1;:40;:66;:::i;:::-;30224:142;::::0;;-1:-1:-1;;;30224:142:0;;-1:-1:-1;;;;;30224:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;30197:24:::1;::::0;30240:18:::1;30224:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30224:142:0;30385:68:::1;::::0;;-1:-1:-1;;;30385:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;30385:68:0;;;;;;;;30224:142;;-1:-1:-1;;;;;;30385:33:0;::::1;::::0;::::1;::::0;:68;;;;;30224:142:::1;::::0;30385:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;29387:1082:0::1;-1:-1:-1::0;30510:1:0::1;30496:15:::0;;::::1;::::0;29318:3:::1;29276:1247;;;-1:-1:-1::0;;;;;;30539:24:0;::::1;26492:42;30539:24;30535:254;;;30595:38;::::0;;-1:-1:-1;;;30595:38:0;;30627:4:::1;30595:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;30601:6:0::1;30595:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30595:38:0;30648:36:::1;::::0;;-1:-1:-1;;;30648:36:0;;::::1;::::0;::::1;::::0;;;;;30595:38;;-1:-1:-1;;;;;;30654:6:0::1;30648:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;30648:36:0;;;;;;;;-1:-1:-1;30648:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30535:254;;;30732:45;-1:-1:-1::0;;;;;30732:30:0;::::1;30771:4;30732:45;:30;:45;:::i;:::-;30717:60;;30535:254;30833:15;30817:12;:31;;30809:86;;;;-1:-1:-1::0;;;30809:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30906:59;-1:-1:-1::0;;;;;30906:33:0;::::1;30940:10;30952:12:::0;30906:59:::1;:33;:59;:::i;:::-;31024:10;-1:-1:-1::0;;;;;30991:75:0::1;31015:7;-1:-1:-1::0;;;;;30991:75:0::1;31004:9;-1:-1:-1::0;;;;;30991:75:0::1;;31036:15;31053:12;30991:75;;;;;;;;;;;;;;;;;;;;;;;;31115:21;::::0;31150;;31147:341:::1;;31188:24;31242:5;31215:24;31229:9;31215::::0;;:24:::1;:13;:24;:::i;:::-;:32;;;;;;31188:59;;31262:20;31304:17;31285:16;:36;:75;;31344:16;31285:75;;;31324:17;31285:75;31262:98;;31398:12;31413:4;31398:19;31390:5;:27;31378:9;:39;31375:101;;;31441:11;-1:-1:-1::0;;;;;31436:26:0::1;;31463:12;31436:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;31375:101:0::1;31147:341;;;27284:1;;28159:3336:::0;;;;;;;;;;:::o;26772:40::-;;;;:::o;26819:46::-;;;;;;;;;;;;;;;:::o;21509:26::-;;;-1:-1:-1;;;;;21509:26:0;;:::o;26724:41::-;;;;:::o;26593:43::-;;;:::o;33609:3581::-;33955:20;33936:8;27231:15;27219:8;:27;;27211:62;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;-1:-1:-1;;;27211:62:0;;;;;;;;;;;;;;;34015:10:::1;:17;33996:8;:15;:36;33988:87;;;;-1:-1:-1::0;;;33988:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34112:1;34094:8;:15;:19;34086:58;;;::::0;;-1:-1:-1;;;34086:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;34181:1;34163:15;:19;34155:65;;;;-1:-1:-1::0;;;34155:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34252:11;-1:-1:-1::0;;;;;34239:24:0::1;:9;-1:-1:-1::0;;;;;34239:24:0::1;;;34231:72;;;;-1:-1:-1::0;;;34231:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34333:11;-1:-1:-1::0;;;;;34322:22:0::1;:7;-1:-1:-1::0;;;;;34322:22:0::1;;;34314:69;;;;-1:-1:-1::0;;;34314:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34396:28;34427:46;-1:-1:-1::0;;;;;34427:34:0;::::1;34462:10;34427:46;:34;:46;:::i;:::-;34396:77:::0;-1:-1:-1;;;;;;34490:26:0;::::1;26492:42;34490:26;34486:419;;34533:189;::::0;;-1:-1:-1;;;34533:189:0;;-1:-1:-1;;;;;34533:189:0;;::::1;;::::0;::::1;::::0;34631:10:::1;34533:189:::0;;;;34668:4:::1;34533:189:::0;;;;;;;;;;;;34551:20:::1;34533:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;34533:189:0;;;;;;;;-1:-1:-1;34533:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34486:419;;;34776:15;34763:9;:28;34755:76;;;;-1:-1:-1::0;;;34755:76:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34852:6;-1:-1:-1::0;;;;;34846:21:0::1;;34875:15;34846:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34486:419;34922:9;34917:1582;34941:8;:15;34937:1;:19;34917:1582;;;34978:15;34996:8;35005:1;34996:11;;;;;;;;;;;;;;34978:29;;35026:10;35037:1;35026:13;;;;;;;;;;;;;;35043:1;35026:18;35022:1466;;;35065:19;35095:7;-1:-1:-1::0;;;;;35087:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35087:31:0;;-1:-1:-1;35160:11:0::1;-1:-1:-1::0;;;;;35145:26:0;;::::1;::::0;;::::1;;;35137:69;;;::::0;;-1:-1:-1;;;35137:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35137:69:0;;;;;;;;;;;;;::::1;;35247:44;::::0;;-1:-1:-1;;;35247:44:0;;35285:4:::1;35247:44;::::0;::::1;::::0;;;35225:19:::1;::::0;-1:-1:-1;;;;;35247:29:0;::::1;::::0;::::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35247:44:0;;-1:-1:-1;35310:61:0::1;-1:-1:-1::0;;;;;35310:39:0;::::1;35350:7:::0;35247:44;35310:61:::1;:39;:61;:::i;:::-;35398:7;-1:-1:-1::0;;;;;35390:30:0::1;;35421:11;35434:1;35390:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35022:1466:0::1;::::0;-1:-1:-1;;;35022:1466:0::1;;35465:10;35476:1;35465:13;;;;;;;;;;;;;;35482:1;35465:18;35462:1026;;;35503:20;35534:7;-1:-1:-1::0;;;;;35526:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35526:32:0;;-1:-1:-1;35601:11:0::1;-1:-1:-1::0;;;;;35585:27:0;;::::1;::::0;;::::1;;;35577:70;;;::::0;;-1:-1:-1;;;35577:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35577:70:0;;;;;;;;;;;;;::::1;;35688:45;::::0;;-1:-1:-1;;;35688:45:0;;35727:4:::1;35688:45;::::0;::::1;::::0;;;35666:19:::1;::::0;-1:-1:-1;;;;;35688:30:0;::::1;::::0;::::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35688:45:0;;-1:-1:-1;35752:62:0::1;-1:-1:-1::0;;;;;35752:40:0;::::1;35793:7:::0;35688:45;35752:62:::1;:40;:62;:::i;:::-;35860:138;::::0;;-1:-1:-1;;;35860:138:0;;-1:-1:-1;;;;;35860:138:0;;::::1;;::::0;::::1;::::0;;;;;;;;;35833:24:::1;::::0;35876:18:::1;35860:55;::::0;::::1;::::0;:138;;;;;::::1;::::0;;;;;;;;:55;:138;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35860:138:0;36017:64:::1;::::0;;-1:-1:-1;;;36017:64:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;36017:64:0;;;;;;;;35860:138;;-1:-1:-1;;;;;;36017:29:0;::::1;::::0;::::1;::::0;:64;;;;;35860:138:::1;::::0;36017:64;;;;;;;;;;;:29;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35462:1026:0::1;::::0;-1:-1:-1;;;;35462:1026:0::1;;36148:11;-1:-1:-1::0;;;;;36130:29:0::1;:11;36142:1;36130:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36130:29:0::1;;;36122:72;;;::::0;;-1:-1:-1;;;36122:72:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36122:72:0;;;;;;;;;;;;;::::1;;36213:19;36242:11;36254:1;36242:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36235:32:0::1;;36276:4;36235:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;36235:47:0::1;-1:-1:-1::0;;;;;36235:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36235:47:0;36308:14;;36235:47;;-1:-1:-1;36301:64:0::1;::::0;36344:7;;36235:47;;36308:11;;36320:1:::1;::::0;36308:14:::1;;;;;;;;;;-1:-1:-1::0;;;;;36301:42:0::1;;;:64;;;;;:::i;:::-;36389:7;-1:-1:-1::0;;;;;36384:38:0::1;;36423:11;36435:1;36437:11;36457:4;36463:8;36384:88;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;36384:88:0::1;-1:-1:-1::0;;;;;36384:88:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;36384:88:0::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;36384:88:0::1;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;-1:-1:-1::0;;;36384:88:0::1;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;36384:88:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;;35462:1026;;-1:-1:-1::0;34958:3:0::1;;34917:1582;;;-1:-1:-1::0;36511:133:0::1;36559:10;36584:49;-1:-1:-1::0;;;;;36584:34:0;::::1;36627:4;36584:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;36511:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;36672:72;36723:20:::0;36672:46:::1;-1:-1:-1::0;;;;;36672:34:0;::::1;36707:10;36672:46;:34;:46;:::i;:72::-;36657:87;;36779:15;36763:12;:31;;36755:86;;;;-1:-1:-1::0;;;36755:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36892:10;-1:-1:-1::0;;;;;36859:75:0::1;36883:7;-1:-1:-1::0;;;;;36859:75:0::1;36872:9;-1:-1:-1::0;;;;;36859:75:0::1;;36904:15;36921:12;36859:75;;;;;;;;;;;;;;;;;;;;;;;;36984:21;::::0;37019:22;;37016:167:::1;;37081:18;37102:4;37081:25;37073:5;:33;37061:9;:45;37058:113;;;37130:11;-1:-1:-1::0;;;;;37125:26:0::1;;37152:18;37125:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;37058:113:0::1;27284:1;;33609:3581:::0;;;;;;;;;;;:::o;27689:212::-;22018:7;;-1:-1:-1;;;;;22018:7:0;22004:10;:21;21996:43;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;;;;27798:21:::1;:40:::0;;;;27849:21:::1;:44:::0;27689:212::o;27909:115::-;22018:7;;-1:-1:-1;;;;;22018:7:0;22004:10;:21;21996:43;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27982:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;27982:34:0::1;28012:4;27982:34;::::0;;27909:115::o;26541:45::-;;;:::o;22248:163::-;22018:7;;-1:-1:-1;;;;;22018:7:0;22004:10;:21;21996:43;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;-1:-1:-1;;;21996:43:0;;;;;;;;;;;;;;;22352:7:::1;::::0;;22326:44:::1;::::0;-1:-1:-1;;;;;22326:44:0;;::::1;::::0;22352:7;::::1;::::0;22326:44:::1;::::0;::::1;22381:11;:22:::0;;-1:-1:-1;;;;;;22381:22:0::1;-1:-1:-1::0;;;;;22381:22:0;;;::::1;::::0;;;::::1;::::0;;22248:163::o;8234:228::-;8312:7;8336:12;8342:5;8336;:12::i;:::-;8332:123;;;-1:-1:-1;;;;;;8372:11:0;;;8365:18;;8332:123;8423:5;-1:-1:-1;;;;;8423:15:0;;8439:3;8423:20;;;;;;;;;;;;;-1:-1:-1;;;;;8423:20:0;-1:-1:-1;;;;;8423:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8423:20:0;;-1:-1:-1;8332:123:0;8234:228;;;;:::o;7852:374::-;7997:34;;;-1:-1:-1;;;7997:34:0;;8021:4;7997:34;;;;-1:-1:-1;;;;;7997:34:0;;;;;;;;;7977:17;;7997:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7997:34:0;;-1:-1:-1;8046:18:0;;;8042:177;;;8085:13;;8081:78;;8119:24;-1:-1:-1;;;;;8119:17:0;;8137:2;8141:1;8119:24;:17;:24;:::i;:::-;8173:34;-1:-1:-1;;;;;8173:17:0;;8191:2;-1:-1:-1;;8173:34:0;:17;:34;:::i;:::-;7852:374;;;;:::o;7521:323::-;7656:10;;7652:185;;7687:12;7693:5;7687;:12::i;:::-;7683:143;;;7720:19;;-1:-1:-1;;;;;7720:11:0;;;:19;;;;;7732:6;;7720:19;;;;7732:6;7720:11;:19;;;;;;;;;;;;;;;;;;;;;7683:143;;;7780:30;-1:-1:-1;;;;;7780:18:0;;7799:2;7803:6;7780:30;:18;:30;:::i;:::-;7521:323;;;:::o;3542:137::-;3600:7;3633:1;3628;:6;;3620:28;;;;;-1:-1:-1;;;3620:28:0;;;;;;;;;;;;-1:-1:-1;;;3620:28:0;;;;;;;;;;;;;;;-1:-1:-1;3666:5:0;;;3542:137::o;8470:129::-;8544:7;8571:5;-1:-1:-1;;;;;8571:15:0;;8587:3;8571:20;;;;;;;;;;;;;-1:-1:-1;;;;;8571:20:0;-1:-1:-1;;;;;8571:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;8607:104;-1:-1:-1;;;;;8683:20:0;;7469:42;8683:20;8607:104;;;:::o;5152:670::-;5570:10;;;5569:62;;-1:-1:-1;5586:39:0;;;-1:-1:-1;;;5586:39:0;;5610:4;5586:39;;;;-1:-1:-1;;;;;5586:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5586:39:0;:44;5569:62;5547:166;;;;-1:-1:-1;;;5547:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5751:62;;;-1:-1:-1;;;;;5751:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5751:62:0;-1:-1:-1;;;5751:62:0;;;5724:90;;5744:5;;5724:19;:90::i;4640:211::-;4784:58;;;-1:-1:-1;;;;;4784:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4784:58:0;-1:-1:-1;;;4784:58:0;;;4757:86;;4777:5;;6213:1046;6873:12;6887:23;6922:5;-1:-1:-1;;;;;6914:19:0;6934:4;6914:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6914:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6872:67;;;;6958:7;6950:52;;;;;-1:-1:-1;;;6950:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7019:17;;:21;7015:237;;7174:10;7163:30;;;;;;;;;;;;;;;-1:-1:-1;7163:30:0;7155:85;;;;-1:-1:-1;;;7155:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://dcaa746532e4098d23ab0e81273b1f02097afe986ff3439ed67ba59c88b23db3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.