Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 17969605 | 454 days ago | IN | 0 ETH | 0.02724073 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OneInchWrapper
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-22 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.10; contract MainnetAuthAddresses { address internal constant ADMIN_VAULT_ADDR = 0xCCf3d848e08b94478Ed8f46fFead3008faF581fD; address internal constant FACTORY_ADDRESS = 0x5a15566417e6C1c9546523066500bDDBc53F88C7; address internal constant ADMIN_ADDR = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9; // USED IN ADMIN VAULT CONSTRUCTOR } contract AuthHelper is MainnetAuthAddresses { } contract AdminVault is AuthHelper { address public owner; address public admin; error SenderNotAdmin(); constructor() { owner = msg.sender; admin = ADMIN_ADDR; } /// @notice Admin is able to change owner /// @param _owner Address of new owner function changeOwner(address _owner) public { if (admin != msg.sender){ revert SenderNotAdmin(); } owner = _owner; } /// @notice Admin is able to set new admin /// @param _admin Address of multisig that becomes new admin function changeAdmin(address _admin) public { if (admin != msg.sender){ revert SenderNotAdmin(); } admin = _admin; } } interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint256 digits); function totalSupply() external view returns (uint256 supply); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } library Address { //insufficient balance error InsufficientBalance(uint256 available, uint256 required); //unable to send value, recipient may have reverted error SendingValueFail(); //insufficient balance for call error InsufficientBalanceForCall(uint256 available, uint256 required); //call to non-contract error NonContractCall(); function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { uint256 balance = address(this).balance; if (balance < amount){ revert InsufficientBalance(balance, amount); } // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); if (!(success)){ revert SendingValueFail(); } } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { uint256 balance = address(this).balance; if (balance < value){ revert InsufficientBalanceForCall(balance, value); } return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { if (!(isContract(target))){ revert NonContractCall(); } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library SafeERC20 { using SafeMath for uint256; using Address for address; 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) ); } /// @dev Edited so it always first approves 0 and then the value, because of non standard tokens function safeApprove( IERC20 token, address spender, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall( data, "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"); } } } contract AdminAuth is AuthHelper { using SafeERC20 for IERC20; AdminVault public constant adminVault = AdminVault(ADMIN_VAULT_ADDR); error SenderNotOwner(); error SenderNotAdmin(); modifier onlyOwner() { if (adminVault.owner() != msg.sender){ revert SenderNotOwner(); } _; } modifier onlyAdmin() { if (adminVault.admin() != msg.sender){ revert SenderNotAdmin(); } _; } /// @notice withdraw stuck funds function withdrawStuckFunds(address _token, address _receiver, uint256 _amount) public onlyOwner { if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) { payable(_receiver).transfer(_amount); } else { IERC20(_token).safeTransfer(_receiver, _amount); } } /// @notice Destroy the contract function kill() public onlyAdmin { selfdestruct(payable(msg.sender)); } } contract Discount { address public owner; mapping(address => CustomServiceFee) public serviceFees; uint256 constant MAX_SERVICE_FEE = 400; error OnlyOwner(); error WrongFeeValue(); struct CustomServiceFee { bool active; uint256 amount; } constructor() { owner = msg.sender; } function isCustomFeeSet(address _user) public view returns (bool) { return serviceFees[_user].active; } function getCustomServiceFee(address _user) public view returns (uint256) { return serviceFees[_user].amount; } function setServiceFee(address _user, uint256 _fee) public { if (msg.sender != owner){ revert OnlyOwner(); } if (!(_fee >= MAX_SERVICE_FEE || _fee == 0)){ revert WrongFeeValue(); } serviceFees[_user] = CustomServiceFee({active: true, amount: _fee}); } function disableServiceFee(address _user) public { if (msg.sender != owner){ revert OnlyOwner(); } serviceFees[_user] = CustomServiceFee({active: false, amount: 0}); } } abstract contract IWETH { function allowance(address, address) public virtual view returns (uint256); function balanceOf(address) public virtual view returns (uint256); function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual returns (bool); function transferFrom( address, address, uint256 ) public virtual returns (bool); function deposit() public payable virtual; function withdraw(uint256) public virtual; } library TokenUtils { using SafeERC20 for IERC20; address public constant WSTETH_ADDR = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0; address public constant STETH_ADDR = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84; address public constant WETH_ADDR = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant ETH_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function approveToken( address _tokenAddr, address _to, uint256 _amount ) internal { if (_tokenAddr == ETH_ADDR) return; if (IERC20(_tokenAddr).allowance(address(this), _to) < _amount) { IERC20(_tokenAddr).safeApprove(_to, _amount); } } function pullTokensIfNeeded( address _token, address _from, uint256 _amount ) internal returns (uint256) { // handle max uint amount if (_amount == type(uint256).max) { _amount = getBalance(_token, _from); } if (_from != address(0) && _from != address(this) && _token != ETH_ADDR && _amount != 0) { IERC20(_token).safeTransferFrom(_from, address(this), _amount); } return _amount; } function withdrawTokens( address _token, address _to, uint256 _amount ) internal returns (uint256) { if (_amount == type(uint256).max) { _amount = getBalance(_token, address(this)); } if (_to != address(0) && _to != address(this) && _amount != 0) { if (_token != ETH_ADDR) { IERC20(_token).safeTransfer(_to, _amount); } else { (bool success, ) = _to.call{value: _amount}(""); require(success, "Eth send fail"); } } return _amount; } function depositWeth(uint256 _amount) internal { IWETH(WETH_ADDR).deposit{value: _amount}(); } function withdrawWeth(uint256 _amount) internal { IWETH(WETH_ADDR).withdraw(_amount); } function getBalance(address _tokenAddr, address _acc) internal view returns (uint256) { if (_tokenAddr == ETH_ADDR) { return _acc.balance; } else { return IERC20(_tokenAddr).balanceOf(_acc); } } function getTokenDecimals(address _token) internal view returns (uint256) { if (_token == ETH_ADDR) return 18; return IERC20(_token).decimals(); } } contract DFSExchangeHelper { using TokenUtils for address; error InvalidOffchainData(); error OutOfRangeSlicingError(); using SafeERC20 for IERC20; function sendLeftover( address _srcAddr, address _destAddr, address payable _to ) internal { // clean out any eth leftover TokenUtils.ETH_ADDR.withdrawTokens(_to, type(uint256).max); _srcAddr.withdrawTokens(_to, type(uint256).max); _destAddr.withdrawTokens(_to, type(uint256).max); } function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) { if (bs.length < start + 32){ revert OutOfRangeSlicingError(); } uint256 x; assembly { x := mload(add(bs, add(0x20, start))) } return x; } function writeUint256( bytes memory _b, uint256 _index, uint256 _input ) internal pure { if (_b.length < _index + 32) { revert InvalidOffchainData(); } bytes32 input = bytes32(_input); _index += 32; // Read the bytes32 from array memory assembly { mstore(add(_b, _index), input) } } } contract DSMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x + y; } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x - y; } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x * y; } function div(uint256 x, uint256 y) internal pure returns (uint256 z) { return x / y; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { return x <= y ? x : y; } function max(uint256 x, uint256 y) internal pure returns (uint256 z) { return x >= y ? x : y; } function imin(int256 x, int256 y) internal pure returns (int256 z) { return x <= y ? x : y; } function imax(int256 x, int256 y) internal pure returns (int256 z) { return x >= y ? x : y; } uint256 constant WAD = 10**18; uint256 constant RAY = 10**27; function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), WAD / 2) / WAD; } function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), RAY / 2) / RAY; } function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, WAD), y / 2) / y; } function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, RAY), y / 2) / y; } // This famous algorithm is called "exponentiation by squaring" // and calculates x^n with x as fixed-point and n as regular unsigned. // // It's O(log n), instead of O(n) for naive repeated multiplication. // // These facts are why it works: // // If n is even, then x^n = (x^2)^(n/2). // If n is odd, then x^n = x * x^(n-1), // and applying the equation for even x gives // x^n = x * (x^2)^((n-1) / 2). // // Also, EVM division is flooring and // floor[(n-1) / 2] = floor[n / 2]. // function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) { z = n % 2 != 0 ? x : RAY; for (n /= 2; n != 0; n /= 2) { x = rmul(x, x); if (n % 2 != 0) { z = rmul(z, x); } } } } contract DFSExchangeData { // first is empty to keep the legacy order in place // EMPTY was _, but in >0.8.x using underscore as name is forbidden enum ExchangeType { EMPTY, OASIS, KYBER, UNISWAP, ZEROX } enum ExchangeActionType { SELL, BUY } struct OffchainData { address wrapper; address exchangeAddr; address allowanceTarget; uint256 price; uint256 protocolFee; bytes callData; } struct ExchangeData { address srcAddr; address destAddr; uint256 srcAmount; uint256 destAmount; uint256 minPrice; uint256 dfsFeeDivider; // service fee divider address user; // user to check special fee address wrapper; bytes wrapperData; OffchainData offchainData; } function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) { return abi.encode(_exData); } function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) { _exData = abi.decode(_data, (ExchangeData)); } } abstract contract IOffchainWrapper is DFSExchangeData { function takeOrder( ExchangeData memory _exData, ExchangeActionType _type ) virtual public payable returns (bool success, uint256); } contract OneInchWrapper is IOffchainWrapper, DFSExchangeHelper, AdminAuth, DSMath { using TokenUtils for address; using SafeERC20 for IERC20; //Not enough funds error InsufficientFunds(uint256 available, uint256 required); //Order success but amount 0 error ZeroTokensSwapped(); /// @notice offchainData.callData should be this struct encoded struct OneInchCalldata{ bytes realCalldata; uint256[] offsets; } /// @notice Takes order from 1inch and returns bool indicating if it is successful /// @param _exData Exchange data /// @param _type Action type (buy or sell) function takeOrder( ExchangeData memory _exData, ExchangeActionType _type ) override public payable returns (bool success, uint256) { // check that contract have enough balance for exchange uint256 tokenBalance = _exData.srcAddr.getBalance(address(this)); if (tokenBalance < _exData.srcAmount){ revert InsufficientFunds(tokenBalance, _exData.srcAmount); } OneInchCalldata memory oneInchCalldata = abi.decode(_exData.offchainData.callData, (OneInchCalldata)); // write in the exact amount we are selling/buying in an order if (_type == ExchangeActionType.SELL) { for (uint256 i; i < oneInchCalldata.offsets.length; i++){ writeUint256(oneInchCalldata.realCalldata, oneInchCalldata.offsets[i], _exData.srcAmount); } } else { uint srcAmount = wdiv(_exData.destAmount, _exData.offchainData.price) + 1; // + 1 so we round up for (uint256 i; i < oneInchCalldata.offsets.length; i++){ writeUint256(oneInchCalldata.realCalldata, oneInchCalldata.offsets[i], srcAmount); } } IERC20(_exData.srcAddr).safeApprove(_exData.offchainData.allowanceTarget, _exData.srcAmount); uint256 tokensBefore = _exData.destAddr.getBalance(address(this)); /// @dev the amount of tokens received is checked in DFSExchangeCore /// @dev Exchange wrapper contracts should not be used on their own (success, ) = _exData.offchainData.exchangeAddr.call(oneInchCalldata.realCalldata); uint256 tokensSwapped = 0; if (success) { // get the current balance of the swapped tokens tokensSwapped = _exData.destAddr.getBalance(address(this)) - tokensBefore; if (tokensSwapped == 0){ revert ZeroTokensSwapped(); } } // returns all funds from src addr, dest addr sendLeftover(_exData.srcAddr, _exData.destAddr, payable(msg.sender)); return (success, tokensSwapped); } // solhint-disable-next-line no-empty-blocks receive() external virtual payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidOffchainData","type":"error"},{"inputs":[],"name":"NonContractCall","type":"error"},{"inputs":[],"name":"OutOfRangeSlicingError","type":"error"},{"inputs":[],"name":"SenderNotAdmin","type":"error"},{"inputs":[],"name":"SenderNotOwner","type":"error"},{"inputs":[],"name":"ZeroTokensSwapped","type":"error"},{"inputs":[],"name":"adminVault","outputs":[{"internalType":"contract AdminVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"name":"packExchangeData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"},{"internalType":"enum DFSExchangeData.ExchangeActionType","name":"_type","type":"uint8"}],"name":"takeOrder","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"unpackExchangeData","outputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50611acf806100206000396000f3fe6080604052600436106100695760003560e01c80638cedca71116100435780638cedca71146100ec578063a3b8e5d114610139578063c579d4901461016657600080fd5b806308d4f52a1461007557806341c0e1b5146100ab5780634b9cb508146100c257600080fd5b3661007057005b600080fd5b34801561008157600080fd5b50610095610090366004611302565b610186565b6040516100a291906113ad565b60405180910390f35b3480156100b757600080fd5b506100c06101af565b005b6100d56100d03660046113c0565b610299565b6040805192151583526020830191909152016100a2565b3480156100f857600080fd5b5061011473ccf3d848e08b94478ed8f46ffead3008faf581fd81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a2565b34801561014557600080fd5b50610159610154366004611416565b610597565b6040516100a291906114ae565b34801561017257600080fd5b506100c06101813660046115dc565b6105b9565b60608160405160200161019991906114ae565b6040516020818303038152906040529050919050565b3373ffffffffffffffffffffffffffffffffffffffff1673ccf3d848e08b94478ed8f46ffead3008faf581fd73ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102499190611628565b73ffffffffffffffffffffffffffffffffffffffff1614610296576040517fa6c827a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33ff5b8151600090819081906102c29073ffffffffffffffffffffffffffffffffffffffff1630610741565b9050846040015181101561031c578085604001516040517f03eb8b54000000000000000000000000000000000000000000000000000000008152600401610313929190918252602082015260400190565b60405180910390fd5b600085610120015160a0015180602001905181019061033b919061168a565b9050600085600181111561035157610351611782565b14156103af5760005b8160200151518110156103a957610397826000015183602001518381518110610385576103856117b1565b6020026020010151896040015161082a565b806103a18161180f565b91505061035a565b50610426565b60006103c8876060015188610120015160600151610887565b6103d390600161182a565b905060005b82602001515181101561042357610411836000015184602001518381518110610403576104036117b1565b60200260200101518461082a565b8061041b8161180f565b9150506103d8565b50505b610462866101200151604001518760400151886000015173ffffffffffffffffffffffffffffffffffffffff166108b99092919063ffffffff16565b602086015160009061048a9073ffffffffffffffffffffffffffffffffffffffff1630610741565b90508661012001516020015173ffffffffffffffffffffffffffffffffffffffff1682600001516040516104be9190611842565b6000604051808303816000865af19150503d80600081146104fb576040519150601f19603f3d011682016040523d82523d6000602084013e610500565b606091505b5050809550506000851561057857602088015182906105359073ffffffffffffffffffffffffffffffffffffffff1630610741565b61053f919061185e565b905080610578576040517f6a756fbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61058b88600001518960200151336109e3565b93505050509250929050565b61059f610ea8565b818060200190518101906105b39190611900565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff1673ccf3d848e08b94478ed8f46ffead3008faf581fd73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106539190611628565b73ffffffffffffffffffffffffffffffffffffffff16146106a0576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8416141561071b5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610715573d6000803e3d6000fd5b50505050565b61073c73ffffffffffffffffffffffffffffffffffffffff84168383610a4c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610793575073ffffffffffffffffffffffffffffffffffffffff8116316105b3565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906370a0823190602401602060405180830381865afa1580156107ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108239190611a04565b9392505050565b61083582602061182a565b8351101561086f576040517ff340347200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061087b60208461182a565b93909301929092525050565b6000816108af61089f85670de0b6b3a7640000610aa2565b6108aa600286611a1d565b610aae565b6108239190611a1d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526000604482015261098d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610aba565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073c9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161090b565b610a0473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82600019610bc6565b50610a2873ffffffffffffffffffffffffffffffffffffffff841682600019610bc6565b5061071573ffffffffffffffffffffffffffffffffffffffff831682600019610bc6565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073c9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161090b565b60006108238284611a58565b6000610823828461182a565b6000610b1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d549092919063ffffffff16565b80519091501561073c5780806020019051810190610b3a9190611a77565b61073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610313565b6000600019821415610bdf57610bdc8430610741565b91505b73ffffffffffffffffffffffffffffffffffffffff831615801590610c1a575073ffffffffffffffffffffffffffffffffffffffff83163014155b8015610c2557508115155b15610d4d5773ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c8157610c7c73ffffffffffffffffffffffffffffffffffffffff85168484610a4c565b610d4d565b60008373ffffffffffffffffffffffffffffffffffffffff168360405160006040518083038185875af1925050503d8060008114610cdb576040519150601f19603f3d011682016040523d82523d6000602084013e610ce0565b606091505b5050905080610d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4574682073656e64206661696c000000000000000000000000000000000000006044820152606401610313565b505b5092915050565b6060610d638484600085610d6b565b949350505050565b6060610d7685610e6f565b610dac576040517f304619b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dd59190611842565b60006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b50915091508115610e2b579150610d639050565b805115610e3b5780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031391906113ad565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d63575050151592915050565b604051806101400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001610fc66040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561101d5761101d610fcb565b60405290565b604051610140810167ffffffffffffffff8111828210171561101d5761101d610fcb565b6040805190810167ffffffffffffffff8111828210171561101d5761101d610fcb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110b1576110b1610fcb565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146110db57600080fd5b50565b80356110e9816110b9565b919050565b600067ffffffffffffffff82111561110857611108610fcb565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261114557600080fd5b8135611158611153826110ee565b61106a565b81815284602083860101111561116d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561119c57600080fd5b6111a4610ffa565b905081356111b1816110b9565b815260208201356111c1816110b9565b602082015260408201356111d4816110b9565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff81111561120957600080fd5b61121584828501611134565b60a08301525092915050565b6000610140828403121561123457600080fd5b61123c611023565b9050611247826110de565b8152611255602083016110de565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015261128e60c083016110de565b60c082015261129f60e083016110de565b60e08201526101008083013567ffffffffffffffff808211156112c157600080fd5b6112cd86838701611134565b838501526101209250828501359150808211156112e957600080fd5b506112f68582860161118a565b82840152505092915050565b60006020828403121561131457600080fd5b813567ffffffffffffffff81111561132b57600080fd5b610d6384828501611221565b60005b8381101561135257818101518382015260200161133a565b838111156107155750506000910152565b6000815180845261137b816020860160208601611337565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006108236020830184611363565b600080604083850312156113d357600080fd5b823567ffffffffffffffff8111156113ea57600080fd5b6113f685828601611221565b92505060208301356002811061140b57600080fd5b809150509250929050565b60006020828403121561142857600080fd5b813567ffffffffffffffff81111561143f57600080fd5b610d6384828501611134565b600073ffffffffffffffffffffffffffffffffffffffff80835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610d6360c0850182611363565b602081526114d560208201835173ffffffffffffffffffffffffffffffffffffffff169052565b600060208301516114fe604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015161154e60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516101006115788185018373ffffffffffffffffffffffffffffffffffffffff169052565b808501519150506101406101208181860152611598610160860184611363565b908601518582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001838701529092506115d2838261144b565b9695505050505050565b6000806000606084860312156115f157600080fd5b83356115fc816110b9565b9250602084013561160c816110b9565b929592945050506040919091013590565b80516110e9816110b9565b60006020828403121561163a57600080fd5b8151610823816110b9565b600082601f83011261165657600080fd5b8151611664611153826110ee565b81815284602083860101111561167957600080fd5b610d63826020830160208701611337565b6000602080838503121561169d57600080fd5b825167ffffffffffffffff808211156116b557600080fd5b90840190604082870312156116c957600080fd5b6116d1611047565b8251828111156116e057600080fd5b6116ec88828601611645565b825250838301518281111561170057600080fd5b80840193505086601f84011261171557600080fd5b82518281111561172757611727610fcb565b8060051b925061173885840161106a565b818152928401850192858101908985111561175257600080fd5b948601945b8486101561177057855182529486019490860190611757565b95830195909552509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019821415611823576118236117e0565b5060010190565b6000821982111561183d5761183d6117e0565b500190565b60008251611854818460208701611337565b9190910192915050565b600082821015611870576118706117e0565b500390565b600060c0828403121561188757600080fd5b61188f610ffa565b9050815161189c816110b9565b815260208201516118ac816110b9565b602082015260408201516118bf816110b9565b80604083015250606082015160608201526080820151608082015260a082015167ffffffffffffffff8111156118f457600080fd5b61121584828501611645565b60006020828403121561191257600080fd5b815167ffffffffffffffff8082111561192a57600080fd5b90830190610140828603121561193f57600080fd5b611947611023565b6119508361161d565b815261195e6020840161161d565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261199760c0840161161d565b60c08201526119a860e0840161161d565b60e082015261010080840151838111156119c157600080fd5b6119cd88828701611645565b82840152505061012080840151838111156119e757600080fd5b6119f388828701611875565b918301919091525095945050505050565b600060208284031215611a1657600080fd5b5051919050565b600082611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000816000190483118215151615611a7257611a726117e0565b500290565b600060208284031215611a8957600080fd5b8151801515811461082357600080fdfea2646970667358221220d36249024182f1d6b7ac47f681d8b588855103da8ffb42e3ca012245b4b3f26f64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106100695760003560e01c80638cedca71116100435780638cedca71146100ec578063a3b8e5d114610139578063c579d4901461016657600080fd5b806308d4f52a1461007557806341c0e1b5146100ab5780634b9cb508146100c257600080fd5b3661007057005b600080fd5b34801561008157600080fd5b50610095610090366004611302565b610186565b6040516100a291906113ad565b60405180910390f35b3480156100b757600080fd5b506100c06101af565b005b6100d56100d03660046113c0565b610299565b6040805192151583526020830191909152016100a2565b3480156100f857600080fd5b5061011473ccf3d848e08b94478ed8f46ffead3008faf581fd81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a2565b34801561014557600080fd5b50610159610154366004611416565b610597565b6040516100a291906114ae565b34801561017257600080fd5b506100c06101813660046115dc565b6105b9565b60608160405160200161019991906114ae565b6040516020818303038152906040529050919050565b3373ffffffffffffffffffffffffffffffffffffffff1673ccf3d848e08b94478ed8f46ffead3008faf581fd73ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102499190611628565b73ffffffffffffffffffffffffffffffffffffffff1614610296576040517fa6c827a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33ff5b8151600090819081906102c29073ffffffffffffffffffffffffffffffffffffffff1630610741565b9050846040015181101561031c578085604001516040517f03eb8b54000000000000000000000000000000000000000000000000000000008152600401610313929190918252602082015260400190565b60405180910390fd5b600085610120015160a0015180602001905181019061033b919061168a565b9050600085600181111561035157610351611782565b14156103af5760005b8160200151518110156103a957610397826000015183602001518381518110610385576103856117b1565b6020026020010151896040015161082a565b806103a18161180f565b91505061035a565b50610426565b60006103c8876060015188610120015160600151610887565b6103d390600161182a565b905060005b82602001515181101561042357610411836000015184602001518381518110610403576104036117b1565b60200260200101518461082a565b8061041b8161180f565b9150506103d8565b50505b610462866101200151604001518760400151886000015173ffffffffffffffffffffffffffffffffffffffff166108b99092919063ffffffff16565b602086015160009061048a9073ffffffffffffffffffffffffffffffffffffffff1630610741565b90508661012001516020015173ffffffffffffffffffffffffffffffffffffffff1682600001516040516104be9190611842565b6000604051808303816000865af19150503d80600081146104fb576040519150601f19603f3d011682016040523d82523d6000602084013e610500565b606091505b5050809550506000851561057857602088015182906105359073ffffffffffffffffffffffffffffffffffffffff1630610741565b61053f919061185e565b905080610578576040517f6a756fbe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61058b88600001518960200151336109e3565b93505050509250929050565b61059f610ea8565b818060200190518101906105b39190611900565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff1673ccf3d848e08b94478ed8f46ffead3008faf581fd73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106539190611628565b73ffffffffffffffffffffffffffffffffffffffff16146106a0576040517f19494c8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8416141561071b5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610715573d6000803e3d6000fd5b50505050565b61073c73ffffffffffffffffffffffffffffffffffffffff84168383610a4c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610793575073ffffffffffffffffffffffffffffffffffffffff8116316105b3565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906370a0823190602401602060405180830381865afa1580156107ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108239190611a04565b9392505050565b61083582602061182a565b8351101561086f576040517ff340347200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061087b60208461182a565b93909301929092525050565b6000816108af61089f85670de0b6b3a7640000610aa2565b6108aa600286611a1d565b610aae565b6108239190611a1d565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526000604482015261098d9084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610aba565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073c9084907f095ea7b3000000000000000000000000000000000000000000000000000000009060640161090b565b610a0473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee82600019610bc6565b50610a2873ffffffffffffffffffffffffffffffffffffffff841682600019610bc6565b5061071573ffffffffffffffffffffffffffffffffffffffff831682600019610bc6565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261073c9084907fa9059cbb000000000000000000000000000000000000000000000000000000009060640161090b565b60006108238284611a58565b6000610823828461182a565b6000610b1c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610d549092919063ffffffff16565b80519091501561073c5780806020019051810190610b3a9190611a77565b61073c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610313565b6000600019821415610bdf57610bdc8430610741565b91505b73ffffffffffffffffffffffffffffffffffffffff831615801590610c1a575073ffffffffffffffffffffffffffffffffffffffff83163014155b8015610c2557508115155b15610d4d5773ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c8157610c7c73ffffffffffffffffffffffffffffffffffffffff85168484610a4c565b610d4d565b60008373ffffffffffffffffffffffffffffffffffffffff168360405160006040518083038185875af1925050503d8060008114610cdb576040519150601f19603f3d011682016040523d82523d6000602084013e610ce0565b606091505b5050905080610d4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4574682073656e64206661696c000000000000000000000000000000000000006044820152606401610313565b505b5092915050565b6060610d638484600085610d6b565b949350505050565b6060610d7685610e6f565b610dac576040517f304619b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dd59190611842565b60006040518083038185875af1925050503d8060008114610e12576040519150601f19603f3d011682016040523d82523d6000602084013e610e17565b606091505b50915091508115610e2b579150610d639050565b805115610e3b5780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161031391906113ad565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d63575050151592915050565b604051806101400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001610fc66040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561101d5761101d610fcb565b60405290565b604051610140810167ffffffffffffffff8111828210171561101d5761101d610fcb565b6040805190810167ffffffffffffffff8111828210171561101d5761101d610fcb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156110b1576110b1610fcb565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff811681146110db57600080fd5b50565b80356110e9816110b9565b919050565b600067ffffffffffffffff82111561110857611108610fcb565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261114557600080fd5b8135611158611153826110ee565b61106a565b81815284602083860101111561116d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561119c57600080fd5b6111a4610ffa565b905081356111b1816110b9565b815260208201356111c1816110b9565b602082015260408201356111d4816110b9565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff81111561120957600080fd5b61121584828501611134565b60a08301525092915050565b6000610140828403121561123457600080fd5b61123c611023565b9050611247826110de565b8152611255602083016110de565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015261128e60c083016110de565b60c082015261129f60e083016110de565b60e08201526101008083013567ffffffffffffffff808211156112c157600080fd5b6112cd86838701611134565b838501526101209250828501359150808211156112e957600080fd5b506112f68582860161118a565b82840152505092915050565b60006020828403121561131457600080fd5b813567ffffffffffffffff81111561132b57600080fd5b610d6384828501611221565b60005b8381101561135257818101518382015260200161133a565b838111156107155750506000910152565b6000815180845261137b816020860160208601611337565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006108236020830184611363565b600080604083850312156113d357600080fd5b823567ffffffffffffffff8111156113ea57600080fd5b6113f685828601611221565b92505060208301356002811061140b57600080fd5b809150509250929050565b60006020828403121561142857600080fd5b813567ffffffffffffffff81111561143f57600080fd5b610d6384828501611134565b600073ffffffffffffffffffffffffffffffffffffffff80835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610d6360c0850182611363565b602081526114d560208201835173ffffffffffffffffffffffffffffffffffffffff169052565b600060208301516114fe604084018273ffffffffffffffffffffffffffffffffffffffff169052565b506040830151606083015260608301516080830152608083015160a083015260a083015160c083015260c083015161154e60e084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060e08301516101006115788185018373ffffffffffffffffffffffffffffffffffffffff169052565b808501519150506101406101208181860152611598610160860184611363565b908601518582037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001838701529092506115d2838261144b565b9695505050505050565b6000806000606084860312156115f157600080fd5b83356115fc816110b9565b9250602084013561160c816110b9565b929592945050506040919091013590565b80516110e9816110b9565b60006020828403121561163a57600080fd5b8151610823816110b9565b600082601f83011261165657600080fd5b8151611664611153826110ee565b81815284602083860101111561167957600080fd5b610d63826020830160208701611337565b6000602080838503121561169d57600080fd5b825167ffffffffffffffff808211156116b557600080fd5b90840190604082870312156116c957600080fd5b6116d1611047565b8251828111156116e057600080fd5b6116ec88828601611645565b825250838301518281111561170057600080fd5b80840193505086601f84011261171557600080fd5b82518281111561172757611727610fcb565b8060051b925061173885840161106a565b818152928401850192858101908985111561175257600080fd5b948601945b8486101561177057855182529486019490860190611757565b95830195909552509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000600019821415611823576118236117e0565b5060010190565b6000821982111561183d5761183d6117e0565b500190565b60008251611854818460208701611337565b9190910192915050565b600082821015611870576118706117e0565b500390565b600060c0828403121561188757600080fd5b61188f610ffa565b9050815161189c816110b9565b815260208201516118ac816110b9565b602082015260408201516118bf816110b9565b80604083015250606082015160608201526080820151608082015260a082015167ffffffffffffffff8111156118f457600080fd5b61121584828501611645565b60006020828403121561191257600080fd5b815167ffffffffffffffff8082111561192a57600080fd5b90830190610140828603121561193f57600080fd5b611947611023565b6119508361161d565b815261195e6020840161161d565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261199760c0840161161d565b60c08201526119a860e0840161161d565b60e082015261010080840151838111156119c157600080fd5b6119cd88828701611645565b82840152505061012080840151838111156119e757600080fd5b6119f388828701611875565b918301919091525095945050505050565b600060208284031215611a1657600080fd5b5051919050565b600082611a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000816000190483118215151615611a7257611a726117e0565b500290565b600060208284031215611a8957600080fd5b8151801515811461082357600080fdfea2646970667358221220d36249024182f1d6b7ac47f681d8b588855103da8ffb42e3ca012245b4b3f26f64736f6c634300080a0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.