My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xa90bacee70326f7f3d3cfe6bfaa1884b15324d092037940e9a6a6948cdd4e31a | 0x60806040 | 10975408 | 596 days 1 hr ago | 0x8486662eafb15d77d4fa128146f3620c78e5f226 | IN | Contract Creation | 0 AVAX | 0.949420125 |
[ 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.
Similar Match Source Code This contract matches the deployed ByteCode of the Source Code for Contract 0x08c28A3670f5821F6B2D763437816b67010f53D4 The constructor portion of the code might be different and could alter the actual behaviour of the contract
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
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.