My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x49321e2a91fd764287d50bc8e2729b043524827b3151d1958bc2a16820ace8ce | Transfer Ownersh... | 15293834 | 481 days 22 hrs ago | 0x8486662eafb15d77d4fa128146f3620c78e5f226 | IN | Axial : Internal Router | 0 AVAX | 0.000763147 | |
0xc43c21bd9b0353bd8ef9d3c8237c778651dcfe01407679ef9de558048c5dbeb9 | Set Adapters | 15293611 | 481 days 22 hrs ago | 0x8486662eafb15d77d4fa128146f3620c78e5f226 | IN | Axial : Internal Router | 0 AVAX | 0.0024698795 | |
0xb43c22a0da64ee2d4e8aa02548b3cba10b0589f0a30e53c695b527d8426353ba | 0x60806040 | 10975414 | 583 days 13 hrs ago | 0x8486662eafb15d77d4fa128146f3620c78e5f226 | IN | Create: AxialRouter | 0 AVAX | 0.793422225 |
[ Download CSV Export ]
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:
AxialRouter
Compiler Version
v0.7.6+commit.7338295f
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.7.0; pragma experimental ABIEncoderV2; import "./lib/BytesManipulation.sol"; import "./interface/IAdapter.sol"; import "./interface/IERC20.sol"; import "./interface/IWETH.sol"; import "./lib/SafeMath.sol"; import "./lib/SafeERC20.sol"; import "./lib/Ownable.sol"; contract AxialRouter is Ownable { using SafeERC20 for IERC20; using SafeMath for uint; address public constant WAVAX = 0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7; address public constant AVAX = address(0); string public constant NAME = 'AxialRouter'; uint public constant FEE_DENOMINATOR = 1e4; address public FEE_CLAIMER; address[] public TRUSTED_TOKENS; address[] public ADAPTERS; event Recovered( address indexed _asset, uint amount ); event UpdatedTrustedTokens( address[] _newTrustedTokens ); event UpdatedAdapters( address[] _newAdapters ); event UpdatedMinFee( uint _oldMinFee, uint _newMinFee ); event UpdatedFeeClaimer( address _oldFeeClaimer, address _newFeeClaimer ); event AxialSwap( address indexed _tokenIn, address indexed _tokenOut, uint _amountIn, uint _amountOut ); struct Query { address adapter; address tokenIn; address tokenOut; uint256 amountOut; } struct OfferWithGas { bytes amounts; bytes adapters; bytes path; uint gasEstimate; } struct Offer { bytes amounts; bytes adapters; bytes path; } struct FormattedOfferWithGas { uint[] amounts; address[] adapters; address[] path; uint gasEstimate; } struct FormattedOffer { uint[] amounts; address[] adapters; address[] path; } struct Trade { uint amountIn; uint amountOut; address[] path; address[] adapters; } constructor( address[] memory _adapters, address[] memory _trustedTokens, address _feeClaimer ) { setTrustedTokens(_trustedTokens); setFeeClaimer(_feeClaimer); setAdapters(_adapters); _setAllowances(); } // -- SETTERS -- function _setAllowances() internal { IERC20(WAVAX).safeApprove(WAVAX, type(uint).max); } function setTrustedTokens(address[] memory _trustedTokens) public onlyOwner { emit UpdatedTrustedTokens(_trustedTokens); TRUSTED_TOKENS = _trustedTokens; } function setAdapters(address[] memory _adapters) public onlyOwner { emit UpdatedAdapters(_adapters); ADAPTERS = _adapters; } function setFeeClaimer(address _claimer) public onlyOwner { emit UpdatedFeeClaimer(FEE_CLAIMER, _claimer); FEE_CLAIMER = _claimer; } // -- GENERAL -- function trustedTokensCount() external view returns (uint) { return TRUSTED_TOKENS.length; } function adaptersCount() external view returns (uint) { return ADAPTERS.length; } function recoverERC20(address _tokenAddress, uint _tokenAmount) external onlyOwner { require(_tokenAmount > 0, 'AxialRouter: Nothing to recover'); IERC20(_tokenAddress).safeTransfer(msg.sender, _tokenAmount); emit Recovered(_tokenAddress, _tokenAmount); } function recoverAVAX(uint _amount) external onlyOwner { require(_amount > 0, 'AxialRouter: Nothing to recover'); payable(msg.sender).transfer(_amount); emit Recovered(address(0), _amount); } function getAdapters() public view returns (address[] memory) { return ADAPTERS; } // Fallback receive() external payable {} // -- HELPERS -- function _applyFee(uint _amountIn, uint _fee) internal pure returns (uint) { require(_fee > 0, 'AxialRouter: Insufficient fee'); return _amountIn.mul(FEE_DENOMINATOR.sub(_fee))/FEE_DENOMINATOR; } function _wrap(uint _amount) internal { IWETH(WAVAX).deposit{value: _amount}(); } function _unwrap(uint _amount) internal { IWETH(WAVAX).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, uint _amount, address _to) internal { if (address(this)!=_to) { if (_token == AVAX) { 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 ); } /** * Makes a deep copy of OfferWithGas struct */ function _cloneOfferWithGas( OfferWithGas memory _queries ) internal pure returns (OfferWithGas memory) { return OfferWithGas( _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 ) 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)); } /** * Appends Query elements to Offer struct */ function _addQueryWithGas( OfferWithGas memory _queries, uint256 _amount, address _adapter, address _tokenOut, uint _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) ); } /** * Formats elements in the Offer object from byte-arrays to integers and addresses */ function _formatOfferWithGas(OfferWithGas memory _queries) internal pure returns (FormattedOfferWithGas memory) { return FormattedOfferWithGas( _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]); uint 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]]; uint 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]; uint 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, uint _maxSteps, uint _gasPrice, uint _tokenOutPrice ) external view returns (FormattedOfferWithGas memory) { require(_maxSteps>0 && _maxSteps<5, 'AxialRouter: Invalid max-steps'); OfferWithGas memory queries; queries.amounts = BytesManipulation.toBytes(_amountIn); queries.path = BytesManipulation.toBytes(_tokenIn); uint tknOutPriceNwei; if(_tokenOutPrice == 0) { // Find the market price between AVAX and token-out and express gas price in token-out currency FormattedOffer memory gasQuery = findBestPath(1e18, WAVAX, _tokenOut, 2); // Avoid low-liquidity price appreciation // Leave result nWei to preserve digits for assets with low decimal places tknOutPriceNwei = gasQuery.amounts[gasQuery.amounts.length-1].mul(_gasPrice/1e9); } else{ tknOutPriceNwei = _tokenOutPrice; } queries = _findBestPathWithGas( _amountIn, _tokenIn, _tokenOut, _maxSteps, queries, tknOutPriceNwei ); // If no paths are found return empty struct if (queries.adapters.length==0) { queries.amounts = ''; queries.path = ''; } return _formatOfferWithGas(queries); } function _findBestPathWithGas( uint256 _amountIn, address _tokenIn, address _tokenOut, uint _maxSteps, OfferWithGas memory _queries, uint _tknOutPriceNwei ) internal view returns (OfferWithGas memory) { OfferWithGas memory bestOption = _cloneOfferWithGas(_queries); uint256 bestAmountOut; // Check if there is a path directly from tokenIn to tokenOut Query memory queryDirect = queryNoSplit(_amountIn, _tokenIn, _tokenOut); if (queryDirect.amountOut!=0) { uint gasEstimate = IAdapter(queryDirect.adapter).swapGasEstimate(); _addQueryWithGas( 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 OfferWithGas memory newOffer = _cloneOfferWithGas(_queries); uint gasEstimate = IAdapter(bestSwap.adapter).swapGasEstimate(); _addQueryWithGas(newOffer, bestSwap.amountOut, bestSwap.adapter, bestSwap.tokenOut, gasEstimate); newOffer = _findBestPathWithGas( bestSwap.amountOut, TRUSTED_TOKENS[i], _tokenOut, _maxSteps, newOffer, _tknOutPriceNwei ); address tokenOut = BytesManipulation.bytesToAddress(newOffer.path.length, newOffer.path); uint256 amountOut = BytesManipulation.bytesToUint256(newOffer.amounts.length, newOffer.amounts); if (_tokenOut == tokenOut && bestOption.gasEstimate == 0 && newOffer.gasEstimate > 0) { return newOffer; } // 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) { uint gasCostDiff = _tknOutPriceNwei.mul(newOffer.gasEstimate-bestOption.gasEstimate) / 1e9; uint priceDiff = amountOut - bestAmountOut; if (gasCostDiff > priceDiff) { continue; } } bestAmountOut = amountOut; bestOption = newOffer; } } } return bestOption; } /** * Return path with best returns between two tokens */ function findBestPath( uint256 _amountIn, address _tokenIn, address _tokenOut, uint _maxSteps ) public view returns (FormattedOffer memory) { require(_maxSteps>0 && _maxSteps<5, 'AxialRouter: Invalid max-steps'); Offer memory queries; queries.amounts = BytesManipulation.toBytes(_amountIn); queries.path = BytesManipulation.toBytes(_tokenIn); queries = _findBestPath(_amountIn, _tokenIn, _tokenOut, _maxSteps, queries); // 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, uint _maxSteps, Offer memory _queries ) internal view returns (Offer memory) { Offer memory bestOption = _cloneOffer(_queries); uint256 bestAmountOut; // First check if there is a path directly from tokenIn to tokenOut Query memory queryDirect = queryNoSplit(_amountIn, _tokenIn, _tokenOut); if (queryDirect.amountOut!=0) { _addQuery(bestOption, queryDirect.amountOut, queryDirect.adapter, queryDirect.tokenOut); 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); _addQuery(newOffer, bestSwap.amountOut, bestSwap.adapter, bestSwap.tokenOut); newOffer = _findBestPath( bestSwap.amountOut, TRUSTED_TOKENS[i], _tokenOut, _maxSteps, newOffer ); // 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) { bestAmountOut = amountOut; bestOption = newOffer; } } } return bestOption; } // -- SWAPPERS -- function _swapNoSplit( Trade calldata _trade, address _from, address _to, uint _fee ) internal returns (uint) { uint[] memory amounts = new uint[](_trade.path.length); if (_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.sub(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 (uint i=0; i<_trade.adapters.length; i++) { amounts[i+1] = IAdapter(_trade.adapters[i]).query( amounts[i], _trade.path[i], _trade.path[i+1] ); } require(amounts[amounts.length-1] >= _trade.amountOut, 'AxialRouter: Insufficient output amount'); 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 AxialSwap( _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, uint _fee ) public { _swapNoSplit(_trade, msg.sender, _to, _fee); } function swapNoSplitFromAVAX( Trade calldata _trade, address _to, uint _fee ) external payable { require(_trade.path[0]==WAVAX, 'AxialRouter: Path needs to begin with WAVAX'); _wrap(_trade.amountIn); _swapNoSplit(_trade, address(this), _to, _fee); } function swapNoSplitToAVAX( Trade calldata _trade, address _to, uint _fee ) public { require(_trade.path[_trade.path.length-1]==WAVAX, 'AxialRouter: Path needs to end with WAVAX'); uint returnAmount = _swapNoSplit(_trade, msg.sender, address(this), _fee); _unwrap(returnAmount); _returnTokensTo(AVAX, returnAmount, _to); } /** * Swap token to token without the need to approve the first token */ function swapNoSplitWithPermit( Trade calldata _trade, address _to, uint _fee, uint _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { IERC20(_trade.path[0]).permit( msg.sender, 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, uint _fee, uint _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { IERC20(_trade.path[0]).permit( msg.sender, address(this), _trade.amountIn, _deadline, _v, _r, _s ); swapNoSplitToAVAX(_trade, _to, _fee); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; 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 uint alen = a.length; uint totallen = alen + b.length; uint loopsa = (a.length + 31) / 32; uint 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(uint _offst, bytes memory _input) internal pure returns (address) { return BytesToTypes.bytesToAddress(_offst, _input); } function bytesToUint256(uint _offst, bytes memory _input) internal pure returns (uint256) { return BytesToTypes.bytesToUint256(_offst, _input); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; interface IAdapter { function name() external view returns (string memory); function swapGasEstimate() external view returns (uint); function swap(uint256, uint256, address, address, address) external; function query(uint256, address, address) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; interface IERC20 { event Approval(address,address,uint); event Transfer(address,address,uint); function name() external view returns (string memory); function decimals() external view returns (uint8); function transferFrom(address,address,uint) external returns (bool); function allowance(address,address) external view returns (uint); function approve(address,uint) external returns (bool); function transfer(address,uint) external returns (bool); function balanceOf(address) external view returns (uint); function nonces(address) external view returns (uint); // 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 (uint); // Only Avalanche bridge tokens }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; import "./IERC20.sol"; interface IWETH is IERC20 { function withdraw(uint256 amount) external; function deposit() external payable; }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'SafeMath: ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'SafeMath: ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'SafeMath: ds-math-mul-overflow'); } }
// This is a simplified version of OpenZepplin's SafeERC20 library // SPDX-License-Identifier: MIT pragma solidity >=0.7.0; pragma experimental ABIEncoderV2; import "../interface/IERC20.sol"; import "./SafeMath.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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 the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: Caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: New owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// From https://github.com/pouladzade/Seriality/blob/master/src/BytesToTypes.sol (Licensed under Apache2.0) // SPDX-License-Identifier: Apache2.0 pragma solidity >=0.7.0; library BytesToTypes { function bytesToAddress(uint _offst, bytes memory _input) internal pure returns (address _output) { assembly { _output := mload(add(_input, _offst)) } } function bytesToUint256(uint _offst, bytes memory _input) internal pure returns (uint256 _output) { assembly { _output := mload(add(_input, _offst)) } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.7.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 GSN 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 payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "contracts/lib/BytesManipulation.sol": { "BytesManipulation": "0xdd892a0b5bcfd435489e31d8e2ec9c9b83f85977" } } }
[{"inputs":[{"internalType":"address[]","name":"_adapters","type":"address[]"},{"internalType":"address[]","name":"_trustedTokens","type":"address[]"},{"internalType":"address","name":"_feeClaimer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"AxialSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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":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":"AVAX","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"WAVAX","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":"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":"struct AxialRouter.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"},{"internalType":"uint256","name":"_tokenOutPrice","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 AxialRouter.FormattedOfferWithGas","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdapters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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 AxialRouter.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 AxialRouter.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":[],"name":"renounceOwnership","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":"address[]","name":"_trustedTokens","type":"address[]"}],"name":"setTrustedTokens","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 AxialRouter.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 AxialRouter.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 AxialRouter.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 AxialRouter.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 AxialRouter.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
60806040523480156200001157600080fd5b5060405162003efa38038062003efa83398101604081905262000034916200065d565b600062000040620000be565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200009582620000c2565b620000a0816200017c565b620000ab836200024f565b620000b562000305565b505050620008b2565b3390565b620000cc620000be565b6001600160a01b0316620000df62000336565b6001600160a01b0316146200012a576040805162461bcd60e51b8152602060048201819052602482015260008051602062003eda833981519152604482015290519081900360640190fd5b7f658ff1688002926d8f426cb10c052ec29003f50042df9652d8613484c1a58647816040516200015b919062000787565b60405180910390a180516200017890600290602084019062000525565b5050565b62000186620000be565b6001600160a01b03166200019962000336565b6001600160a01b031614620001e4576040805162461bcd60e51b8152602060048201819052602482015260008051602062003eda833981519152604482015290519081900360640190fd5b6001546040517fb2c853ac4d80d18d058c43d8018d077a036e542a79acae1647f5ad2a8c76f4e29162000225916001600160a01b0390911690849062000754565b60405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b62000259620000be565b6001600160a01b03166200026c62000336565b6001600160a01b031614620002b7576040805162461bcd60e51b8152602060048201819052602482015260008051602062003eda833981519152604482015290519081900360640190fd5b7febf7325f48e05e5e38809c69f8b02a7c907ed31d8768e6c2d841b1296a9225fe81604051620002e8919062000787565b60405180910390a180516200017890600390602084019062000525565b6200033473b31f66aa3c1e785363f0875a1b74e27b85fd66c78060001962000345602090811b6200141717901c565b565b6000546001600160a01b031690565b801580620003d45750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906200037e903090869060040162000754565b60206040518083038186803b1580156200039757600080fd5b505afa158015620003ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d29190620006ff565b155b620003fc5760405162461bcd60e51b8152600401620003f39062000855565b60405180910390fd5b620004578363095ea7b360e01b84846040516024016200041e9291906200076e565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200045c16565b505050565b600080836001600160a01b03168360405162000479919062000718565b6000604051808303816000865af19150503d8060008114620004b8576040519150601f19603f3d011682016040523d82523d6000602084013e620004bd565b606091505b509150915081620004e25760405162461bcd60e51b8152600401620003f390620007d6565b8051156200051f5780806020019051810190620005009190620006d6565b6200051f5760405162461bcd60e51b8152600401620003f3906200080b565b50505050565b8280548282559060005260206000209081019282156200057d579160200282015b828111156200057d57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000546565b506200058b9291506200058f565b5090565b5b808211156200058b576000815560010162000590565b80516001600160a01b0381168114620005be57600080fd5b919050565b600082601f830112620005d4578081fd5b815160206001600160401b0380831115620005eb57fe5b818302604051838282010181811084821117156200060557fe5b6040528481528381019250868401828801850189101562000624578687fd5b8692505b8583101562000651576200063c81620005a6565b84529284019260019290920191840162000628565b50979650505050505050565b60008060006060848603121562000672578283fd5b83516001600160401b038082111562000689578485fd5b6200069787838801620005c3565b94506020860151915080821115620006ad578384fd5b50620006bc86828701620005c3565b925050620006cd60408501620005a6565b90509250925092565b600060208284031215620006e8578081fd5b81518015158114620006f8578182fd5b9392505050565b60006020828403121562000711578081fd5b5051919050565b60008251815b818110156200073a57602081860181015185830152016200071e565b81811115620007495782828501525b509190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015620007ca5783516001600160a01b031683529284019291840191600101620007a3565b50909695505050505050565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b61361880620008c26000396000f3fe6080604052600436106101ba5760003560e01c80638da5cb5b116100ec578063c3accd481161008a578063dede7f1511610064578063dede7f15146104be578063f0350382146104de578063f2fde38b146104fe578063fe38c5e61461051e576101c1565b8063c3accd4814610469578063c8a3a5c614610489578063d73792a9146104a9576101c1565b8063952e9012116100c6578063952e9012146103f0578063a3f4df7e14610410578063b59f091e14610432578063b82e16e314610447576101c1565b80638da5cb5b146103815780639140940f1461039657806392f5d88a146103c3576101c1565b8063715018a61161015957806376ebe69c1161013357806376ebe69c1461030a5780637c7a561b1461032c578063809356aa146103415780638980f11f14610361576101c1565b8063715018a6146102c057806373b295c2146102d557806375d19947146102ea576101c1565b80634c09cf4e116101955780634c09cf4e146102335780634ebb79161461026057806352a52ab0146102805780636bf2df86146102a0576101c1565b8062b99e36146101c65780631e189dc2146101f15780633a9a408114610213576101c1565b366101c157005b600080fd5b3480156101d257600080fd5b506101db610531565b6040516101e89190613009565b60405180910390f35b3480156101fd57600080fd5b5061021161020c366004612cc9565b610540565b005b34801561021f57600080fd5b5061021161022e366004612b2b565b6105ee565b34801561023f57600080fd5b5061025361024e366004612e4f565b6106b0565b6040516101e89190613423565b34801561026c57600080fd5b5061021161027b366004612d4c565b610760565b34801561028c57600080fd5b506101db61029b366004612d4c565b610867565b3480156102ac57600080fd5b506102116102bb366004612c74565b610891565b3480156102cc57600080fd5b506102116108a3565b3480156102e157600080fd5b506101db61096e565b3480156102f657600080fd5b50610211610305366004612cc9565b610986565b34801561031657600080fd5b5061031f610a2b565b6040516101e891906134ba565b34801561033857600080fd5b5061031f610a31565b34801561034d57600080fd5b5061031f61035c366004612ee9565b610a37565b34801561036d57600080fd5b5061021161037c366004612b02565b610ae4565b34801561038d57600080fd5b506101db610bd1565b3480156103a257600080fd5b506103b66103b1366004612e92565b610be0565b6040516101e891906133b4565b3480156103cf57600080fd5b506103e36103de366004612db7565b610d00565b6040516101e8919061347b565b3480156103fc57600080fd5b506101db61040b366004612d4c565b610e50565b34801561041c57600080fd5b50610425610e60565b6040516101e891906130f6565b34801561043e57600080fd5b506101db610e99565b34801561045357600080fd5b5061045c610e9e565b6040516101e891906130b5565b34801561047557600080fd5b50610211610484366004612ae8565b610f00565b34801561049557600080fd5b506102116104a4366004612b2b565b610fea565b3480156104b557600080fd5b5061031f6110a8565b3480156104ca57600080fd5b506103e36104d9366004612d7c565b6110ae565b3480156104ea57600080fd5b506102116104f9366004612c74565b6111db565b34801561050a57600080fd5b50610211610519366004612ae8565b611278565b61021161052c366004612c74565b611399565b6001546001600160a01b031681565b61054d604088018861351e565b600081811061055857fe5b905060200201602081019061056d9190612ae8565b60405163d505accf60e01b81526001600160a01b03919091169063d505accf906105a890339030908c35908a908a908a908a9060040161301d565b600060405180830381600087803b1580156105c257600080fd5b505af11580156105d6573d6000803e3d6000fd5b505050506105e58787876111db565b50505050505050565b6105f661155c565b6001600160a01b0316610607610bd1565b6001600160a01b031614610662576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7febf7325f48e05e5e38809c69f8b02a7c907ed31d8768e6c2d841b1296a9225fe8160405161069191906130b5565b60405180910390a180516106ac9060039060208401906129b2565b5050565b6106b8612a24565b6000821180156106c85750600582105b6106ed5760405162461bcd60e51b81526004016106e490613320565b60405180910390fd5b6106f5612a24565b6106fe86611560565b815261070985611560565b604082015261071b868686868561158a565b90508060200151516000141561074d576040805160208082018352600080835291845282519081018352908152908201525b6107568161174e565b9695505050505050565b61076861155c565b6001600160a01b0316610779610bd1565b6001600160a01b0316146107d4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600081116107f45760405162461bcd60e51b81526004016106e490613255565b604051339082156108fc029083906000818181858888f19350505050158015610821573d6000803e3d6000fd5b5060006001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288260405161085c91906134ba565b60405180910390a250565b6002818154811061087757600080fd5b6000918252602090912001546001600160a01b0316905081565b61089d8333848461179c565b50505050565b6108ab61155c565b6001600160a01b03166108bc610bd1565b6001600160a01b031614610917576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c781565b610993604088018861351e565b600081811061099e57fe5b90506020020160208101906109b39190612ae8565b60405163d505accf60e01b81526001600160a01b03919091169063d505accf906109ee90339030908c35908a908a908a908a9060040161301d565b600060405180830381600087803b158015610a0857600080fd5b505af1158015610a1c573d6000803e3d6000fd5b505050506105e5878787610891565b60025490565b60035490565b60008060038360ff1681548110610a4a57fe5b60009182526020822001546040516377ccc49d60e11b81526001600160a01b039091169250829063ef99893a90610a89908a908a908a906004016134c3565b60206040518083038186803b158015610aa157600080fd5b505afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad99190612d64565b979650505050505050565b610aec61155c565b6001600160a01b0316610afd610bd1565b6001600160a01b031614610b58576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008111610b785760405162461bcd60e51b81526004016106e490613255565b610b8c6001600160a01b0383163383611d2a565b816001600160a01b03167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2882604051610bc591906134ba565b60405180910390a25050565b6000546001600160a01b031690565b610be8612a45565b600084118015610bf85750600584105b610c145760405162461bcd60e51b81526004016106e490613320565b610c1c612a45565b610c2588611560565b8152610c3087611560565b6040820152600083610ca7576000610c67670de0b6b3a764000073b31f66aa3c1e785363f0875a1b74e27b85fd66c78a60026106b0565b9050610c9f633b9aca00878351805192909104916000198101908110610c8957fe5b6020026020010151611d4990919063ffffffff16565b915050610caa565b50825b610cb8898989898686611dbb565b915081602001515160001415610cea576040805160208082018352600080835291855282519081018352908152908301525b610cf3826120fe565b9998505050505050505050565b610d08612a6d565b610d10612a6d565b60005b60ff8116841115610e45576000600386868460ff16818110610d3157fe5b9050602002016020810190610d469190612f35565b60ff1681548110610d5357fe5b60009182526020822001546040516377ccc49d60e11b81526001600160a01b039091169250829063ef99893a90610d92908d908d908d906004016134c3565b60206040518083038186803b158015610daa57600080fd5b505afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de29190612d64565b905060ff83161580610df75750836060015181115b15610e3b576040518060800160405280836001600160a01b031681526020018a6001600160a01b03168152602001896001600160a01b031681526020018281525093505b5050600101610d13565b509695505050505050565b6003818154811061087757600080fd5b6040518060400160405280600b81526020017f417869616c526f7574657200000000000000000000000000000000000000000081525081565b600081565b60606003805480602002602001604051908101604052809291908181526020018280548015610ef657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ed8575b5050505050905090565b610f0861155c565b6001600160a01b0316610f19610bd1565b6001600160a01b031614610f74576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040517fb2c853ac4d80d18d058c43d8018d077a036e542a79acae1647f5ad2a8c76f4e291610fb3916001600160a01b0390911690849061305e565b60405180910390a16001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b610ff261155c565b6001600160a01b0316611003610bd1565b6001600160a01b03161461105e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b7f658ff1688002926d8f426cb10c052ec29003f50042df9652d8613484c1a586478160405161108d91906130b5565b60405180910390a180516106ac9060029060208401906129b2565b61271081565b6110b6612a6d565b6110be612a6d565b60005b60035460ff821610156111d257600060038260ff16815481106110e057fe5b60009182526020822001546040516377ccc49d60e11b81526001600160a01b039091169250829063ef99893a9061111f908b908b908b906004016134c3565b60206040518083038186803b15801561113757600080fd5b505afa15801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190612d64565b905060ff831615806111845750836060015181115b156111c8576040518060800160405280836001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018281525093505b50506001016110c1565b50949350505050565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c76111fd604085018561351e565b600161120c604088018861351e565b90500381811061121857fe5b905060200201602081019061122d9190612ae8565b6001600160a01b0316146112535760405162461bcd60e51b81526004016106e49061313e565b60006112618433308561179c565b905061126c81612156565b61089d600082856121db565b61128061155c565b6001600160a01b0316611291610bd1565b6001600160a01b0316146112ec576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166113315760405162461bcd60e51b81526004018080602001828103825260268152602001806135bd6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c76113bb604085018561351e565b60008181106113c657fe5b90506020020160208101906113db9190612ae8565b6001600160a01b0316146114015760405162461bcd60e51b81526004016106e4906131f8565b61140b8335612249565b61089d8330848461179c565b8015806114b857506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063dd62ed3e90611466903090869060040161305e565b60206040518083038186803b15801561147e57600080fd5b505afa158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190612d64565b155b6114d45760405162461bcd60e51b81526004016106e490613357565b6115578363095ea7b360e01b84846040516024016114f392919061309c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122b4565b505050565b3390565b60408051602080825281830190925260609160208201818036833750505060208101929092525090565b611592612a24565b600061159d8361236a565b90506000806115ad8989896110ae565b905080606001516000146115db576115d383826060015183600001518460400151612396565b806060015191505b6001861180156115fd5750600286036020866020015151816115f957fe5b0411155b156117415760005b60025481101561173f576002818154811061161c57fe5b6000918252602090912001546001600160a01b038a81169116141561164057611737565b600061166e8b8b6002858154811061165457fe5b6000918252602090912001546001600160a01b03166110ae565b90508060600151600014156116835750611737565b600061168e8861236a565b90506116a881836060015184600001518560400151612396565b6116da8260600151600285815481106116bd57fe5b6000918252602090912001546001600160a01b03168c8c8561158a565b905060006116f18260400151518360400151612577565b8251805191925060009161170491612577565b9050816001600160a01b03168c6001600160a01b031614801561172657508681115b15611732578096508297505b505050505b600101611605565b505b5090979650505050505050565b611756612a24565b604051806060016040528061176e846000015161258a565b81526020016117808460200151612624565b81526020016117928460400151612624565b905290505b919050565b6000806117ac604087018761351e565b905067ffffffffffffffff811180156117c457600080fd5b506040519080825280602002602001820160405280156117ee578160200160208202803683370190505b50905082156118a3576118028635846126c3565b8160008151811061180f57fe5b60200260200101818152505061189e85600160009054906101000a90046001600160a01b03166118608460008151811061184557fe5b60200260200101518a6000013561270a90919063ffffffff16565b61186d60408b018b61351e565b600081811061187857fe5b905060200201602081019061188d9190612ae8565b6001600160a01b0316929190612762565b6118c2565b8560000135816000815181106118b557fe5b6020026020010181815250505b611918856118d3606089018961351e565b60008181106118de57fe5b90506020020160208101906118f39190612ae8565b8360008151811061190057fe5b602002602001015189806040019061186d919061351e565b60005b611928606088018861351e565b9050811015611a6d5761193e606088018861351e565b8281811061194857fe5b905060200201602081019061195d9190612ae8565b6001600160a01b031663ef99893a83838151811061197757fe5b602002602001015189806040019061198f919061351e565b8581811061199957fe5b90506020020160208101906119ae9190612ae8565b6119bb60408c018c61351e565b866001018181106119c857fe5b90506020020160208101906119dd9190612ae8565b6040518463ffffffff1660e01b81526004016119fb939291906134c3565b60206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4b9190612d64565b828260010181518110611a5a57fe5b602090810291909101015260010161191b565b50856020013581600183510381518110611a8357fe5b60200260200101511015611aa95760405162461bcd60e51b81526004016106e49061319b565b60005b611ab9606088018861351e565b9050811015611c365760006001611ad360608a018a61351e565b9050038210611ae25785611b11565b611aef606089018961351e565b83600101818110611afc57fe5b9050602002016020810190611b119190612ae8565b9050611b20606089018961351e565b83818110611b2a57fe5b9050602002016020810190611b3f9190612ae8565b6001600160a01b031663eab90da6848481518110611b5957fe5b6020026020010151858560010181518110611b7057fe5b60200260200101518b8060400190611b88919061351e565b87818110611b9257fe5b9050602002016020810190611ba79190612ae8565b611bb460408e018e61351e565b88600101818110611bc157fe5b9050602002016020810190611bd69190612ae8565b866040518663ffffffff1660e01b8152600401611bf79594939291906134f0565b600060405180830381600087803b158015611c1157600080fd5b505af1158015611c25573d6000803e3d6000fd5b505060019093019250611aac915050565b50611c44604087018761351e565b6001611c5360408a018a61351e565b905003818110611c5f57fe5b9050602002016020810190611c749190612ae8565b6001600160a01b0316611c8a604088018861351e565b6000818110611c9557fe5b9050602002016020810190611caa9190612ae8565b6001600160a01b03167f8d9699a6e7210cdf594a9bc6c673a5e6ec751e57b8cbc8d9461b806d4f193bb9886000013584600186510381518110611ce957fe5b6020026020010151604051611cff9291906134e2565b60405180910390a380600182510381518110611d1757fe5b6020026020010151915050949350505050565b6115578363a9059cbb60e01b84846040516024016114f392919061309c565b6000811580611d6457505080820282828281611d6157fe5b04145b611db5576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a2064732d6d6174682d6d756c2d6f766572666c6f770000604482015290519081900360640190fd5b92915050565b611dc3612a45565b6000611dce84612783565b9050600080611dde8a8a8a6110ae565b90508060600151600014611e8757600081600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2b57600080fd5b505afa158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e639190612d64565b9050611e7e84836060015184600001518560400151856127c3565b81606001519250505b600187118015611ea9575060028703602087602001515181611ea557fe5b0411155b156120f05760005b6002548110156120ee5760028181548110611ec857fe5b6000918252602090912001546001600160a01b038b811691161415611eec576120e6565b6000611f008c8c6002858154811061165457fe5b9050806060015160001415611f1557506120e6565b6000611f2089612783565b9050600082600001516001600160a01b03166369cff80d6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f999190612d64565b9050611fb482846060015185600001518660400151856127c3565b611fe7836060015160028681548110611fc957fe5b6000918252602090912001546001600160a01b03168e8e868e611dbb565b91506000611ffe8360400151518460400151612577565b8351805191925060009161201191612577565b9050816001600160a01b03168e6001600160a01b031614801561203657506060890151155b8015612046575060008460600151115b1561205c57839950505050505050505050610756565b816001600160a01b03168e6001600160a01b031614801561207c57508781115b156120e0578860600151846060015111156120d9576000633b9aca006120b58b606001518760600151038e611d4990919063ffffffff16565b816120bc57fe5b049050888203808211156120d657505050505050506120e6565b50505b8097508398505b50505050505b600101611eb1565b505b509098975050505050505050565b612106612a45565b604051806080016040528061211e846000015161258a565b81526020016121308460200151612624565b81526020016121428460400151612624565b815260200183606001518152509050919050565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273b31f66aa3c1e785363f0875a1b74e27b85fd66c790632e1a7d4d906121a69084906004016134ba565b600060405180830381600087803b1580156121c057600080fd5b505af11580156121d4573d6000803e3d6000fd5b5050505050565b306001600160a01b03821614611557576001600160a01b038316612235576040516001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561222f573d6000803e3d6000fd5b50611557565b6115576001600160a01b0384168284611d2a565b73b31f66aa3c1e785363f0875a1b74e27b85fd66c76001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561229857600080fd5b505af11580156122ac573d6000803e3d6000fd5b505050505050565b600080836001600160a01b0316836040516122cf9190612fed565b6000604051808303816000865af19150503d806000811461230c576040519150601f19603f3d011682016040523d82523d6000602084013e612311565b606091505b5091509150816123335760405162461bcd60e51b81526004016106e490613109565b80511561089d578080602001905181019061234e9190612bd3565b61089d5760405162461bcd60e51b81526004016106e4906132c3565b612372612a24565b50604080516060810182528251815260208084015190820152918101519082015290565b73dd892a0b5bcfd435489e31d8e2ec9c9b83f85977632f9680f585604001516123be84611560565b6040518363ffffffff1660e01b81526004016123db9291906130c8565b60006040518083038186803b1580156123f357600080fd5b505af4158015612407573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261242f9190810190612bf3565b6040850152835173dd892a0b5bcfd435489e31d8e2ec9c9b83f8597790632f9680f59061245b86611560565b6040518363ffffffff1660e01b81526004016124789291906130c8565b60006040518083038186803b15801561249057600080fd5b505af41580156124a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124cc9190810190612bf3565b8452602084015173dd892a0b5bcfd435489e31d8e2ec9c9b83f8597790632f9680f5906124f885611560565b6040518363ffffffff1660e01b81526004016125159291906130c8565b60006040518083038186803b15801561252d57600080fd5b505af4158015612541573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125699190810190612bf3565b846020018190525050505050565b600061258383836129ad565b9392505050565b60606000602083518161259957fe5b04905060008167ffffffffffffffff811180156125b557600080fd5b506040519080825280602002602001820160405280156125df578160200160208202803683370190505b50905060005b8281101561261c576125fd8160200260200186612577565b82828151811061260957fe5b60209081029190910101526001016125e5565b509392505050565b60606000602083518161263357fe5b04905060008167ffffffffffffffff8111801561264f57600080fd5b50604051908082528060200260200182016040528015612679578160200160208202803683370190505b50905060005b8281101561261c576126978160200260200186612577565b8282815181106126a357fe5b6001600160a01b039092166020928302919091019091015260010161267f565b60008082116126e45760405162461bcd60e51b81526004016106e49061328c565b6127106126fb6126f4828561270a565b8590611d49565b8161270257fe5b049392505050565b80820382811115611db5576040805162461bcd60e51b815260206004820152601f60248201527f536166654d6174683a2064732d6d6174682d7375622d756e646572666c6f7700604482015290519081900360640190fd5b61089d846323b872dd60e01b8585856040516024016114f393929190613078565b61278b612a45565b604051806080016040528083600001518152602001836020015181526020018360400151815260200183606001518152509050919050565b73dd892a0b5bcfd435489e31d8e2ec9c9b83f85977632f9680f586604001516127eb85611560565b6040518363ffffffff1660e01b81526004016128089291906130c8565b60006040518083038186803b15801561282057600080fd5b505af4158015612834573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261285c9190810190612bf3565b6040860152845173dd892a0b5bcfd435489e31d8e2ec9c9b83f8597790632f9680f59061288887611560565b6040518363ffffffff1660e01b81526004016128a59291906130c8565b60006040518083038186803b1580156128bd57600080fd5b505af41580156128d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526128f99190810190612bf3565b8552602085015173dd892a0b5bcfd435489e31d8e2ec9c9b83f8597790632f9680f59061292586611560565b6040518363ffffffff1660e01b81526004016129429291906130c8565b60006040518083038186803b15801561295a57600080fd5b505af415801561296e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129969190810190612bf3565b602086015260609094018051909401909352505050565b015190565b828054828255906000526020600020908101928215612a14579160200282015b82811115612a14578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161782556020909201916001909101906129d2565b50612a20929150612a94565b5090565b60405180606001604052806060815260200160608152602001606081525090565b6040518060800160405280606081526020016060815260200160608152602001600081525090565b60408051608081018252600080825260208201819052918101829052606081019190915290565b5b80821115612a205760008155600101612a95565b80356001600160a01b038116811461179757600080fd5b600060808284031215612ad1578081fd5b50919050565b803560ff8116811461179757600080fd5b600060208284031215612af9578081fd5b61258382612aa9565b60008060408385031215612b14578081fd5b612b1d83612aa9565b946020939093013593505050565b60006020808385031215612b3d578182fd5b823567ffffffffffffffff80821115612b54578384fd5b818501915085601f830112612b67578384fd5b813581811115612b7357fe5b8381029150612b8384830161356c565b8181528481019084860184860187018a1015612b9d578788fd5b8795505b83861015612bc657612bb281612aa9565b835260019590950194918601918601612ba1565b5098975050505050505050565b600060208284031215612be4578081fd5b81518015158114612583578182fd5b600060208284031215612c04578081fd5b815167ffffffffffffffff80821115612c1b578283fd5b818401915084601f830112612c2e578283fd5b815181811115612c3a57fe5b612c4d601f8201601f191660200161356c565b9150808252856020828501011115612c63578384fd5b6111d2816020840160208601613590565b600080600060608486031215612c88578081fd5b833567ffffffffffffffff811115612c9e578182fd5b612caa86828701612ac0565b935050612cb960208501612aa9565b9150604084013590509250925092565b600080600080600080600060e0888a031215612ce3578283fd5b873567ffffffffffffffff811115612cf9578384fd5b612d058a828b01612ac0565b975050612d1460208901612aa9565b95506040880135945060608801359350612d3060808901612ad7565b925060a0880135915060c0880135905092959891949750929550565b600060208284031215612d5d578081fd5b5035919050565b600060208284031215612d75578081fd5b5051919050565b600080600060608486031215612d90578283fd5b83359250612da060208501612aa9565b9150612dae60408501612aa9565b90509250925092565b600080600080600060808688031215612dce578081fd5b85359450612dde60208701612aa9565b9350612dec60408701612aa9565b9250606086013567ffffffffffffffff80821115612e08578283fd5b818801915088601f830112612e1b578283fd5b813581811115612e29578384fd5b8960208083028501011115612e3c578384fd5b9699959850939650602001949392505050565b60008060008060808587031215612e64578182fd5b84359350612e7460208601612aa9565b9250612e8260408601612aa9565b9396929550929360600135925050565b60008060008060008060c08789031215612eaa578384fd5b86359550612eba60208801612aa9565b9450612ec860408801612aa9565b9350606087013592506080870135915060a087013590509295509295509295565b60008060008060808587031215612efe578182fd5b84359350612f0e60208601612aa9565b9250612f1c60408601612aa9565b9150612f2a60608601612ad7565b905092959194509250565b600060208284031215612f46578081fd5b61258382612ad7565b6000815180845260208085019450808401835b83811015612f875781516001600160a01b031687529582019590820190600101612f62565b509495945050505050565b6000815180845260208085019450808401835b83811015612f8757815187529582019590820190600101612fa5565b60008151808452612fd9816020860160208601613590565b601f01601f19169290920160200192915050565b60008251612fff818460208701613590565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602082526125836020830184612f4f565b6000604082526130db6040830185612fc1565b82810360208401526130ed8185612fc1565b95945050505050565b6000602082526125836020830184612fc1565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526029908201527f417869616c526f757465723a2050617468206e6565647320746f20656e64207760408201527f6974682057415641580000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f417869616c526f757465723a20496e73756666696369656e74206f757470757460408201527f20616d6f756e7400000000000000000000000000000000000000000000000000606082015260800190565b6020808252602b908201527f417869616c526f757465723a2050617468206e6565647320746f20626567696e60408201527f2077697468205741564158000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f417869616c526f757465723a204e6f7468696e6720746f207265636f76657200604082015260600190565b6020808252601d908201527f417869616c526f757465723a20496e73756666696369656e7420666565000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f417869616c526f757465723a20496e76616c6964206d61782d73746570730000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b6000602082528251608060208401526133d060a0840182612f92565b90506020840151601f19808584030160408601526133ee8383612f4f565b925060408601519150808584030160608601525061340c8282612f4f565b915050606084015160808401528091505092915050565b60006020825282516060602084015261343f6080840182612f92565b90506020840151601f198085840301604086015261345d8383612f4f565b92506040860151915080858403016060860152506130ed8282612f4f565b60006080820190506001600160a01b03808451168352806020850151166020840152806040850151166040840152506060830151606083015292915050565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b918252602082015260400190565b94855260208501939093526001600160a01b0391821660408501528116606084015216608082015260a00190565b6000808335601e19843603018112613534578283fd5b83018035915067ffffffffffffffff82111561354e578283fd5b602090810192508102360382131561356557600080fd5b9250929050565b60405181810167ffffffffffffffff8111828210171561358857fe5b604052919050565b60005b838110156135ab578181015183820152602001613593565b8381111561089d575050600091015256fe4f776e61626c653a204e6577206f776e657220697320746865207a65726f2061646472657373a26469706673582212205e47d30841b6df58dfd4afb934581dd60bdb2b5762cda09cffc6be48c598362864736f6c634300070600334f776e61626c653a2043616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000008486662eafb15d77d4fa128146f3620c78e5f2260000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e12424c3a50f50aed8b7e906703bb1ce93d7edc8000000000000000000000000c362eafaa85728893a0d1084d3e2ff7ffdf2ff8800000000000000000000000055debf770fc61c8dd9de4f4a2d90606f3e906b2e0000000000000000000000005f902030c8aeb8578ac5cc624e243a27b05491c60000000000000000000000005302aedd1b484fbe70efd91ca0c40785f5b4a69d0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da640000000000000000000000004fbf0429599460d327bd5f55625e30e4fc066095000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e0000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000346a59146b9b4a77100d369a3d18e8007a9f46a6
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000008486662eafb15d77d4fa128146f3620c78e5f2260000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e12424c3a50f50aed8b7e906703bb1ce93d7edc8000000000000000000000000c362eafaa85728893a0d1084d3e2ff7ffdf2ff8800000000000000000000000055debf770fc61c8dd9de4f4a2d90606f3e906b2e0000000000000000000000005f902030c8aeb8578ac5cc624e243a27b05491c60000000000000000000000005302aedd1b484fbe70efd91ca0c40785f5b4a69d0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da640000000000000000000000004fbf0429599460d327bd5f55625e30e4fc066095000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e0000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118000000000000000000000000346a59146b9b4a77100d369a3d18e8007a9f46a6
-----Decoded View---------------
Arg [0] : _adapters (address[]): 0xe12424c3a50f50aed8b7e906703bb1ce93d7edc8,0xc362eafaa85728893a0d1084d3e2ff7ffdf2ff88,0x55debf770fc61c8dd9de4f4a2d90606f3e906b2e,0x5f902030c8aeb8578ac5cc624e243a27b05491c6,0x5302aedd1b484fbe70efd91ca0c40785f5b4a69d
Arg [1] : _trustedTokens (address[]): 0xd586e7f844cea2f87f50152665bcbc2c279d8d70,0x130966628846bfd36ff31a822705796e8cb8c18d,0xd24c2ad096400b6fbcd2ad8b24e7acbc21a1da64,0x4fbf0429599460d327bd5f55625e30e4fc066095,0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664,0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e,0x1c20e891bab6b1727d14da358fae2984ed9b59eb,0xc7198437980c041c805a1edcba50c1ce5db95118,0x346a59146b9b4a77100d369a3d18e8007a9f46a6
Arg [2] : _feeClaimer (address): 0x8486662eafb15d77d4fa128146f3620c78e5f226
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000008486662eafb15d77d4fa128146f3620c78e5f226
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 000000000000000000000000e12424c3a50f50aed8b7e906703bb1ce93d7edc8
Arg [5] : 000000000000000000000000c362eafaa85728893a0d1084d3e2ff7ffdf2ff88
Arg [6] : 00000000000000000000000055debf770fc61c8dd9de4f4a2d90606f3e906b2e
Arg [7] : 0000000000000000000000005f902030c8aeb8578ac5cc624e243a27b05491c6
Arg [8] : 0000000000000000000000005302aedd1b484fbe70efd91ca0c40785f5b4a69d
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [10] : 000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70
Arg [11] : 000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d
Arg [12] : 000000000000000000000000d24c2ad096400b6fbcd2ad8b24e7acbc21a1da64
Arg [13] : 0000000000000000000000004fbf0429599460d327bd5f55625e30e4fc066095
Arg [14] : 000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664
Arg [15] : 000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [16] : 0000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb
Arg [17] : 000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118
Arg [18] : 000000000000000000000000346a59146b9b4a77100d369a3d18e8007a9f46a6
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.