Overview
AVAX Balance
AVAX Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 93,967 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap No Split To... | 52941312 | 162 days ago | IN | 0 AVAX | 0.00521552 | ||||
Swap No Split To... | 52583524 | 171 days ago | IN | 0 AVAX | 0.01201121 | ||||
Swap No Split | 51856463 | 188 days ago | IN | 0 AVAX | 0.01405207 | ||||
Swap No Split Fr... | 51816624 | 189 days ago | IN | 0.2 AVAX | 0.01429569 | ||||
Swap No Split Fr... | 51816603 | 189 days ago | IN | 5 AVAX | 0.00464476 | ||||
Swap No Split Fr... | 51816588 | 189 days ago | IN | 0.7 AVAX | 0.01856764 | ||||
Swap No Split To... | 51610806 | 194 days ago | IN | 0 AVAX | 0.01540428 | ||||
Swap No Split | 51210911 | 204 days ago | IN | 0 AVAX | 0.02126915 | ||||
Swap No Split To... | 49623933 | 242 days ago | IN | 0 AVAX | 0.00624501 | ||||
Swap No Split | 49613685 | 243 days ago | IN | 0 AVAX | 0.00511245 | ||||
Swap No Split | 49601814 | 243 days ago | IN | 0 AVAX | 0.00664685 | ||||
Swap No Split Fr... | 48840899 | 261 days ago | IN | 0.4 AVAX | 0.01318218 | ||||
Swap No Split To... | 48612470 | 267 days ago | IN | 0 AVAX | 0.00546249 | ||||
Swap No Split To... | 48219058 | 276 days ago | IN | 0 AVAX | 0.00503961 | ||||
Swap No Split Fr... | 48183942 | 277 days ago | IN | 0.25 AVAX | 0.0043842 | ||||
Swap No Split Fr... | 48183811 | 277 days ago | IN | 0.25 AVAX | 0.00464539 | ||||
Swap No Split Fr... | 48183791 | 277 days ago | IN | 0.25 AVAX | 0.00488911 | ||||
Swap No Split Fr... | 48183754 | 277 days ago | IN | 0.25 AVAX | 0.00438245 | ||||
Swap No Split Fr... | 48183730 | 277 days ago | IN | 0.25 AVAX | 0.00438215 | ||||
Swap No Split Fr... | 48183633 | 277 days ago | IN | 0.25 AVAX | 0.00460157 | ||||
Swap No Split To... | 48183541 | 277 days ago | IN | 0 AVAX | 0.0052413 | ||||
Swap No Split Fr... | 48183291 | 277 days ago | IN | 2 AVAX | 0.00464539 | ||||
Swap No Split Fr... | 48183277 | 277 days ago | IN | 1 AVAX | 0.00447009 | ||||
Swap No Split To... | 48183252 | 277 days ago | IN | 0 AVAX | 0.00522042 | ||||
Swap No Split To... | 48183227 | 277 days ago | IN | 0 AVAX | 0.00506165 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
52941312 | 162 days ago | 13.69329724 AVAX | ||||
52941312 | 162 days ago | 13.69329724 AVAX | ||||
52583524 | 171 days ago | 0.19169493 AVAX | ||||
52583524 | 171 days ago | 0.19169493 AVAX | ||||
51816624 | 189 days ago | 0.2 AVAX | ||||
51816603 | 189 days ago | 5 AVAX | ||||
51816588 | 189 days ago | 0.7 AVAX | ||||
51610806 | 194 days ago | 18.12062437 AVAX | ||||
51610806 | 194 days ago | 18.12062437 AVAX | ||||
49623933 | 242 days ago | 12.82123249 AVAX | ||||
49623933 | 242 days ago | 12.82123249 AVAX | ||||
48840899 | 261 days ago | 0.4 AVAX | ||||
48612470 | 267 days ago | 6.79452348 AVAX | ||||
48612470 | 267 days ago | 6.79452348 AVAX | ||||
48219058 | 276 days ago | 5.24576997 AVAX | ||||
48219058 | 276 days ago | 5.24576997 AVAX | ||||
48183942 | 277 days ago | 0.25 AVAX | ||||
48183811 | 277 days ago | 0.25 AVAX | ||||
48183791 | 277 days ago | 0.25 AVAX | ||||
48183754 | 277 days ago | 0.25 AVAX | ||||
48183730 | 277 days ago | 0.25 AVAX | ||||
48183633 | 277 days ago | 0.25 AVAX | ||||
48183541 | 277 days ago | 7.30676146 AVAX | ||||
48183541 | 277 days ago | 7.30676146 AVAX | ||||
48183291 | 277 days ago | 2 AVAX |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Router
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.17; import "./lib/Maintainable.sol"; import "./lib/BytesManipulation.sol"; import "./interface/IAdapter.sol"; import "./interface/IERC20.sol"; import "./interface/IWETH.sol"; import "./lib/SafeERC20.sol"; error NothingToRecover(); error InvalidMaxSteps(); error InvalidPath(); error InvalidFee(); error InvalidOutput(); contract Router is Maintainable { using SafeERC20 for IERC20; address public immutable WNATIVE; address public constant NATIVE = address(0); string public constant NAME = "Router"; uint256 public constant FEE_DENOMINATOR = 1e8; uint256 public MIN_FEE = 0; address public FEE_CLAIMER; address[] public TRUSTED_TOKENS; address[] public ADAPTERS; struct Query { address adapter; address tokenIn; address tokenOut; uint256 amountOut; } struct Offer { bytes amounts; bytes adapters; bytes path; uint256 gasEstimate; } struct FormattedOffer { uint256[] amounts; address[] adapters; address[] path; uint256 gasEstimate; } struct Trade { uint256 amountIn; uint256 amountOut; address[] path; address[] adapters; } constructor( address[] memory _adapters, address[] memory _trustedTokens, address _feeClaimer, address _wrapped_native ) { _setAllowanceForWrapping(_wrapped_native); setTrustedTokens(_trustedTokens); setFeeClaimer(_feeClaimer); setAdapters(_adapters); WNATIVE = _wrapped_native; } event Recovered(address indexed asset, uint256 amount); event UpdatedTrustedTokens(address[] newTrustedTokens); event UpdatedAdapters(address[] _newAdapters); event UpdatedMinFee(uint256 oldMinFee, uint256 newMinFee); event UpdatedFeeClaimer(address oldFeeClaimer, address newFeeClaimer); event RouterSwap( address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut ); // -- SETTERS -- function _setAllowanceForWrapping(address _wnative) internal { IERC20(_wnative).safeApprove(_wnative, type(uint256).max); } function setTrustedTokens(address[] memory _trustedTokens) public onlyMaintainer { emit UpdatedTrustedTokens(_trustedTokens); TRUSTED_TOKENS = _trustedTokens; } function setAdapters(address[] memory _adapters) public onlyMaintainer { emit UpdatedAdapters(_adapters); ADAPTERS = _adapters; } function setMinFee(uint256 _fee) external onlyMaintainer { emit UpdatedMinFee(MIN_FEE, _fee); MIN_FEE = _fee; } function setFeeClaimer(address _claimer) public onlyMaintainer { emit UpdatedFeeClaimer(FEE_CLAIMER, _claimer); FEE_CLAIMER = _claimer; } // -- GENERAL -- function trustedTokensCount() external view returns (uint256) { return TRUSTED_TOKENS.length; } function adaptersCount() external view returns (uint256) { return ADAPTERS.length; } function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external onlyMaintainer { if (_tokenAmount == 0) revert NothingToRecover(); IERC20(_tokenAddress).safeTransfer(_msgSender(), _tokenAmount); emit Recovered(_tokenAddress, _tokenAmount); } function recoverAVAX(uint256 _amount) external onlyMaintainer { if (_amount == 0) revert NothingToRecover(); payable(_msgSender()).transfer(_amount); emit Recovered(address(0), _amount); } // Fallback receive() external payable {} // -- HELPERS -- function _applyFee(uint256 _amountIn, uint256 _fee) internal view returns (uint256) { if (_fee < MIN_FEE) revert InvalidFee(); return (_amountIn * (FEE_DENOMINATOR - _fee)) / FEE_DENOMINATOR; } function _wrap(uint256 _amount) internal { IWETH(WNATIVE).deposit{ value: _amount }(); } function _unwrap(uint256 _amount) internal { IWETH(WNATIVE).withdraw(_amount); } /** * @notice Return tokens to user * @dev Pass address(0) for AVAX * @param _token address * @param _amount tokens to return * @param _to address where funds should be sent to */ function _returnTokensTo( address _token, uint256 _amount, address _to ) internal { if (address(this) != _to) { if (_token == NATIVE) { payable(_to).transfer(_amount); } else { IERC20(_token).safeTransfer(_to, _amount); } } } /** * Makes a deep copy of Offer struct */ function _cloneOffer(Offer memory _queries) internal pure returns (Offer memory) { return Offer( _queries.amounts, _queries.adapters, _queries.path, _queries.gasEstimate ); } /** * Appends Query elements to Offer struct */ function _addQuery( Offer memory _queries, uint256 _amount, address _adapter, address _tokenOut, uint256 _gasEstimate ) internal pure { _queries.path = BytesManipulation.mergeBytes( _queries.path, BytesManipulation.toBytes(_tokenOut) ); _queries.amounts = BytesManipulation.mergeBytes( _queries.amounts, BytesManipulation.toBytes(_amount) ); _queries.adapters = BytesManipulation.mergeBytes( _queries.adapters, BytesManipulation.toBytes(_adapter) ); _queries.gasEstimate += _gasEstimate; } /** * Converts byte-arrays to an array of integers */ function _formatAmounts(bytes memory _amounts) internal pure returns (uint256[] memory) { // Format amounts uint256 chunks = _amounts.length / 32; uint256[] memory amountsFormatted = new uint256[](chunks); for (uint256 i = 0; i < chunks; i++) { amountsFormatted[i] = BytesManipulation.bytesToUint256( i * 32 + 32, _amounts ); } return amountsFormatted; } /** * Converts byte-array to an array of addresses */ function _formatAddresses(bytes memory _addresses) internal pure returns (address[] memory) { uint256 chunks = _addresses.length / 32; address[] memory addressesFormatted = new address[](chunks); for (uint256 i = 0; i < chunks; i++) { addressesFormatted[i] = BytesManipulation.bytesToAddress( i * 32 + 32, _addresses ); } return addressesFormatted; } /** * Formats elements in the Offer object from byte-arrays to integers and addresses */ function _formatOffer(Offer memory _queries) internal pure returns (FormattedOffer memory) { return FormattedOffer( _formatAmounts(_queries.amounts), _formatAddresses(_queries.adapters), _formatAddresses(_queries.path), _queries.gasEstimate ); } // -- QUERIES -- /** * Query single adapter */ function queryAdapter( uint256 _amountIn, address _tokenIn, address _tokenOut, uint8 _index ) external view returns (uint256) { IAdapter _adapter = IAdapter(ADAPTERS[_index]); uint256 amountOut = _adapter.query(_amountIn, _tokenIn, _tokenOut); return amountOut; } /** * Query specified adapters */ function queryNoSplit( uint256 _amountIn, address _tokenIn, address _tokenOut, uint8[] calldata _options ) public view returns (Query memory) { Query memory bestQuery; for (uint8 i; i < _options.length; i++) { address _adapter = ADAPTERS[_options[i]]; uint256 amountOut = IAdapter(_adapter).query( _amountIn, _tokenIn, _tokenOut ); if (i == 0 || amountOut > bestQuery.amountOut) { bestQuery = Query(_adapter, _tokenIn, _tokenOut, amountOut); } } return bestQuery; } /** * Query all adapters */ function queryNoSplit( uint256 _amountIn, address _tokenIn, address _tokenOut ) public view returns (Query memory) { Query memory bestQuery; for (uint8 i; i < ADAPTERS.length; i++) { address _adapter = ADAPTERS[i]; uint256 amountOut = IAdapter(_adapter).query( _amountIn, _tokenIn, _tokenOut ); if (i == 0 || amountOut > bestQuery.amountOut) { bestQuery = Query(_adapter, _tokenIn, _tokenOut, amountOut); } } return bestQuery; } /** * Return path with best returns between two tokens * Takes gas-cost into account */ function findBestPathWithGas( uint256 _amountIn, address _tokenIn, address _tokenOut, uint256 _maxSteps, uint256 _gasPrice ) external view returns (FormattedOffer memory) { if (_maxSteps == 0 && _maxSteps > 4) revert InvalidMaxSteps(); Offer memory queries; queries.amounts = BytesManipulation.toBytes(_amountIn); queries.path = BytesManipulation.toBytes(_tokenIn); uint256 gasPriceInExitTkn = _gasPrice > 0 ? getGasPriceInExitTkn(_gasPrice, _tokenOut) : 0; queries = _findBestPath( _amountIn, _tokenIn, _tokenOut, _maxSteps, queries, gasPriceInExitTkn ); if (queries.adapters.length == 0) { queries.amounts = ""; queries.path = ""; } return _formatOffer(queries); } // Find the market price between gas-asset(native) and token-out and express gas price in token-out function getGasPriceInExitTkn(uint256 _gasPrice, address _tokenOut) internal view returns (uint256 price) { // Avoid low-liquidity price appreciation (https://github.com/yieldyak/yak-aggregator/issues/20) FormattedOffer memory gasQuery = findBestPath( 1e18, WNATIVE, _tokenOut, 2 ); if (gasQuery.path.length != 0) { // Leave result in nWei to preserve precision for assets with low decimal places price = (gasQuery.amounts[gasQuery.amounts.length - 1] * _gasPrice) / 1e9; } } /** * Return path with best returns between two tokens */ function findBestPath( uint256 _amountIn, address _tokenIn, address _tokenOut, uint256 _maxSteps ) public view returns (FormattedOffer memory) { if (_maxSteps == 0 && _maxSteps > 4) revert InvalidMaxSteps(); Offer memory queries; queries.amounts = BytesManipulation.toBytes(_amountIn); queries.path = BytesManipulation.toBytes(_tokenIn); queries = _findBestPath( _amountIn, _tokenIn, _tokenOut, _maxSteps, queries, 0 ); // If no paths are found return empty struct if (queries.adapters.length == 0) { queries.amounts = ""; queries.path = ""; } return _formatOffer(queries); } function _findBestPath( uint256 _amountIn, address _tokenIn, address _tokenOut, uint256 _maxSteps, Offer memory _queries, uint256 _tknOutPriceNwei ) internal view returns (Offer memory) { Offer memory bestOption = _cloneOffer(_queries); uint256 bestAmountOut; uint256 gasEstimate; bool withGas = _tknOutPriceNwei != 0; // First check if there is a path directly from tokenIn to tokenOut Query memory queryDirect = queryNoSplit(_amountIn, _tokenIn, _tokenOut); if (queryDirect.amountOut != 0) { if (withGas) { gasEstimate = IAdapter(queryDirect.adapter).swapGasEstimate(); } _addQuery( bestOption, queryDirect.amountOut, queryDirect.adapter, queryDirect.tokenOut, gasEstimate ); bestAmountOut = queryDirect.amountOut; } // Only check the rest if they would go beyond step limit (Need at least 2 more steps) if (_maxSteps > 1 && _queries.adapters.length / 32 <= _maxSteps - 2) { // Check for paths that pass through trusted tokens for (uint256 i = 0; i < TRUSTED_TOKENS.length; i++) { if (_tokenIn == TRUSTED_TOKENS[i]) { continue; } // Loop through all adapters to find the best one for swapping tokenIn for one of the trusted tokens Query memory bestSwap = queryNoSplit( _amountIn, _tokenIn, TRUSTED_TOKENS[i] ); if (bestSwap.amountOut == 0) { continue; } // Explore options that connect the current path to the tokenOut Offer memory newOffer = _cloneOffer(_queries); if (withGas) { gasEstimate = IAdapter(bestSwap.adapter).swapGasEstimate(); } _addQuery( newOffer, bestSwap.amountOut, bestSwap.adapter, bestSwap.tokenOut, gasEstimate ); newOffer = _findBestPath( bestSwap.amountOut, TRUSTED_TOKENS[i], _tokenOut, _maxSteps, newOffer, _tknOutPriceNwei ); // Recursive step address tokenOut = BytesManipulation.bytesToAddress( newOffer.path.length, newOffer.path ); uint256 amountOut = BytesManipulation.bytesToUint256( newOffer.amounts.length, newOffer.amounts ); // Check that the last token in the path is the tokenOut and update the new best option if neccesary if (_tokenOut == tokenOut && amountOut > bestAmountOut) { if (newOffer.gasEstimate > bestOption.gasEstimate) { uint256 gasCostDiff = (_tknOutPriceNwei * (newOffer.gasEstimate - bestOption.gasEstimate)) / 1e9; uint256 priceDiff = amountOut - bestAmountOut; if (gasCostDiff > priceDiff) { continue; } } bestAmountOut = amountOut; bestOption = newOffer; } } } return bestOption; } // -- SWAPPERS -- function _swapNoSplit( Trade calldata _trade, address _from, address _to, uint256 _fee ) internal returns (uint256) { uint256[] memory amounts = new uint256[](_trade.path.length); if (_fee > 0 || MIN_FEE > 0) { // Transfer fees to the claimer account and decrease initial amount amounts[0] = _applyFee(_trade.amountIn, _fee); IERC20(_trade.path[0]).safeTransferFrom( _from, FEE_CLAIMER, _trade.amountIn - amounts[0] ); } else { amounts[0] = _trade.amountIn; } IERC20(_trade.path[0]).safeTransferFrom( _from, _trade.adapters[0], amounts[0] ); // Get amounts that will be swapped for (uint256 i = 0; i < _trade.adapters.length; i++) { amounts[i + 1] = IAdapter(_trade.adapters[i]).query( amounts[i], _trade.path[i], _trade.path[i + 1] ); } if (amounts[amounts.length - 1] < _trade.amountOut) revert InvalidOutput(); for (uint256 i = 0; i < _trade.adapters.length; i++) { // All adapters should transfer output token to the following target // All targets are the adapters, expect for the last swap where tokens are sent out address targetAddress = i < _trade.adapters.length - 1 ? _trade.adapters[i + 1] : _to; IAdapter(_trade.adapters[i]).swap( amounts[i], amounts[i + 1], _trade.path[i], _trade.path[i + 1], targetAddress ); } emit RouterSwap( _trade.path[0], _trade.path[_trade.path.length - 1], _trade.amountIn, amounts[amounts.length - 1] ); return amounts[amounts.length - 1]; } function swapNoSplit( Trade calldata _trade, address _to, uint256 _fee ) public { _swapNoSplit(_trade, _msgSender(), _to, _fee); } function swapNoSplitFromAVAX( Trade calldata _trade, address _to, uint256 _fee ) external payable { if (_trade.path[0] != WNATIVE) revert InvalidPath(); _wrap(_trade.amountIn); _swapNoSplit(_trade, address(this), _to, _fee); } function swapNoSplitToAVAX( Trade calldata _trade, address _to, uint256 _fee ) public { if (_trade.path[_trade.path.length - 1] != WNATIVE) revert InvalidPath(); uint256 returnAmount = _swapNoSplit( _trade, _msgSender(), address(this), _fee ); _unwrap(returnAmount); _returnTokensTo(NATIVE, returnAmount, _to); } /** * Swap token to token without the need to approve the first token */ function swapNoSplitWithPermit( Trade calldata _trade, address _to, uint256 _fee, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { IERC20(_trade.path[0]).permit( _msgSender(), address(this), _trade.amountIn, _deadline, _v, _r, _s ); swapNoSplit(_trade, _to, _fee); } /** * Swap token to AVAX without the need to approve the first token */ function swapNoSplitToAVAXWithPermit( Trade calldata _trade, address _to, uint256 _fee, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { IERC20(_trade.path[0]).permit( _msgSender(), address(this), _trade.amountIn, _deadline, _v, _r, _s ); swapNoSplitToAVAX(_trade, _to, _fee); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import "@openzeppelin/contracts/access/AccessControl.sol"; /** * @dev Contract module which extends the basic access control mechanism of Ownable * to include many maintainers, whom only the owner (DEFAULT_ADMIN_ROLE) may add and * remove. * * By default, the owner account will be the one that deploys the contract. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available this modifier: * `onlyMaintainer`, which can be applied to your functions to restrict their use to * the accounts with the role of maintainer. */ error NotMaintainer(); abstract contract Maintainable is Context, AccessControl { bytes32 public constant MAINTAINER_ROLE = keccak256("MAINTAINER_ROLE"); constructor() { address msgSender = _msgSender(); // members of the DEFAULT_ADMIN_ROLE alone may revoke and grant role membership _setupRole(DEFAULT_ADMIN_ROLE, msgSender); _setupRole(MAINTAINER_ROLE, msgSender); } function addMaintainer(address addedMaintainer) public virtual { grantRole(MAINTAINER_ROLE, addedMaintainer); } function removeMaintainer(address removedMaintainer) public virtual { revokeRole(MAINTAINER_ROLE, removedMaintainer); } function renounceRole(bytes32 role) public virtual { address msgSender = _msgSender(); renounceRole(role, msgSender); } function transferOwnership(address newOwner) public virtual { address msgSender = _msgSender(); grantRole(DEFAULT_ADMIN_ROLE, newOwner); renounceRole(DEFAULT_ADMIN_ROLE, msgSender); } modifier onlyMaintainer() { if (!hasRole(MAINTAINER_ROLE, _msgSender())) revert NotMaintainer(); _; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import "./BytesToTypes.sol"; library BytesManipulation { function toBytes(uint256 x) internal pure returns (bytes memory b) { b = new bytes(32); assembly { mstore(add(b, 32), x) } } function toBytes(address x) internal pure returns (bytes memory b) { b = new bytes(32); assembly { mstore(add(b, 32), x) } } function mergeBytes(bytes memory a, bytes memory b) public pure returns (bytes memory c) { // From https://ethereum.stackexchange.com/a/40456 uint256 alen = a.length; uint256 totallen = alen + b.length; uint256 loopsa = (a.length + 31) / 32; uint256 loopsb = (b.length + 31) / 32; assembly { let m := mload(0x40) mstore(m, totallen) for { let i := 0 } lt(i, loopsa) { i := add(1, i) } { mstore( add(m, mul(32, add(1, i))), mload(add(a, mul(32, add(1, i)))) ) } for { let i := 0 } lt(i, loopsb) { i := add(1, i) } { mstore( add(m, add(mul(32, add(1, i)), alen)), mload(add(b, mul(32, add(1, i)))) ) } mstore(0x40, add(m, add(32, totallen))) c := m } } function bytesToAddress(uint256 _offst, bytes memory _input) internal pure returns (address) { return BytesToTypes.bytesToAddress(_offst, _input); } function bytesToUint256(uint256 _offst, bytes memory _input) internal pure returns (uint256) { return BytesToTypes.bytesToUint256(_offst, _input); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IAdapter { function name() external view returns (string memory); function swapGasEstimate() external view returns (uint256); function swap( uint256, uint256, address, address, address ) external; function query( uint256, address, address ) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; interface IERC20 { event Approval(address, address, uint256); event Transfer(address, address, uint256); function name() external view returns (string memory); function decimals() external view returns (uint8); function transferFrom( address, address, uint256 ) external returns (bool); function allowance(address, address) external view returns (uint256); function approve(address, uint256) external returns (bool); function transfer(address, uint256) external returns (bool); function balanceOf(address) external view returns (uint256); function nonces(address) external view returns (uint256); // Only tokens that support permit function permit( address, address, uint256, uint256, uint8, bytes32, bytes32 ) external; // Only tokens that support permit function swap(address, uint256) external; // Only Avalanche bridge tokens function swapSupply(address) external view returns (uint256); // Only Avalanche bridge tokens }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import "./IERC20.sol"; interface IWETH is IERC20 { function withdraw(uint256 amount) external; function deposit() external payable; }
// This is a simplified version of OpenZepplin's SafeERC20 library // SPDX-License-Identifier: MIT pragma solidity 0.8.17; pragma experimental ABIEncoderV2; import "../interface/IERC20.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 { 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" ); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// From https://github.com/pouladzade/Seriality/blob/master/src/BytesToTypes.sol (Licensed under Apache2.0) // SPDX-License-Identifier: Apache2.0 pragma solidity 0.8.17; library BytesToTypes { function bytesToAddress(uint256 _offst, bytes memory _input) internal pure returns (address _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint256(uint256 _offst, bytes memory _input) internal pure returns (uint256 _output) { assembly { _output := mload(add(_input, _offst)) } } }
{ "optimizer": { "enabled": true, "runs": 999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "src/contracts/lib/BytesManipulation.sol": { "BytesManipulation": "0x26b794235422e7c6f3ac6c717b10598c2a144203" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"_adapters","type":"address[]"},{"internalType":"address[]","name":"_trustedTokens","type":"address[]"},{"internalType":"address","name":"_feeClaimer","type":"address"},{"internalType":"address","name":"_wrapped_native","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidFee","type":"error"},{"inputs":[],"name":"InvalidMaxSteps","type":"error"},{"inputs":[],"name":"InvalidOutput","type":"error"},{"inputs":[],"name":"InvalidPath","type":"error"},{"inputs":[],"name":"NotMaintainer","type":"error"},{"inputs":[],"name":"NothingToRecover","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"RouterSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_newAdapters","type":"address[]"}],"name":"UpdatedAdapters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldFeeClaimer","type":"address"},{"indexed":false,"internalType":"address","name":"newFeeClaimer","type":"address"}],"name":"UpdatedFeeClaimer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldMinFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMinFee","type":"uint256"}],"name":"UpdatedMinFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"newTrustedTokens","type":"address[]"}],"name":"UpdatedTrustedTokens","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ADAPTERS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_CLAIMER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAINTAINER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TRUSTED_TOKENS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WNATIVE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adaptersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addedMaintainer","type":"address"}],"name":"addMaintainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_maxSteps","type":"uint256"}],"name":"findBestPath","outputs":[{"components":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"internalType":"struct Router.FormattedOffer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_maxSteps","type":"uint256"},{"internalType":"uint256","name":"_gasPrice","type":"uint256"}],"name":"findBestPathWithGas","outputs":[{"components":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"internalType":"struct Router.FormattedOffer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint8","name":"_index","type":"uint8"}],"name":"queryAdapter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint8[]","name":"_options","type":"uint8[]"}],"name":"queryNoSplit","outputs":[{"components":[{"internalType":"address","name":"adapter","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"internalType":"struct Router.Query","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"}],"name":"queryNoSplit","outputs":[{"components":[{"internalType":"address","name":"adapter","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"internalType":"struct Router.Query","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"removedMaintainer","type":"address"}],"name":"removeMaintainer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_adapters","type":"address[]"}],"name":"setAdapters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_claimer","type":"address"}],"name":"setFeeClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setMinFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_trustedTokens","type":"address[]"}],"name":"setTrustedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"adapters","type":"address[]"}],"internalType":"struct Router.Trade","name":"_trade","type":"tuple"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"swapNoSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"adapters","type":"address[]"}],"internalType":"struct Router.Trade","name":"_trade","type":"tuple"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"swapNoSplitFromAVAX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"adapters","type":"address[]"}],"internalType":"struct Router.Trade","name":"_trade","type":"tuple"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"swapNoSplitToAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"adapters","type":"address[]"}],"internalType":"struct Router.Trade","name":"_trade","type":"tuple"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"swapNoSplitToAVAXWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address[]","name":"adapters","type":"address[]"}],"internalType":"struct Router.Trade","name":"_trade","type":"tuple"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"swapNoSplitWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedTokensCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a060405260006001553480156200001657600080fd5b506040516200416438038062004164833981016040819052620000399162000741565b3362000047600082620000a5565b620000626000805160206200414483398151915282620000a5565b506200006e81620000b5565b6200007983620000df565b62000084826200018a565b6200008f846200022c565b6001600160a01b03166080525062000895915050565b620000b18282620002b3565b5050565b620000dc81600019836001600160a01b03166200035360201b6200170c179092919060201c565b50565b6200011e60008051602062004144833981519152335b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6200013c57604051639b96b05160e01b815260040160405180910390fd5b7f658ff1688002926d8f426cb10c052ec29003f50042df9652d8613484c1a58647816040516200016d9190620007d0565b60405180910390a18051620000b1906003906020840190620005e0565b620001a56000805160206200414483398151915233620000f5565b620001c357604051639b96b05160e01b815260040160405180910390fd5b600254604080516001600160a01b03928316815291831660208301527fb2c853ac4d80d18d058c43d8018d077a036e542a79acae1647f5ad2a8c76f4e2910160405180910390a1600280546001600160a01b0319166001600160a01b0392909216919091179055565b620002476000805160206200414483398151915233620000f5565b6200026557604051639b96b05160e01b815260040160405180910390fd5b7febf7325f48e05e5e38809c69f8b02a7c907ed31d8768e6c2d841b1296a9225fe81604051620002969190620007d0565b60405180910390a18051620000b1906004906020840190620005e0565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000b1576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200030f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b801580620003d15750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015620003a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cf91906200081f565b155b620004495760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620004a1918591620004a616565b505050565b600080836001600160a01b031683604051620004c3919062000839565b6000604051808303816000865af19150503d806000811462000502576040519150601f19603f3d011682016040523d82523d6000602084013e62000507565b606091505b5091509150816200055b5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015260640162000440565b805115620005da57808060200190518101906200057991906200086a565b620005da5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000440565b50505050565b82805482825590600052602060002090810192821562000638579160200282015b828111156200063857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000601565b50620006469291506200064a565b5090565b5b808211156200064657600081556001016200064b565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200068f57600080fd5b919050565b600082601f830112620006a657600080fd5b815160206001600160401b0380831115620006c557620006c562000661565b8260051b604051601f19603f83011681018181108482111715620006ed57620006ed62000661565b6040529384528581018301938381019250878511156200070c57600080fd5b83870191505b848210156200073657620007268262000677565b8352918301919083019062000712565b979650505050505050565b600080600080608085870312156200075857600080fd5b84516001600160401b03808211156200077057600080fd5b6200077e8883890162000694565b955060208701519150808211156200079557600080fd5b50620007a48782880162000694565b935050620007b56040860162000677565b9150620007c56060860162000677565b905092959194509250565b6020808252825182820181905260009190848201906040850190845b81811015620008135783516001600160a01b031683529284019291840191600101620007ec565b50909695505050505050565b6000602082840312156200083257600080fd5b5051919050565b6000825160005b818110156200085c576020818601810151858301520162000840565b506000920191825250919050565b6000602082840312156200087d57600080fd5b815180151581146200088e57600080fd5b9392505050565b608051613870620008d4600039600081816106c4015281816115a40152818161167c015281816118dd0152818161259a015261266b01526138706000f3fe6080604052600436106102885760003560e01c80638980f11f11610153578063c3accd48116100cb578063dede7f151161007f578063f2fde38b11610064578063f2fde38b146107be578063f8742254146107de578063fe38c5e61461081257600080fd5b8063dede7f151461077e578063f03503821461079e57600080fd5b8063d547741f116100b0578063d547741f14610726578063d73792a914610746578063d8baf7cf1461075e57600080fd5b8063c3accd48146106e6578063c8a3a5c61461070657600080fd5b8063952e901211610122578063a217fddf11610107578063a217fddf14610647578063a3f4df7e1461065c578063b381cf40146106b257600080fd5b8063952e901214610612578063a0cf0aea1461063257600080fd5b80638980f11f1461052e5780638bb9c5bf1461054e57806391d148541461056e57806392f5d88a146105b257600080fd5b80634c09cf4e1161020157806375d19947116101b557806376ebe69c1161019a57806376ebe69c146104e45780637c7a561b146104f9578063809356aa1461050e57600080fd5b806375d19947146104ae57806376c7a3c7146104ce57600080fd5b806352a52ab0116101e657806352a52ab01461044e5780636b453c1f1461046e5780636bf2df861461048e57600080fd5b80634c09cf4e1461040e5780634ebb79161461042e57600080fd5b8063248a9ca31161025857806331ac99201161023d57806331ac9920146103ae57806336568abe146103ce5780633a9a4081146103ee57600080fd5b8063248a9ca3146103505780632f2ff15d1461038e57600080fd5b8062b99e361461029457806301ffc9a7146102d1578063061b15e7146103015780631e189dc21461032e57600080fd5b3661028f57005b600080fd5b3480156102a057600080fd5b506002546102b4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102dd57600080fd5b506102f16102ec366004612f5f565b610825565b60405190151581526020016102c8565b34801561030d57600080fd5b5061032161031c366004612fa5565b61088e565b6040516102c89190613037565b34801561033a57600080fd5b5061034e6103493660046130fa565b610997565b005b34801561035c57600080fd5b5061038061036b36600461317f565b60009081526020819052604090206001015490565b6040519081526020016102c8565b34801561039a57600080fd5b5061034e6103a9366004613198565b610a71565b3480156103ba57600080fd5b5061034e6103c936600461317f565b610a9b565b3480156103da57600080fd5b5061034e6103e9366004613198565b610b2b565b3480156103fa57600080fd5b5061034e61040936600461320b565b610bbc565b34801561041a57600080fd5b506103216104293660046132ac565b610c55565b34801561043a57600080fd5b5061034e61044936600461317f565b610d43565b34801561045a57600080fd5b506102b461046936600461317f565b610e1a565b34801561047a57600080fd5b5061034e6104893660046132f0565b610e44565b34801561049a57600080fd5b5061034e6104a936600461330b565b610e71565b3480156104ba57600080fd5b5061034e6104c93660046130fa565b610e83565b3480156104da57600080fd5b5061038060015481565b3480156104f057600080fd5b50600354610380565b34801561050557600080fd5b50600454610380565b34801561051a57600080fd5b50610380610529366004613362565b610f54565b34801561053a57600080fd5b5061034e6105493660046133af565b611000565b34801561055a57600080fd5b5061034e61056936600461317f565b6110cb565b34801561057a57600080fd5b506102f1610589366004613198565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105be57600080fd5b506105d26105cd3660046133d9565b6110d6565b6040805182516001600160a01b039081168252602080850151821690830152838301511691810191909152606091820151918101919091526080016102c8565b34801561061e57600080fd5b506102b461062d36600461317f565b61126e565b34801561063e57600080fd5b506102b4600081565b34801561065357600080fd5b50610380600081565b34801561066857600080fd5b506106a56040518060400160405280600681526020017f526f75746572000000000000000000000000000000000000000000000000000081525081565b6040516102c891906134c7565b3480156106be57600080fd5b506102b47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106f257600080fd5b5061034e6107013660046132f0565b61127e565b34801561071257600080fd5b5061034e61072136600461320b565b611343565b34801561073257600080fd5b5061034e610741366004613198565b6113dc565b34801561075257600080fd5b506103806305f5e10081565b34801561076a57600080fd5b5061034e6107793660046132f0565b611401565b34801561078a57600080fd5b506105d26107993660046134da565b61142b565b3480156107aa57600080fd5b5061034e6107b936600461330b565b61159a565b3480156107ca57600080fd5b5061034e6107d93660046132f0565b61165b565b3480156107ea57600080fd5b506103807f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab9581565b61034e61082036600461330b565b611672565b60006001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061088857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6108b96040518060800160405280606081526020016060815260200160608152602001600081525090565b821580156108c75750600483115b156108e5576040516302eccda760e11b815260040160405180910390fd5b6109106040518060800160405280606081526020016060815260200160608152602001600081525090565b610919876118a2565b8152610924866118a2565b6040820152600083610937576000610941565b61094184876118cc565b9050610951888888888686611961565b9150816020015151600003610982576040805160208082018352600080835291855282519081018352908152908301525b61098b82611cb3565b98975050505050505050565b6109a46040880188613516565b60008181106109b5576109b5613567565b90506020020160208101906109ca91906132f0565b6001600160a01b031663d505accf3360405160e083901b6001600160e01b03191681526001600160a01b039091166004820152306024820152893560448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6887878761159a565b50505050505050565b600082815260208190526040902060010154610a8c81611d2e565b610a968383611d38565b505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610aea57604051639b96b05160e01b815260040160405180910390fd5b60015460408051918252602082018390527f4bb8a6184424e4bb853a4836042f5a726e4e710873989bfc6abdab19966f5b70910160405180910390a1600155565b6001600160a01b0381163314610bae5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610bb88282611dd6565b5050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610c0b57604051639b96b05160e01b815260040160405180910390fd5b7febf7325f48e05e5e38809c69f8b02a7c907ed31d8768e6c2d841b1296a9225fe81604051610c3a919061357d565b60405180910390a18051610bb8906004906020840190612ed8565b610c806040518060800160405280606081526020016060815260200160608152602001600081525090565b81158015610c8e5750600482115b15610cac576040516302eccda760e11b815260040160405180910390fd5b610cd76040518060800160405280606081526020016060815260200160608152602001600081525090565b610ce0866118a2565b8152610ceb856118a2565b6040820152610cff86868686856000611961565b9050806020015151600003610d30576040805160208082018352600080835291845282519081018352908152908201525b610d3981611cb3565b9695505050505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610d9257604051639b96b05160e01b815260040160405180910390fd5b80600003610db35760405163157474a960e31b815260040160405180910390fd5b604051339082156108fc029083906000818181858888f19350505050158015610de0573d6000803e3d6000fd5b506040518181526000907f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa289060200160405180910390a250565b60038181548110610e2a57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e6e7f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab9582610a71565b50565b610e7d83338484611e55565b50505050565b610e906040880188613516565b6000818110610ea157610ea1613567565b9050602002016020810190610eb691906132f0565b6001600160a01b031663d505accf3360405160e083901b6001600160e01b03191681526001600160a01b039091166004820152306024820152893560448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b50505050610a68878787610e71565b60008060048360ff1681548110610f6d57610f6d613567565b60009182526020822001546040516377ccc49d60e11b8152600481018990526001600160a01b03888116602483015287811660448301529091169250829063ef99893a90606401602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906135ca565b979650505050505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff1661104f57604051639b96b05160e01b815260040160405180910390fd5b806000036110705760405163157474a960e31b815260040160405180910390fd5b6110846001600160a01b0383163383612522565b816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28826040516110bf91815260200190565b60405180910390a25050565b33610bb88282610b2b565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260005b60ff8116841115611263576000600486868460ff1681811061114557611145613567565b905060200201602081019061115a91906135e3565b60ff168154811061116d5761116d613567565b60009182526020822001546040516377ccc49d60e11b8152600481018c90526001600160a01b038b811660248301528a811660448301529091169250829063ef99893a90606401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906135ca565b905060ff8316158061120a5750836060015181115b1561124e576040518060800160405280836001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b031681526020018281525093505b5050808061125b90613614565b915050611121565b509695505050505050565b60048181548110610e2a57600080fd5b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff166112cd57604051639b96b05160e01b815260040160405180910390fd5b600254604080516001600160a01b03928316815291831660208301527fb2c853ac4d80d18d058c43d8018d077a036e542a79acae1647f5ad2a8c76f4e2910160405180910390a16002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff1661139257604051639b96b05160e01b815260040160405180910390fd5b7f658ff1688002926d8f426cb10c052ec29003f50042df9652d8613484c1a58647816040516113c1919061357d565b60405180910390a18051610bb8906003906020840190612ed8565b6000828152602081905260409020600101546113f781611d2e565b610a968383611dd6565b610e6e7f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab95826113dc565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260005b60045460ff8216101561159157600060048260ff168154811061149b5761149b613567565b60009182526020822001546040516377ccc49d60e11b8152600481018a90526001600160a01b03898116602483015288811660448301529091169250829063ef99893a90606401602060405180830381865afa1580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152391906135ca565b905060ff831615806115385750836060015181115b1561157c576040518060800160405280836001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018281525093505b5050808061158990613614565b915050611476565b50949350505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166115d16040850185613516565b60016115e06040880188613516565b6115eb929150613633565b8181106115fa576115fa613567565b905060200201602081019061160f91906132f0565b6001600160a01b031614611636576040516320db826760e01b815260040160405180910390fd5b600061164484333085611e55565b905061164f8161256b565b610e7d60008285612601565b33611667600083610a71565b610bb8600082610b2b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166116a96040850185613516565b60008181106116ba576116ba613567565b90506020020160208101906116cf91906132f0565b6001600160a01b0316146116f6576040516320db826760e01b815260040160405180910390fd5b6117008335612669565b610e7d83308484611e55565b80158061179f57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179d91906135ca565b155b6118115760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ba5565b6040516001600160a01b038316602482015260448101829052610a969084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091526126e0565b60408051602080825281830190925260609160208201818036833750505060208101929092525090565b600080611904670de0b6b3a76400007f0000000000000000000000000000000000000000000000000000000000000000856002610c55565b905080604001515160001461195a5780518051633b9aca0091869161192b90600190613633565b8151811061193b5761193b613567565b602002602001015161194d9190613646565b611957919061365d565b91505b5092915050565b61198c6040518060800160405280606081526020016060815260200160608152602001600081525090565b60006119978461281c565b9050600080841515816119ab8c8c8c61142b565b90508060600151600014611a49578115611a285780600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2591906135ca565b92505b611a41858260600151836000015184604001518761287f565b806060015193505b600189118015611a745750611a5f60028a613633565b6020896020015151611a71919061365d565b11155b15611ca35760005b600354811015611ca15760038181548110611a9957611a99613567565b6000918252602090912001546001600160a01b038d8116911614611c8f576000611aeb8e8e60038581548110611ad157611ad1613567565b6000918252602090912001546001600160a01b031661142b565b90508060600151600003611aff5750611c8f565b6000611b0a8b61281c565b90508415611b7b5781600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7891906135ca565b95505b611b94818360600151846000015185604001518a61287f565b611bcd826060015160038581548110611baf57611baf613567565b6000918252602090912001546001600160a01b03168f8f858f611961565b90506000611be48260400151518360400151612a48565b82518051919250600091611bf791612a48565b9050816001600160a01b03168f6001600160a01b0316148015611c1957508881115b15611c8a57896060015183606001511115611c83576000633b9aca008b606001518560600151611c499190613633565b611c53908f613646565b611c5d919061365d565b90506000611c6b8b84613633565b905080821115611c8057505050505050611c8f565b50505b8098508299505b505050505b80611c998161367f565b915050611a7c565b505b50929a9950505050505050505050565b611cde6040518060800160405280606081526020016060815260200160608152602001600081525090565b6040518060800160405280611cf68460000151612a5b565b8152602001611d088460200151612b17565b8152602001611d1a8460400151612b17565b815260200183606001518152509050919050565b610e6e8133612bc7565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610bb8576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d923390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610bb8576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080611e656040870187613516565b905067ffffffffffffffff811115611e7f57611e7f6131c4565b604051908082528060200260200182016040528015611ea8578160200160208202803683370190505b5090506000831180611ebc57506000600154115b15611f7857611ecc863584612c45565b81600081518110611edf57611edf613567565b602002602001018181525050611f7385600260009054906101000a90046001600160a01b031683600081518110611f1857611f18613567565b60200260200101518960000135611f2f9190613633565b611f3c60408b018b613516565b6000818110611f4d57611f4d613567565b9050602002016020810190611f6291906132f0565b6001600160a01b0316929190612ca6565b611f9d565b856000013581600081518110611f9057611f90613567565b6020026020010181815250505b611fff85611fae6060890189613516565b6000818110611fbf57611fbf613567565b9050602002016020810190611fd491906132f0565b83600081518110611fe757611fe7613567565b6020026020010151898060400190611f3c9190613516565b60005b61200f6060880188613516565b9050811015612192576120256060880188613516565b8281811061203557612035613567565b905060200201602081019061204a91906132f0565b6001600160a01b031663ef99893a83838151811061206a5761206a613567565b60200260200101518980604001906120829190613516565b8581811061209257612092613567565b90506020020160208101906120a791906132f0565b6120b460408c018c613516565b6120bf876001613698565b8181106120ce576120ce613567565b90506020020160208101906120e391906132f0565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865afa158015612135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215991906135ca565b82612165836001613698565b8151811061217557612175613567565b60209081029190910101528061218a8161367f565b915050612002565b50856020013581600183516121a79190613633565b815181106121b7576121b7613567565b602002602001015110156121f7576040517f98f7360900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b6122076060880188613516565b90508110156123f3576000600161222160608a018a613516565b61222c929150613633565b82106122385785612274565b6122456060890189613516565b612250846001613698565b81811061225f5761225f613567565b905060200201602081019061227491906132f0565b90506122836060890189613516565b8381811061229357612293613567565b90506020020160208101906122a891906132f0565b6001600160a01b031663eab90da68484815181106122c8576122c8613567565b6020026020010151858560016122de9190613698565b815181106122ee576122ee613567565b60200260200101518b80604001906123069190613516565b8781811061231657612316613567565b905060200201602081019061232b91906132f0565b61233860408e018e613516565b612343896001613698565b81811061235257612352613567565b905060200201602081019061236791906132f0565b6040516001600160e01b031960e087901b168152600481019490945260248401929092526001600160a01b03908116604484015290811660648301528416608482015260a401600060405180830381600087803b1580156123c757600080fd5b505af11580156123db573d6000803e3d6000fd5b505050505080806123eb9061367f565b9150506121fa565b506124016040870187613516565b600161241060408a018a613516565b61241b929150613633565b81811061242a5761242a613567565b905060200201602081019061243f91906132f0565b6001600160a01b03166124556040880188613516565b600081811061246657612466613567565b905060200201602081019061247b91906132f0565b6001600160a01b03167f8ebfcbab08c4fcc415917cb87b61039d8751c71a197b386af8ab3c6a9185669c886000013584600186516124b99190613633565b815181106124c9576124c9613567565b60200260200101516040516124e8929190918252602082015260400190565b60405180910390a380600182516124ff9190613633565b8151811061250f5761250f613567565b6020026020010151915050949350505050565b6040516001600160a01b038316602482015260448101829052610a969084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611856565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156125e657600080fd5b505af11580156125fa573d6000803e3d6000fd5b5050505050565b306001600160a01b03821614610a96576001600160a01b038316612655576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b610a966001600160a01b0384168284612522565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156126c457600080fd5b505af11580156126d8573d6000803e3d6000fd5b505050505050565b600080836001600160a01b0316836040516126fb91906136ab565b6000604051808303816000865af19150503d8060008114612738576040519150601f19603f3d011682016040523d82523d6000602084013e61273d565b606091505b50915091508161278f5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610ba5565b805115610e7d57808060200190518101906127aa91906136c7565b610e7d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ba5565b6128476040518060800160405280606081526020016060815260200160608152602001600081525090565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b7326b794235422e7c6f3ac6c717b10598c2a144203632f9680f586604001516128a7856118a2565b6040518363ffffffff1660e01b81526004016128c49291906136e9565b600060405180830381865af41580156128e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129099190810190613717565b604086015284517326b794235422e7c6f3ac6c717b10598c2a14420390632f9680f590612935876118a2565b6040518363ffffffff1660e01b81526004016129529291906136e9565b600060405180830381865af415801561296f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129979190810190613717565b855260208501517326b794235422e7c6f3ac6c717b10598c2a14420390632f9680f5906129c3866118a2565b6040518363ffffffff1660e01b81526004016129e09291906136e9565b600060405180830381865af41580156129fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a259190810190613717565b6020860152606085018051829190612a3e908390613698565b9052505050505050565b6000612a548383015190565b9392505050565b6060600060208351612a6d919061365d565b905060008167ffffffffffffffff811115612a8a57612a8a6131c4565b604051908082528060200260200182016040528015612ab3578160200160208202803683370190505b50905060005b82811015612b0f57612ae0612acf826020613646565b612ada906020613698565b86612a48565b828281518110612af257612af2613567565b602090810291909101015280612b078161367f565b915050612ab9565b509392505050565b6060600060208351612b29919061365d565b905060008167ffffffffffffffff811115612b4657612b466131c4565b604051908082528060200260200182016040528015612b6f578160200160208202803683370190505b50905060005b82811015612b0f57612b8b612acf826020613646565b828281518110612b9d57612b9d613567565b6001600160a01b039092166020928302919091019091015280612bbf8161367f565b915050612b75565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610bb857612c03816001600160a01b03166014612cf7565b612c0e836020612cf7565b604051602001612c1f9291906137a2565b60408051601f198184030181529082905262461bcd60e51b8252610ba5916004016134c7565b6000600154821015612c83576040517f58d620b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6305f5e100612c928382613633565b612c9c9085613646565b612a54919061365d565b6040516001600160a01b0380851660248301528316604482015260648101829052610e7d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611856565b60606000612d06836002613646565b612d11906002613698565b67ffffffffffffffff811115612d2957612d296131c4565b6040519080825280601f01601f191660200182016040528015612d53576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612d8a57612d8a613567565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612dd557612dd5613567565b60200101906001600160f81b031916908160001a9053506000612df9846002613646565b612e04906001613698565b90505b6001811115612e89577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612e4557612e45613567565b1a60f81b828281518110612e5b57612e5b613567565b60200101906001600160f81b031916908160001a90535060049490941c93612e8281613823565b9050612e07565b508315612a545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ba5565b828054828255906000526020600020908101928215612f3a579160200282015b82811115612f3a578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190612ef8565b50612f46929150612f4a565b5090565b5b80821115612f465760008155600101612f4b565b600060208284031215612f7157600080fd5b81356001600160e01b031981168114612a5457600080fd5b80356001600160a01b0381168114612fa057600080fd5b919050565b600080600080600060a08688031215612fbd57600080fd5b85359450612fcd60208701612f89565b9350612fdb60408701612f89565b94979396509394606081013594506080013592915050565b600081518084526020808501945080840160005b8381101561302c5781516001600160a01b031687529582019590820190600101613007565b509495945050505050565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b8083101561307c578351825292840192600192909201919084019061305c565b50838701519350601f1992508286820301604087015261309c8185612ff3565b935050506040850151818584030160608601526130b98382612ff3565b92505050606084015160808401528091505092915050565b6000608082840312156130e357600080fd5b50919050565b803560ff81168114612fa057600080fd5b600080600080600080600060e0888a03121561311557600080fd5b873567ffffffffffffffff81111561312c57600080fd5b6131388a828b016130d1565b97505061314760208901612f89565b95506040880135945060608801359350613163608089016130e9565b925060a0880135915060c0880135905092959891949750929550565b60006020828403121561319157600080fd5b5035919050565b600080604083850312156131ab57600080fd5b823591506131bb60208401612f89565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613203576132036131c4565b604052919050565b6000602080838503121561321e57600080fd5b823567ffffffffffffffff8082111561323657600080fd5b818501915085601f83011261324a57600080fd5b81358181111561325c5761325c6131c4565b8060051b915061326d8483016131da565b818152918301840191848101908884111561328757600080fd5b938501935b8385101561098b5761329d85612f89565b8252938501939085019061328c565b600080600080608085870312156132c257600080fd5b843593506132d260208601612f89565b92506132e060408601612f89565b9396929550929360600135925050565b60006020828403121561330257600080fd5b612a5482612f89565b60008060006060848603121561332057600080fd5b833567ffffffffffffffff81111561333757600080fd5b613343868287016130d1565b93505061335260208501612f89565b9150604084013590509250925092565b6000806000806080858703121561337857600080fd5b8435935061338860208601612f89565b925061339660408601612f89565b91506133a4606086016130e9565b905092959194509250565b600080604083850312156133c257600080fd5b6133cb83612f89565b946020939093013593505050565b6000806000806000608086880312156133f157600080fd5b8535945061340160208701612f89565b935061340f60408701612f89565b9250606086013567ffffffffffffffff8082111561342c57600080fd5b818801915088601f83011261344057600080fd5b81358181111561344f57600080fd5b8960208260051b850101111561346457600080fd5b9699959850939650602001949392505050565b60005b8381101561349257818101518382015260200161347a565b50506000910152565b600081518084526134b3816020860160208601613477565b601f01601f19169290920160200192915050565b602081526000612a54602083018461349b565b6000806000606084860312156134ef57600080fd5b833592506134ff60208501612f89565b915061350d60408501612f89565b90509250925092565b6000808335601e1984360301811261352d57600080fd5b83018035915067ffffffffffffffff82111561354857600080fd5b6020019150600581901b360382131561356057600080fd5b9250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156135be5783516001600160a01b031683529284019291840191600101613599565b50909695505050505050565b6000602082840312156135dc57600080fd5b5051919050565b6000602082840312156135f557600080fd5b612a54826130e9565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff810361362a5761362a6135fe565b60010192915050565b81810381811115610888576108886135fe565b8082028115828204841417610888576108886135fe565b60008261367a57634e487b7160e01b600052601260045260246000fd5b500490565b600060018201613691576136916135fe565b5060010190565b80820180821115610888576108886135fe565b600082516136bd818460208701613477565b9190910192915050565b6000602082840312156136d957600080fd5b81518015158114612a5457600080fd5b6040815260006136fc604083018561349b565b828103602084015261370e818561349b565b95945050505050565b60006020828403121561372957600080fd5b815167ffffffffffffffff8082111561374157600080fd5b818401915084601f83011261375557600080fd5b815181811115613767576137676131c4565b61377a601f8201601f19166020016131da565b915080825285602082850101111561379157600080fd5b611591816020840160208601613477565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137da816017850160208801613477565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613817816028840160208801613477565b01602801949350505050565b600081613832576138326135fe565b50600019019056fea26469706673582212208cdfdf032f27d9856f75851cf4779b5a1274ef5c1f8607fbb75e8438f0e4c90b64736f6c63430008110033339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab9500000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000cf00c1ac6d26d52054ec89be6e093f2e270d61d9000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7000000000000000000000000000000000000000000000000000000000000001700000000000000000000000001e5c45cb25e30860c2fb80369a9c27628911a2b0000000000000000000000008250d72009ac305cd17779e743cddb171015109b000000000000000000000000f14fabe507c9cc6d1b632ec2033072484409fc4800000000000000000000000017cfb52939b7a0643e5730b8751d166ff8f42d9800000000000000000000000078ca6ab867664cae279fbf0c1099f743d200d5c5000000000000000000000000dc6ef3c9eea7f096d222fc7571a79bfe62d01fba000000000000000000000000ab051074eb3540e56636ab18a6d6fc86d4735fb60000000000000000000000000c2b27d3c27fac1612da22346dc2fda8a3402fcc0000000000000000000000003f1af4d92c91511a0bce4b21bc256bf63bcab4700000000000000000000000009236d32e51166e2c9c58be168692010a1c2deda90000000000000000000000005a6f10104f784f84c07dcdc530d7e138bb40a2f8000000000000000000000000ea5f7189aa3fd51894673f77f3d5f6990061838c000000000000000000000000e12642369c11511eb2f54a1eee070065833b038b00000000000000000000000020907c4153779828f8693b730c4cbb41aef0d637000000000000000000000000a43eb75d382d1a1fe262b1bc26ac74b8c311278e00000000000000000000000042fcb219aa63daa2d40a72b4de0d8a2694c356100000000000000000000000003eea1f1ffca00c69ba5a99e362d9a7d4e3902b3c000000000000000000000000a64c5c58fc1510de3ff2ee644e030d666b660ea600000000000000000000000030f0a52fc894653766afd4976dddc1ad8dc3961200000000000000000000000070f0ac4cbac1b078ac3c1c63cb18f1595d5d81aa000000000000000000000000c54dae0e22a6564e2a4d467116dfb6343ad364cd000000000000000000000000eed1840d37ecd54e31caa0529fa9c1ba15baa4710000000000000000000000005c4d23fd18fc4128f77426f42237acfce618d0b10000000000000000000000000000000000000000000000000000000000000009000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000049d5c2bdffac6ce2bfdb6640f4f80f226bc10bab000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d00000000000000000000000050b7545627a5162f82a992c33b87adc75187b218000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d700000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
Deployed Bytecode
0x6080604052600436106102885760003560e01c80638980f11f11610153578063c3accd48116100cb578063dede7f151161007f578063f2fde38b11610064578063f2fde38b146107be578063f8742254146107de578063fe38c5e61461081257600080fd5b8063dede7f151461077e578063f03503821461079e57600080fd5b8063d547741f116100b0578063d547741f14610726578063d73792a914610746578063d8baf7cf1461075e57600080fd5b8063c3accd48146106e6578063c8a3a5c61461070657600080fd5b8063952e901211610122578063a217fddf11610107578063a217fddf14610647578063a3f4df7e1461065c578063b381cf40146106b257600080fd5b8063952e901214610612578063a0cf0aea1461063257600080fd5b80638980f11f1461052e5780638bb9c5bf1461054e57806391d148541461056e57806392f5d88a146105b257600080fd5b80634c09cf4e1161020157806375d19947116101b557806376ebe69c1161019a57806376ebe69c146104e45780637c7a561b146104f9578063809356aa1461050e57600080fd5b806375d19947146104ae57806376c7a3c7146104ce57600080fd5b806352a52ab0116101e657806352a52ab01461044e5780636b453c1f1461046e5780636bf2df861461048e57600080fd5b80634c09cf4e1461040e5780634ebb79161461042e57600080fd5b8063248a9ca31161025857806331ac99201161023d57806331ac9920146103ae57806336568abe146103ce5780633a9a4081146103ee57600080fd5b8063248a9ca3146103505780632f2ff15d1461038e57600080fd5b8062b99e361461029457806301ffc9a7146102d1578063061b15e7146103015780631e189dc21461032e57600080fd5b3661028f57005b600080fd5b3480156102a057600080fd5b506002546102b4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102dd57600080fd5b506102f16102ec366004612f5f565b610825565b60405190151581526020016102c8565b34801561030d57600080fd5b5061032161031c366004612fa5565b61088e565b6040516102c89190613037565b34801561033a57600080fd5b5061034e6103493660046130fa565b610997565b005b34801561035c57600080fd5b5061038061036b36600461317f565b60009081526020819052604090206001015490565b6040519081526020016102c8565b34801561039a57600080fd5b5061034e6103a9366004613198565b610a71565b3480156103ba57600080fd5b5061034e6103c936600461317f565b610a9b565b3480156103da57600080fd5b5061034e6103e9366004613198565b610b2b565b3480156103fa57600080fd5b5061034e61040936600461320b565b610bbc565b34801561041a57600080fd5b506103216104293660046132ac565b610c55565b34801561043a57600080fd5b5061034e61044936600461317f565b610d43565b34801561045a57600080fd5b506102b461046936600461317f565b610e1a565b34801561047a57600080fd5b5061034e6104893660046132f0565b610e44565b34801561049a57600080fd5b5061034e6104a936600461330b565b610e71565b3480156104ba57600080fd5b5061034e6104c93660046130fa565b610e83565b3480156104da57600080fd5b5061038060015481565b3480156104f057600080fd5b50600354610380565b34801561050557600080fd5b50600454610380565b34801561051a57600080fd5b50610380610529366004613362565b610f54565b34801561053a57600080fd5b5061034e6105493660046133af565b611000565b34801561055a57600080fd5b5061034e61056936600461317f565b6110cb565b34801561057a57600080fd5b506102f1610589366004613198565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156105be57600080fd5b506105d26105cd3660046133d9565b6110d6565b6040805182516001600160a01b039081168252602080850151821690830152838301511691810191909152606091820151918101919091526080016102c8565b34801561061e57600080fd5b506102b461062d36600461317f565b61126e565b34801561063e57600080fd5b506102b4600081565b34801561065357600080fd5b50610380600081565b34801561066857600080fd5b506106a56040518060400160405280600681526020017f526f75746572000000000000000000000000000000000000000000000000000081525081565b6040516102c891906134c7565b3480156106be57600080fd5b506102b47f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b3480156106f257600080fd5b5061034e6107013660046132f0565b61127e565b34801561071257600080fd5b5061034e61072136600461320b565b611343565b34801561073257600080fd5b5061034e610741366004613198565b6113dc565b34801561075257600080fd5b506103806305f5e10081565b34801561076a57600080fd5b5061034e6107793660046132f0565b611401565b34801561078a57600080fd5b506105d26107993660046134da565b61142b565b3480156107aa57600080fd5b5061034e6107b936600461330b565b61159a565b3480156107ca57600080fd5b5061034e6107d93660046132f0565b61165b565b3480156107ea57600080fd5b506103807f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab9581565b61034e61082036600461330b565b611672565b60006001600160e01b031982167f7965db0b00000000000000000000000000000000000000000000000000000000148061088857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6108b96040518060800160405280606081526020016060815260200160608152602001600081525090565b821580156108c75750600483115b156108e5576040516302eccda760e11b815260040160405180910390fd5b6109106040518060800160405280606081526020016060815260200160608152602001600081525090565b610919876118a2565b8152610924866118a2565b6040820152600083610937576000610941565b61094184876118cc565b9050610951888888888686611961565b9150816020015151600003610982576040805160208082018352600080835291855282519081018352908152908301525b61098b82611cb3565b98975050505050505050565b6109a46040880188613516565b60008181106109b5576109b5613567565b90506020020160208101906109ca91906132f0565b6001600160a01b031663d505accf3360405160e083901b6001600160e01b03191681526001600160a01b039091166004820152306024820152893560448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610a4557600080fd5b505af1158015610a59573d6000803e3d6000fd5b50505050610a6887878761159a565b50505050505050565b600082815260208190526040902060010154610a8c81611d2e565b610a968383611d38565b505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610aea57604051639b96b05160e01b815260040160405180910390fd5b60015460408051918252602082018390527f4bb8a6184424e4bb853a4836042f5a726e4e710873989bfc6abdab19966f5b70910160405180910390a1600155565b6001600160a01b0381163314610bae5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610bb88282611dd6565b5050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610c0b57604051639b96b05160e01b815260040160405180910390fd5b7febf7325f48e05e5e38809c69f8b02a7c907ed31d8768e6c2d841b1296a9225fe81604051610c3a919061357d565b60405180910390a18051610bb8906004906020840190612ed8565b610c806040518060800160405280606081526020016060815260200160608152602001600081525090565b81158015610c8e5750600482115b15610cac576040516302eccda760e11b815260040160405180910390fd5b610cd76040518060800160405280606081526020016060815260200160608152602001600081525090565b610ce0866118a2565b8152610ceb856118a2565b6040820152610cff86868686856000611961565b9050806020015151600003610d30576040805160208082018352600080835291845282519081018352908152908201525b610d3981611cb3565b9695505050505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff16610d9257604051639b96b05160e01b815260040160405180910390fd5b80600003610db35760405163157474a960e31b815260040160405180910390fd5b604051339082156108fc029083906000818181858888f19350505050158015610de0573d6000803e3d6000fd5b506040518181526000907f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa289060200160405180910390a250565b60038181548110610e2a57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e6e7f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab9582610a71565b50565b610e7d83338484611e55565b50505050565b610e906040880188613516565b6000818110610ea157610ea1613567565b9050602002016020810190610eb691906132f0565b6001600160a01b031663d505accf3360405160e083901b6001600160e01b03191681526001600160a01b039091166004820152306024820152893560448201526064810187905260ff8616608482015260a4810185905260c4810184905260e401600060405180830381600087803b158015610f3157600080fd5b505af1158015610f45573d6000803e3d6000fd5b50505050610a68878787610e71565b60008060048360ff1681548110610f6d57610f6d613567565b60009182526020822001546040516377ccc49d60e11b8152600481018990526001600160a01b03888116602483015287811660448301529091169250829063ef99893a90606401602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906135ca565b979650505050505050565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff1661104f57604051639b96b05160e01b815260040160405180910390fd5b806000036110705760405163157474a960e31b815260040160405180910390fd5b6110846001600160a01b0383163383612522565b816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28826040516110bf91815260200190565b60405180910390a25050565b33610bb88282610b2b565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260005b60ff8116841115611263576000600486868460ff1681811061114557611145613567565b905060200201602081019061115a91906135e3565b60ff168154811061116d5761116d613567565b60009182526020822001546040516377ccc49d60e11b8152600481018c90526001600160a01b038b811660248301528a811660448301529091169250829063ef99893a90606401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906135ca565b905060ff8316158061120a5750836060015181115b1561124e576040518060800160405280836001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b031681526020018281525093505b5050808061125b90613614565b915050611121565b509695505050505050565b60048181548110610e2a57600080fd5b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff166112cd57604051639b96b05160e01b815260040160405180910390fd5b600254604080516001600160a01b03928316815291831660208301527fb2c853ac4d80d18d058c43d8018d077a036e542a79acae1647f5ad2a8c76f4e2910160405180910390a16002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3360009081527fa54247010af6b3693b80aceddfad12e077c5de3571e6243fada502635f0d7d39602052604090205460ff1661139257604051639b96b05160e01b815260040160405180910390fd5b7f658ff1688002926d8f426cb10c052ec29003f50042df9652d8613484c1a58647816040516113c1919061357d565b60405180910390a18051610bb8906003906020840190612ed8565b6000828152602081905260409020600101546113f781611d2e565b610a968383611dd6565b610e6e7f339759585899103d2ace64958e37e18ccb0504652c81d4a1b8aa80fe2126ab95826113dc565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260005b60045460ff8216101561159157600060048260ff168154811061149b5761149b613567565b60009182526020822001546040516377ccc49d60e11b8152600481018a90526001600160a01b03898116602483015288811660448301529091169250829063ef99893a90606401602060405180830381865afa1580156114ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152391906135ca565b905060ff831615806115385750836060015181115b1561157c576040518060800160405280836001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018281525093505b5050808061158990613614565b915050611476565b50949350505050565b6001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7166115d16040850185613516565b60016115e06040880188613516565b6115eb929150613633565b8181106115fa576115fa613567565b905060200201602081019061160f91906132f0565b6001600160a01b031614611636576040516320db826760e01b815260040160405180910390fd5b600061164484333085611e55565b905061164f8161256b565b610e7d60008285612601565b33611667600083610a71565b610bb8600082610b2b565b6001600160a01b037f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7166116a96040850185613516565b60008181106116ba576116ba613567565b90506020020160208101906116cf91906132f0565b6001600160a01b0316146116f6576040516320db826760e01b815260040160405180910390fd5b6117008335612669565b610e7d83308484611e55565b80158061179f57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179d91906135ca565b155b6118115760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610ba5565b6040516001600160a01b038316602482015260448101829052610a969084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b0319909316929092179091526126e0565b60408051602080825281830190925260609160208201818036833750505060208101929092525090565b600080611904670de0b6b3a76400007f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7856002610c55565b905080604001515160001461195a5780518051633b9aca0091869161192b90600190613633565b8151811061193b5761193b613567565b602002602001015161194d9190613646565b611957919061365d565b91505b5092915050565b61198c6040518060800160405280606081526020016060815260200160608152602001600081525090565b60006119978461281c565b9050600080841515816119ab8c8c8c61142b565b90508060600151600014611a49578115611a285780600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2591906135ca565b92505b611a41858260600151836000015184604001518761287f565b806060015193505b600189118015611a745750611a5f60028a613633565b6020896020015151611a71919061365d565b11155b15611ca35760005b600354811015611ca15760038181548110611a9957611a99613567565b6000918252602090912001546001600160a01b038d8116911614611c8f576000611aeb8e8e60038581548110611ad157611ad1613567565b6000918252602090912001546001600160a01b031661142b565b90508060600151600003611aff5750611c8f565b6000611b0a8b61281c565b90508415611b7b5781600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7891906135ca565b95505b611b94818360600151846000015185604001518a61287f565b611bcd826060015160038581548110611baf57611baf613567565b6000918252602090912001546001600160a01b03168f8f858f611961565b90506000611be48260400151518360400151612a48565b82518051919250600091611bf791612a48565b9050816001600160a01b03168f6001600160a01b0316148015611c1957508881115b15611c8a57896060015183606001511115611c83576000633b9aca008b606001518560600151611c499190613633565b611c53908f613646565b611c5d919061365d565b90506000611c6b8b84613633565b905080821115611c8057505050505050611c8f565b50505b8098508299505b505050505b80611c998161367f565b915050611a7c565b505b50929a9950505050505050505050565b611cde6040518060800160405280606081526020016060815260200160608152602001600081525090565b6040518060800160405280611cf68460000151612a5b565b8152602001611d088460200151612b17565b8152602001611d1a8460400151612b17565b815260200183606001518152509050919050565b610e6e8133612bc7565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610bb8576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055611d923390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610bb8576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080611e656040870187613516565b905067ffffffffffffffff811115611e7f57611e7f6131c4565b604051908082528060200260200182016040528015611ea8578160200160208202803683370190505b5090506000831180611ebc57506000600154115b15611f7857611ecc863584612c45565b81600081518110611edf57611edf613567565b602002602001018181525050611f7385600260009054906101000a90046001600160a01b031683600081518110611f1857611f18613567565b60200260200101518960000135611f2f9190613633565b611f3c60408b018b613516565b6000818110611f4d57611f4d613567565b9050602002016020810190611f6291906132f0565b6001600160a01b0316929190612ca6565b611f9d565b856000013581600081518110611f9057611f90613567565b6020026020010181815250505b611fff85611fae6060890189613516565b6000818110611fbf57611fbf613567565b9050602002016020810190611fd491906132f0565b83600081518110611fe757611fe7613567565b6020026020010151898060400190611f3c9190613516565b60005b61200f6060880188613516565b9050811015612192576120256060880188613516565b8281811061203557612035613567565b905060200201602081019061204a91906132f0565b6001600160a01b031663ef99893a83838151811061206a5761206a613567565b60200260200101518980604001906120829190613516565b8581811061209257612092613567565b90506020020160208101906120a791906132f0565b6120b460408c018c613516565b6120bf876001613698565b8181106120ce576120ce613567565b90506020020160208101906120e391906132f0565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039182166024840152166044820152606401602060405180830381865afa158015612135573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215991906135ca565b82612165836001613698565b8151811061217557612175613567565b60209081029190910101528061218a8161367f565b915050612002565b50856020013581600183516121a79190613633565b815181106121b7576121b7613567565b602002602001015110156121f7576040517f98f7360900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b6122076060880188613516565b90508110156123f3576000600161222160608a018a613516565b61222c929150613633565b82106122385785612274565b6122456060890189613516565b612250846001613698565b81811061225f5761225f613567565b905060200201602081019061227491906132f0565b90506122836060890189613516565b8381811061229357612293613567565b90506020020160208101906122a891906132f0565b6001600160a01b031663eab90da68484815181106122c8576122c8613567565b6020026020010151858560016122de9190613698565b815181106122ee576122ee613567565b60200260200101518b80604001906123069190613516565b8781811061231657612316613567565b905060200201602081019061232b91906132f0565b61233860408e018e613516565b612343896001613698565b81811061235257612352613567565b905060200201602081019061236791906132f0565b6040516001600160e01b031960e087901b168152600481019490945260248401929092526001600160a01b03908116604484015290811660648301528416608482015260a401600060405180830381600087803b1580156123c757600080fd5b505af11580156123db573d6000803e3d6000fd5b505050505080806123eb9061367f565b9150506121fa565b506124016040870187613516565b600161241060408a018a613516565b61241b929150613633565b81811061242a5761242a613567565b905060200201602081019061243f91906132f0565b6001600160a01b03166124556040880188613516565b600081811061246657612466613567565b905060200201602081019061247b91906132f0565b6001600160a01b03167f8ebfcbab08c4fcc415917cb87b61039d8751c71a197b386af8ab3c6a9185669c886000013584600186516124b99190613633565b815181106124c9576124c9613567565b60200260200101516040516124e8929190918252602082015260400190565b60405180910390a380600182516124ff9190613633565b8151811061250f5761250f613567565b6020026020010151915050949350505050565b6040516001600160a01b038316602482015260448101829052610a969084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611856565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156125e657600080fd5b505af11580156125fa573d6000803e3d6000fd5b5050505050565b306001600160a01b03821614610a96576001600160a01b038316612655576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b610a966001600160a01b0384168284612522565b7f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156126c457600080fd5b505af11580156126d8573d6000803e3d6000fd5b505050505050565b600080836001600160a01b0316836040516126fb91906136ab565b6000604051808303816000865af19150503d8060008114612738576040519150601f19603f3d011682016040523d82523d6000602084013e61273d565b606091505b50915091508161278f5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610ba5565b805115610e7d57808060200190518101906127aa91906136c7565b610e7d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ba5565b6128476040518060800160405280606081526020016060815260200160608152602001600081525090565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b7326b794235422e7c6f3ac6c717b10598c2a144203632f9680f586604001516128a7856118a2565b6040518363ffffffff1660e01b81526004016128c49291906136e9565b600060405180830381865af41580156128e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129099190810190613717565b604086015284517326b794235422e7c6f3ac6c717b10598c2a14420390632f9680f590612935876118a2565b6040518363ffffffff1660e01b81526004016129529291906136e9565b600060405180830381865af415801561296f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129979190810190613717565b855260208501517326b794235422e7c6f3ac6c717b10598c2a14420390632f9680f5906129c3866118a2565b6040518363ffffffff1660e01b81526004016129e09291906136e9565b600060405180830381865af41580156129fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a259190810190613717565b6020860152606085018051829190612a3e908390613698565b9052505050505050565b6000612a548383015190565b9392505050565b6060600060208351612a6d919061365d565b905060008167ffffffffffffffff811115612a8a57612a8a6131c4565b604051908082528060200260200182016040528015612ab3578160200160208202803683370190505b50905060005b82811015612b0f57612ae0612acf826020613646565b612ada906020613698565b86612a48565b828281518110612af257612af2613567565b602090810291909101015280612b078161367f565b915050612ab9565b509392505050565b6060600060208351612b29919061365d565b905060008167ffffffffffffffff811115612b4657612b466131c4565b604051908082528060200260200182016040528015612b6f578160200160208202803683370190505b50905060005b82811015612b0f57612b8b612acf826020613646565b828281518110612b9d57612b9d613567565b6001600160a01b039092166020928302919091019091015280612bbf8161367f565b915050612b75565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610bb857612c03816001600160a01b03166014612cf7565b612c0e836020612cf7565b604051602001612c1f9291906137a2565b60408051601f198184030181529082905262461bcd60e51b8252610ba5916004016134c7565b6000600154821015612c83576040517f58d620b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6305f5e100612c928382613633565b612c9c9085613646565b612a54919061365d565b6040516001600160a01b0380851660248301528316604482015260648101829052610e7d9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611856565b60606000612d06836002613646565b612d11906002613698565b67ffffffffffffffff811115612d2957612d296131c4565b6040519080825280601f01601f191660200182016040528015612d53576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612d8a57612d8a613567565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612dd557612dd5613567565b60200101906001600160f81b031916908160001a9053506000612df9846002613646565b612e04906001613698565b90505b6001811115612e89577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110612e4557612e45613567565b1a60f81b828281518110612e5b57612e5b613567565b60200101906001600160f81b031916908160001a90535060049490941c93612e8281613823565b9050612e07565b508315612a545760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610ba5565b828054828255906000526020600020908101928215612f3a579160200282015b82811115612f3a578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190612ef8565b50612f46929150612f4a565b5090565b5b80821115612f465760008155600101612f4b565b600060208284031215612f7157600080fd5b81356001600160e01b031981168114612a5457600080fd5b80356001600160a01b0381168114612fa057600080fd5b919050565b600080600080600060a08688031215612fbd57600080fd5b85359450612fcd60208701612f89565b9350612fdb60408701612f89565b94979396509394606081013594506080013592915050565b600081518084526020808501945080840160005b8381101561302c5781516001600160a01b031687529582019590820190600101613007565b509495945050505050565b60208082528251608083830152805160a0840181905260009291820190839060c08601905b8083101561307c578351825292840192600192909201919084019061305c565b50838701519350601f1992508286820301604087015261309c8185612ff3565b935050506040850151818584030160608601526130b98382612ff3565b92505050606084015160808401528091505092915050565b6000608082840312156130e357600080fd5b50919050565b803560ff81168114612fa057600080fd5b600080600080600080600060e0888a03121561311557600080fd5b873567ffffffffffffffff81111561312c57600080fd5b6131388a828b016130d1565b97505061314760208901612f89565b95506040880135945060608801359350613163608089016130e9565b925060a0880135915060c0880135905092959891949750929550565b60006020828403121561319157600080fd5b5035919050565b600080604083850312156131ab57600080fd5b823591506131bb60208401612f89565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613203576132036131c4565b604052919050565b6000602080838503121561321e57600080fd5b823567ffffffffffffffff8082111561323657600080fd5b818501915085601f83011261324a57600080fd5b81358181111561325c5761325c6131c4565b8060051b915061326d8483016131da565b818152918301840191848101908884111561328757600080fd5b938501935b8385101561098b5761329d85612f89565b8252938501939085019061328c565b600080600080608085870312156132c257600080fd5b843593506132d260208601612f89565b92506132e060408601612f89565b9396929550929360600135925050565b60006020828403121561330257600080fd5b612a5482612f89565b60008060006060848603121561332057600080fd5b833567ffffffffffffffff81111561333757600080fd5b613343868287016130d1565b93505061335260208501612f89565b9150604084013590509250925092565b6000806000806080858703121561337857600080fd5b8435935061338860208601612f89565b925061339660408601612f89565b91506133a4606086016130e9565b905092959194509250565b600080604083850312156133c257600080fd5b6133cb83612f89565b946020939093013593505050565b6000806000806000608086880312156133f157600080fd5b8535945061340160208701612f89565b935061340f60408701612f89565b9250606086013567ffffffffffffffff8082111561342c57600080fd5b818801915088601f83011261344057600080fd5b81358181111561344f57600080fd5b8960208260051b850101111561346457600080fd5b9699959850939650602001949392505050565b60005b8381101561349257818101518382015260200161347a565b50506000910152565b600081518084526134b3816020860160208601613477565b601f01601f19169290920160200192915050565b602081526000612a54602083018461349b565b6000806000606084860312156134ef57600080fd5b833592506134ff60208501612f89565b915061350d60408501612f89565b90509250925092565b6000808335601e1984360301811261352d57600080fd5b83018035915067ffffffffffffffff82111561354857600080fd5b6020019150600581901b360382131561356057600080fd5b9250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156135be5783516001600160a01b031683529284019291840191600101613599565b50909695505050505050565b6000602082840312156135dc57600080fd5b5051919050565b6000602082840312156135f557600080fd5b612a54826130e9565b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff810361362a5761362a6135fe565b60010192915050565b81810381811115610888576108886135fe565b8082028115828204841417610888576108886135fe565b60008261367a57634e487b7160e01b600052601260045260246000fd5b500490565b600060018201613691576136916135fe565b5060010190565b80820180821115610888576108886135fe565b600082516136bd818460208701613477565b9190910192915050565b6000602082840312156136d957600080fd5b81518015158114612a5457600080fd5b6040815260006136fc604083018561349b565b828103602084015261370e818561349b565b95945050505050565b60006020828403121561372957600080fd5b815167ffffffffffffffff8082111561374157600080fd5b818401915084601f83011261375557600080fd5b815181811115613767576137676131c4565b61377a601f8201601f19166020016131da565b915080825285602082850101111561379157600080fd5b611591816020840160208601613477565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516137da816017850160208801613477565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351613817816028840160208801613477565b01602801949350505050565b600081613832576138326135fe565b50600019019056fea26469706673582212208cdfdf032f27d9856f75851cf4779b5a1274ef5c1f8607fbb75e8438f0e4c90b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000cf00c1ac6d26d52054ec89be6e093f2e270d61d9000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7000000000000000000000000000000000000000000000000000000000000001700000000000000000000000001e5c45cb25e30860c2fb80369a9c27628911a2b0000000000000000000000008250d72009ac305cd17779e743cddb171015109b000000000000000000000000f14fabe507c9cc6d1b632ec2033072484409fc4800000000000000000000000017cfb52939b7a0643e5730b8751d166ff8f42d9800000000000000000000000078ca6ab867664cae279fbf0c1099f743d200d5c5000000000000000000000000dc6ef3c9eea7f096d222fc7571a79bfe62d01fba000000000000000000000000ab051074eb3540e56636ab18a6d6fc86d4735fb60000000000000000000000000c2b27d3c27fac1612da22346dc2fda8a3402fcc0000000000000000000000003f1af4d92c91511a0bce4b21bc256bf63bcab4700000000000000000000000009236d32e51166e2c9c58be168692010a1c2deda90000000000000000000000005a6f10104f784f84c07dcdc530d7e138bb40a2f8000000000000000000000000ea5f7189aa3fd51894673f77f3d5f6990061838c000000000000000000000000e12642369c11511eb2f54a1eee070065833b038b00000000000000000000000020907c4153779828f8693b730c4cbb41aef0d637000000000000000000000000a43eb75d382d1a1fe262b1bc26ac74b8c311278e00000000000000000000000042fcb219aa63daa2d40a72b4de0d8a2694c356100000000000000000000000003eea1f1ffca00c69ba5a99e362d9a7d4e3902b3c000000000000000000000000a64c5c58fc1510de3ff2ee644e030d666b660ea600000000000000000000000030f0a52fc894653766afd4976dddc1ad8dc3961200000000000000000000000070f0ac4cbac1b078ac3c1c63cb18f1595d5d81aa000000000000000000000000c54dae0e22a6564e2a4d467116dfb6343ad364cd000000000000000000000000eed1840d37ecd54e31caa0529fa9c1ba15baa4710000000000000000000000005c4d23fd18fc4128f77426f42237acfce618d0b10000000000000000000000000000000000000000000000000000000000000009000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000049d5c2bdffac6ce2bfdb6640f4f80f226bc10bab000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d00000000000000000000000050b7545627a5162f82a992c33b87adc75187b218000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d700000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
-----Decoded View---------------
Arg [0] : _adapters (address[]): 0x01e5C45cB25E30860c2Fb80369A9C27628911a2b,0x8250D72009Ac305cd17779E743CDDb171015109b,0xf14FaBE507c9Cc6d1b632ec2033072484409fC48,0x17CFb52939b7A0643E5730B8751d166FF8f42D98,0x78cA6aB867664caE279fBF0c1099f743D200D5C5,0xdC6EF3C9eEa7F096D222fc7571a79bFE62D01FbA,0xAb051074eb3540E56636Ab18a6d6FC86d4735FB6,0x0c2B27d3c27fAc1612da22346dC2FDA8A3402FCC,0x3F1aF4D92c91511A0BCe4B21bc256bF63bcab470,0x9236d32E51166E2c9c58BE168692010A1C2DeDa9,0x5a6F10104f784f84C07DCdc530d7E138Bb40a2F8,0xea5f7189Aa3FD51894673f77f3D5f6990061838C,0xe12642369C11511EB2f54a1eEe070065833b038B,0x20907c4153779828F8693b730C4CbB41aEF0d637,0xa43Eb75d382D1a1fE262b1bc26ac74b8c311278E,0x42fCb219AA63DAa2d40A72B4De0D8A2694C35610,0x3EeA1f1fFCA00c69bA5a99E362D9A7d4e3902B3c,0xA64C5c58fc1510De3Ff2Ee644E030d666B660Ea6,0x30F0a52fC894653766AFd4976ddDC1aD8dc39612,0x70f0AC4CbAc1B078ac3c1c63cb18f1595d5D81aA,0xc54daE0e22a6564E2a4d467116DFb6343ad364cD,0xeeD1840d37eCD54e31CAA0529fa9c1ba15BAa471,0x5C4d23fd18Fc4128f77426F42237acFcE618D0b1
Arg [1] : _trustedTokens (address[]): 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7,0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB,0xc7198437980c041c805A1EDcbA50c1Ce5db95118,0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E,0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664,0x130966628846BFd36ff31a822705796e8cb8C18D,0x50b7545627a5162F82A992c33b87aDc75187B218,0xd586E7F844cEa2F87f50152665BCbc2C279D8d70,0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7
Arg [2] : _feeClaimer (address): 0xCf00c1ac6D26d52054ec89bE6e093F2E270D61d9
Arg [3] : _wrapped_native (address): 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7
-----Encoded View---------------
38 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [2] : 000000000000000000000000cf00c1ac6d26d52054ec89be6e093f2e270d61d9
Arg [3] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [5] : 00000000000000000000000001e5c45cb25e30860c2fb80369a9c27628911a2b
Arg [6] : 0000000000000000000000008250d72009ac305cd17779e743cddb171015109b
Arg [7] : 000000000000000000000000f14fabe507c9cc6d1b632ec2033072484409fc48
Arg [8] : 00000000000000000000000017cfb52939b7a0643e5730b8751d166ff8f42d98
Arg [9] : 00000000000000000000000078ca6ab867664cae279fbf0c1099f743d200d5c5
Arg [10] : 000000000000000000000000dc6ef3c9eea7f096d222fc7571a79bfe62d01fba
Arg [11] : 000000000000000000000000ab051074eb3540e56636ab18a6d6fc86d4735fb6
Arg [12] : 0000000000000000000000000c2b27d3c27fac1612da22346dc2fda8a3402fcc
Arg [13] : 0000000000000000000000003f1af4d92c91511a0bce4b21bc256bf63bcab470
Arg [14] : 0000000000000000000000009236d32e51166e2c9c58be168692010a1c2deda9
Arg [15] : 0000000000000000000000005a6f10104f784f84c07dcdc530d7e138bb40a2f8
Arg [16] : 000000000000000000000000ea5f7189aa3fd51894673f77f3d5f6990061838c
Arg [17] : 000000000000000000000000e12642369c11511eb2f54a1eee070065833b038b
Arg [18] : 00000000000000000000000020907c4153779828f8693b730c4cbb41aef0d637
Arg [19] : 000000000000000000000000a43eb75d382d1a1fe262b1bc26ac74b8c311278e
Arg [20] : 00000000000000000000000042fcb219aa63daa2d40a72b4de0d8a2694c35610
Arg [21] : 0000000000000000000000003eea1f1ffca00c69ba5a99e362d9a7d4e3902b3c
Arg [22] : 000000000000000000000000a64c5c58fc1510de3ff2ee644e030d666b660ea6
Arg [23] : 00000000000000000000000030f0a52fc894653766afd4976dddc1ad8dc39612
Arg [24] : 00000000000000000000000070f0ac4cbac1b078ac3c1c63cb18f1595d5d81aa
Arg [25] : 000000000000000000000000c54dae0e22a6564e2a4d467116dfb6343ad364cd
Arg [26] : 000000000000000000000000eed1840d37ecd54e31caa0529fa9c1ba15baa471
Arg [27] : 0000000000000000000000005c4d23fd18fc4128f77426f42237acfce618d0b1
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [29] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [30] : 00000000000000000000000049d5c2bdffac6ce2bfdb6640f4f80f226bc10bab
Arg [31] : 000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118
Arg [32] : 000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [33] : 000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664
Arg [34] : 000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d
Arg [35] : 00000000000000000000000050b7545627a5162f82a992c33b87adc75187b218
Arg [36] : 000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70
Arg [37] : 0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.222386 | 0.4113 | $0.091465 |
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.