Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
EthConversionProxy
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './ChainlinkConversionPath.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import './legacy_openzeppelin/contracts/access/roles/WhitelistAdminRole.sol'; /** * @title EthConversionProxy * @notice This contract converts from chainlink then swaps ETH (or native token) * before paying a request thanks to a conversion payment proxy. * The inheritance from ReentrancyGuard is required to perform * "transferExactEthWithReferenceAndFee" on the eth-fee-proxy contract */ contract EthConversionProxy is ReentrancyGuard, WhitelistAdminRole { address public paymentProxy; ChainlinkConversionPath public chainlinkConversionPath; address public nativeTokenHash; constructor( address _paymentProxyAddress, address _chainlinkConversionPathAddress, address _nativeTokenHash, address _owner ) { paymentProxy = _paymentProxyAddress; chainlinkConversionPath = ChainlinkConversionPath(_chainlinkConversionPathAddress); nativeTokenHash = _nativeTokenHash; renounceWhitelistAdmin(); _addWhitelistAdmin(_owner); } // Event to declare a conversion with a reference event TransferWithConversionAndReference( uint256 amount, address currency, bytes indexed paymentReference, uint256 feeAmount, uint256 maxRateTimespan ); // Event to declare a transfer with a reference // This event is emitted by this contract from a delegate call of the payment-proxy event TransferWithReferenceAndFee( address to, uint256 amount, bytes indexed paymentReference, uint256 feeAmount, address feeAddress ); /** * @notice Performs an ETH transfer with a reference computing the payment amount based on the request amount * @param _to Transfer recipient of the payement * @param _requestAmount Request amount * @param _path Conversion path * @param _paymentReference Reference of the payment related * @param _feeAmount The amount of the payment fee * @param _feeAddress The fee recipient * @param _maxRateTimespan Max time span with the oldestrate, ignored if zero */ function transferWithReferenceAndFee( address _to, uint256 _requestAmount, address[] calldata _path, bytes calldata _paymentReference, uint256 _feeAmount, address _feeAddress, uint256 _maxRateTimespan ) external payable { require( _path[_path.length - 1] == nativeTokenHash, 'payment currency must be the native token' ); (uint256 amountToPay, uint256 amountToPayInFees) = getConversions( _path, _requestAmount, _feeAmount, _maxRateTimespan ); // Pay the request and fees (bool status, ) = paymentProxy.delegatecall( abi.encodeWithSignature( 'transferExactEthWithReferenceAndFee(address,uint256,bytes,uint256,address)', _to, amountToPay, _paymentReference, amountToPayInFees, _feeAddress ) ); require(status, 'paymentProxy transferExactEthWithReferenceAndFee failed'); // Event to declare a transfer with a reference emit TransferWithConversionAndReference( _requestAmount, // request currency _path[0], _paymentReference, _feeAmount, _maxRateTimespan ); } function getConversions( address[] memory _path, uint256 _requestAmount, uint256 _feeAmount, uint256 _maxRateTimespan ) internal view returns (uint256 amountToPay, uint256 amountToPayInFees) { (uint256 rate, uint256 oldestTimestampRate, uint256 decimals) = chainlinkConversionPath.getRate( _path ); // Check rate timespan require( _maxRateTimespan == 0 || block.timestamp - oldestTimestampRate <= _maxRateTimespan, 'aggregator rate is outdated' ); // Get the amount to pay in the native token amountToPay = (_requestAmount * rate) / decimals; amountToPayInFees = (_feeAmount * rate) / decimals; } /** * @notice Update the conversion path contract used to fetch conversions * @param _chainlinkConversionPathAddress address of the conversion path contract */ function updateConversionPathAddress(address _chainlinkConversionPathAddress) external onlyWhitelistAdmin { chainlinkConversionPath = ChainlinkConversionPath(_chainlinkConversionPathAddress); } /** * @notice Update the conversion proxy used to process the payment * @param _paymentProxyAddress address of the ETH conversion proxy */ function updateConversionProxyAddress(address _paymentProxyAddress) external onlyWhitelistAdmin { paymentProxy = _paymentProxyAddress; } /** * @notice Update the native token hash * @param _nativeTokenHash hash of the native token represented as an eth address */ function updateNativeTokenHash(address _nativeTokenHash) external onlyWhitelistAdmin { nativeTokenHash = _nativeTokenHash; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import './legacy_openzeppelin/contracts/access/roles/WhitelistAdminRole.sol'; interface ERC20fraction { function decimals() external view returns (uint8); } interface AggregatorFraction { function decimals() external view returns (uint8); function latestAnswer() external view returns (int256); function latestTimestamp() external view returns (uint256); } /** * @title ChainlinkConversionPath * * @notice ChainlinkConversionPath is a contract computing currency conversion rates based on Chainlink aggretators */ contract ChainlinkConversionPath is WhitelistAdminRole { uint256 constant PRECISION = 1e18; uint256 constant NATIVE_TOKEN_DECIMALS = 18; uint256 constant FIAT_DECIMALS = 8; address public nativeTokenHash; /** * @param _nativeTokenHash hash of the native token * @param _owner Owner of the contract. */ constructor(address _nativeTokenHash, address _owner) { nativeTokenHash = _nativeTokenHash; renounceWhitelistAdmin(); _addWhitelistAdmin(_owner); } // Mapping of Chainlink aggregators (input currency => output currency => contract address) // input & output currencies are the addresses of the ERC20 contracts OR the sha3("currency code") mapping(address => mapping(address => address)) public allAggregators; // declare a new aggregator event AggregatorUpdated(address _input, address _output, address _aggregator); /** * @notice Update an aggregator * @param _input address representing the input currency * @param _output address representing the output currency * @param _aggregator address of the aggregator contract */ function updateAggregator( address _input, address _output, address _aggregator ) external onlyWhitelistAdmin { allAggregators[_input][_output] = _aggregator; emit AggregatorUpdated(_input, _output, _aggregator); } /** * @notice Update a list of aggregators * @param _inputs list of addresses representing the input currencies * @param _outputs list of addresses representing the output currencies * @param _aggregators list of addresses of the aggregator contracts */ function updateAggregatorsList( address[] calldata _inputs, address[] calldata _outputs, address[] calldata _aggregators ) external onlyWhitelistAdmin { require(_inputs.length == _outputs.length, 'arrays must have the same length'); require(_inputs.length == _aggregators.length, 'arrays must have the same length'); // For every conversions of the path for (uint256 i; i < _inputs.length; i++) { allAggregators[_inputs[i]][_outputs[i]] = _aggregators[i]; emit AggregatorUpdated(_inputs[i], _outputs[i], _aggregators[i]); } } /** * @notice Computes the conversion of an amount through a list of intermediate conversions * @param _amountIn Amount to convert * @param _path List of addresses representing the currencies for the intermediate conversions * @return result The result after all the conversions * @return oldestRateTimestamp The oldest timestamp of the path */ function getConversion(uint256 _amountIn, address[] calldata _path) external view returns (uint256 result, uint256 oldestRateTimestamp) { (uint256 rate, uint256 timestamp, uint256 decimals) = getRate(_path); // initialize the result result = (_amountIn * rate) / decimals; oldestRateTimestamp = timestamp; } /** * @notice Computes the conversion rate from a list of currencies * @param _path List of addresses representing the currencies for the conversions * @return rate The rate * @return oldestRateTimestamp The oldest timestamp of the path * @return decimals of the conversion rate */ function getRate(address[] memory _path) public view returns ( uint256 rate, uint256 oldestRateTimestamp, uint256 decimals ) { // initialize the result with 18 decimals (for more precision) rate = PRECISION; decimals = PRECISION; oldestRateTimestamp = block.timestamp; // For every conversion of the path for (uint256 i; i < _path.length - 1; i++) { ( AggregatorFraction aggregator, bool reverseAggregator, uint256 decimalsInput, uint256 decimalsOutput ) = getAggregatorAndDecimals(_path[i], _path[i + 1]); // store the latest timestamp of the path uint256 currentTimestamp = aggregator.latestTimestamp(); if (currentTimestamp < oldestRateTimestamp) { oldestRateTimestamp = currentTimestamp; } // get the rate of the current step uint256 currentRate = uint256(aggregator.latestAnswer()); // get the number of decimals of the current rate uint256 decimalsAggregator = uint256(aggregator.decimals()); // mul with the difference of decimals before the current rate computation (for more precision) if (decimalsAggregator > decimalsInput) { rate = rate * (10**(decimalsAggregator - decimalsInput)); } if (decimalsAggregator < decimalsOutput) { rate = rate * (10**(decimalsOutput - decimalsAggregator)); } // Apply the current rate (if path uses an aggregator in the reverse way, div instead of mul) if (reverseAggregator) { rate = (rate * (10**decimalsAggregator)) / currentRate; } else { rate = (rate * currentRate) / (10**decimalsAggregator); } // div with the difference of decimals AFTER the current rate computation (for more precision) if (decimalsAggregator < decimalsInput) { rate = rate / (10**(decimalsInput - decimalsAggregator)); } if (decimalsAggregator > decimalsOutput) { rate = rate / (10**(decimalsAggregator - decimalsOutput)); } } } /** * @notice Gets aggregators and decimals of two currencies * @param _input input Address * @param _output output Address * @return aggregator to get the rate between the two currencies * @return reverseAggregator true if the aggregator returned give the rate from _output to _input * @return decimalsInput decimals of _input * @return decimalsOutput decimals of _output */ function getAggregatorAndDecimals(address _input, address _output) private view returns ( AggregatorFraction aggregator, bool reverseAggregator, uint256 decimalsInput, uint256 decimalsOutput ) { // Try to get the right aggregator for the conversion aggregator = AggregatorFraction(allAggregators[_input][_output]); reverseAggregator = false; // if no aggregator found we try to find an aggregator in the reverse way if (address(aggregator) == address(0x00)) { aggregator = AggregatorFraction(allAggregators[_output][_input]); reverseAggregator = true; } require(address(aggregator) != address(0x00), 'No aggregator found'); // get the decimals for the two currencies decimalsInput = getDecimals(_input); decimalsOutput = getDecimals(_output); } /** * @notice Gets decimals from an address currency * @param _addr address to check * @return decimals number of decimals */ function getDecimals(address _addr) private view returns (uint256 decimals) { // by default we assume it is fiat decimals = FIAT_DECIMALS; // if address is the hash of the ETH currency if (_addr == nativeTokenHash) { decimals = NATIVE_TOKEN_DECIMALS; } else if (isContract(_addr)) { // otherwise, we get the decimals from the erc20 directly decimals = ERC20fraction(_addr).decimals(); } } /** * @notice Checks if an address is a contract * @param _addr Address to check * @return true if the address hosts a contract, false otherwise */ function isContract(address _addr) private view returns (bool) { uint32 size; // solium-disable security/no-inline-assembly assembly { size := extcodesize(_addr) } return (size > 0); } /** * @notice Update the native token hash * @param _nativeTokenHash hash of the native token represented as an eth address */ function updateNativeTokenHash(address _nativeTokenHash) external onlyWhitelistAdmin { nativeTokenHash = _nativeTokenHash; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping(address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), 'Roles: account already has role'); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), 'Roles: account does not have role'); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), 'Roles: account is the zero address'); return role.bearer[account]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/utils/Context.sol'; import '../Roles.sol'; /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ abstract contract WhitelistAdminRole is Context { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor() { _addWhitelistAdmin(_msgSender()); } modifier onlyWhitelistAdmin() { require( isWhitelistAdmin(_msgSender()), 'WhitelistAdminRole: caller does not have the WhitelistAdmin role' ); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(_msgSender()); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_paymentProxyAddress","type":"address"},{"internalType":"address","name":"_chainlinkConversionPathAddress","type":"address"},{"internalType":"address","name":"_nativeTokenHash","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"currency","type":"address"},{"indexed":true,"internalType":"bytes","name":"paymentReference","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxRateTimespan","type":"uint256"}],"name":"TransferWithConversionAndReference","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"paymentReference","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"feeAddress","type":"address"}],"name":"TransferWithReferenceAndFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainlinkConversionPath","outputs":[{"internalType":"contract ChainlinkConversionPath","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenHash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_requestAmount","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"bytes","name":"_paymentReference","type":"bytes"},{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_maxRateTimespan","type":"uint256"}],"name":"transferWithReferenceAndFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlinkConversionPathAddress","type":"address"}],"name":"updateConversionPathAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentProxyAddress","type":"address"}],"name":"updateConversionProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeTokenHash","type":"address"}],"name":"updateNativeTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001ec038038062001ec08339818101604052810190620000379190620004d3565b60016000819055506200005f620000536200014d60201b60201c565b6200015560201b60201c565b83600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000132620001b660201b60201c565b62000143816200015560201b60201c565b50505050620006f8565b600033905090565b62000170816001620001d860201b620007e91790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b620001d6620001ca6200014d60201b60201c565b6200028b60201b60201c565b565b620001ea8282620002ec60201b60201c565b156200022d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200022490620005a6565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b620002a6816001620003b760201b620008911790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000357906200063e565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620003c98282620002ec60201b60201c565b6200040b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200040290620006d6565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200049b826200046e565b9050919050565b620004ad816200048e565b8114620004b957600080fd5b50565b600081519050620004cd81620004a2565b92915050565b60008060008060808587031215620004f057620004ef62000469565b5b60006200050087828801620004bc565b94505060206200051387828801620004bc565b93505060406200052687828801620004bc565b92505060606200053987828801620004bc565b91505092959194509250565b600082825260208201905092915050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b60006200058e601f8362000545565b91506200059b8262000556565b602082019050919050565b60006020820190508181036000830152620005c1816200057f565b9050919050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200062660228362000545565b91506200063382620005c8565b604082019050919050565b60006020820190508181036000830152620006598162000617565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b6000620006be60218362000545565b9150620006cb8262000660565b604082019050919050565b60006020820190508181036000830152620006f181620006af565b9050919050565b6117b880620007086000396000f3fe6080604052600436106100915760003560e01c8063946647f111610059578063946647f114610153578063ac473c8a1461017e578063bb5f747b1461019a578063c0e6822f146101d7578063d515bb031461020057610091565b80633cd3efef146100965780634c5a628c146100c15780635536bcde146100d85780637362d9c8146101015780637a38d1cb1461012a575b600080fd5b3480156100a257600080fd5b506100ab61022b565b6040516100b89190610c4d565b60405180910390f35b3480156100cd57600080fd5b506100d6610251565b005b3480156100e457600080fd5b506100ff60048036038101906100fa9190610c9e565b610263565b005b34801561010d57600080fd5b5061012860048036038101906101239190610c9e565b6102f6565b005b34801561013657600080fd5b50610151600480360381019061014c9190610c9e565b610351565b005b34801561015f57600080fd5b506101686103e4565b6040516101759190610d2a565b60405180910390f35b61019860048036038101906101939190610e36565b61040a565b005b3480156101a657600080fd5b506101c160048036038101906101bc9190610c9e565b610713565b6040516101ce9190610f33565b60405180910390f35b3480156101e357600080fd5b506101fe60048036038101906101f99190610c9e565b610730565b005b34801561020c57600080fd5b506102156107c3565b6040516102229190610c4d565b60405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61026161025c610938565b610940565b565b61027361026e610938565b610713565b6102b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a990610fd1565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610306610301610938565b610713565b610345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033c90610fd1565b60405180910390fd5b61034e8161099a565b50565b61036161035c610938565b610713565b6103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039790610fd1565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878760018a8a90506104559190611020565b81811061046557610464611054565b5b905060200201602081019061047a9190610c9e565b73ffffffffffffffffffffffffffffffffffffffff16146104d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c7906110f5565b60405180910390fd5b600080610520898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b87866109f4565b915091506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168c848a8a868a60405160240161057a96959493929190611182565b6040516020818303038152906040527fd7c95e98000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106049190611258565b600060405180830381855af49150503d806000811461063f576040519150601f19603f3d011682016040523d82523d6000602084013e610644565b606091505b5050905080610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067f906112e1565b60405180910390fd5b8787604051610698929190611326565b60405180910390207f96d0d1d75923f40b50f6fe74613b2c23239149607848fbca3941fee7ac041cdc8c8c8c60008181106106d6576106d5611054565b5b90506020020160208101906106eb9190610c9e565b89886040516106fd949392919061133f565b60405180910390a2505050505050505050505050565b6000610729826001610b4490919063ffffffff16565b9050919050565b61074061073b610938565b610713565b61077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077690610fd1565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f38282610b44565b15610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906113d0565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61089b8282610b44565b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611462565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b61095481600161089190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b6109ae8160016107e990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6000806000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397edd4fa8a6040518263ffffffff1660e01b8152600401610a579190611540565b60606040518083038186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190611577565b9250925092506000861480610ac75750858242610ac49190611020565b11155b610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90611616565b60405180910390fd5b808389610b139190611636565b610b1d91906116bf565b9450808388610b2c9190611636565b610b3691906116bf565b935050505094509492505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90611762565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c3782610c0c565b9050919050565b610c4781610c2c565b82525050565b6000602082019050610c626000830184610c3e565b92915050565b600080fd5b600080fd5b610c7b81610c2c565b8114610c8657600080fd5b50565b600081359050610c9881610c72565b92915050565b600060208284031215610cb457610cb3610c68565b5b6000610cc284828501610c89565b91505092915050565b6000819050919050565b6000610cf0610ceb610ce684610c0c565b610ccb565b610c0c565b9050919050565b6000610d0282610cd5565b9050919050565b6000610d1482610cf7565b9050919050565b610d2481610d09565b82525050565b6000602082019050610d3f6000830184610d1b565b92915050565b6000819050919050565b610d5881610d45565b8114610d6357600080fd5b50565b600081359050610d7581610d4f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610da057610d9f610d7b565b5b8235905067ffffffffffffffff811115610dbd57610dbc610d80565b5b602083019150836020820283011115610dd957610dd8610d85565b5b9250929050565b60008083601f840112610df657610df5610d7b565b5b8235905067ffffffffffffffff811115610e1357610e12610d80565b5b602083019150836001820283011115610e2f57610e2e610d85565b5b9250929050565b600080600080600080600080600060e08a8c031215610e5857610e57610c68565b5b6000610e668c828d01610c89565b9950506020610e778c828d01610d66565b98505060408a013567ffffffffffffffff811115610e9857610e97610c6d565b5b610ea48c828d01610d8a565b975097505060608a013567ffffffffffffffff811115610ec757610ec6610c6d565b5b610ed38c828d01610de0565b95509550506080610ee68c828d01610d66565b93505060a0610ef78c828d01610c89565b92505060c0610f088c828d01610d66565b9150509295985092959850929598565b60008115159050919050565b610f2d81610f18565b82525050565b6000602082019050610f486000830184610f24565b92915050565b600082825260208201905092915050565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015250565b6000610fbb604083610f4e565b9150610fc682610f5f565b604082019050919050565b60006020820190508181036000830152610fea81610fae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061102b82610d45565b915061103683610d45565b92508282101561104957611048610ff1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7061796d656e742063757272656e6379206d75737420626520746865206e617460008201527f69766520746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006110df602983610f4e565b91506110ea82611083565b604082019050919050565b6000602082019050818103600083015261110e816110d2565b9050919050565b61111e81610d45565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006111618385611124565b935061116e838584611135565b61117783611144565b840190509392505050565b600060a0820190506111976000830189610c3e565b6111a46020830188611115565b81810360408301526111b7818688611155565b90506111c66060830185611115565b6111d36080830184610c3e565b979650505050505050565b600081519050919050565b600081905092915050565b60005b838110156112125780820151818401526020810190506111f7565b83811115611221576000848401525b50505050565b6000611232826111de565b61123c81856111e9565b935061124c8185602086016111f4565b80840191505092915050565b60006112648284611227565b915081905092915050565b7f7061796d656e7450726f7879207472616e73666572457861637445746857697460008201527f685265666572656e6365416e64466565206661696c6564000000000000000000602082015250565b60006112cb603783610f4e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600061130d83856111e9565b935061131a838584611135565b82840190509392505050565b6000611333828486611301565b91508190509392505050565b60006080820190506113546000830187611115565b6113616020830186610c3e565b61136e6040830185611115565b61137b6060830184611115565b95945050505050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b60006113ba601f83610f4e565b91506113c582611384565b602082019050919050565b600060208201905081810360008301526113e9816113ad565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061144c602183610f4e565b9150611457826113f0565b604082019050919050565b6000602082019050818103600083015261147b8161143f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6114b781610c2c565b82525050565b60006114c983836114ae565b60208301905092915050565b6000602082019050919050565b60006114ed82611482565b6114f7818561148d565b93506115028361149e565b8060005b8381101561153357815161151a88826114bd565b9750611525836114d5565b925050600181019050611506565b5085935050505092915050565b6000602082019050818103600083015261155a81846114e2565b905092915050565b60008151905061157181610d4f565b92915050565b6000806000606084860312156115905761158f610c68565b5b600061159e86828701611562565b93505060206115af86828701611562565b92505060406115c086828701611562565b9150509250925092565b7f61676772656761746f722072617465206973206f757464617465640000000000600082015250565b6000611600601b83610f4e565b915061160b826115ca565b602082019050919050565b6000602082019050818103600083015261162f816115f3565b9050919050565b600061164182610d45565b915061164c83610d45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561168557611684610ff1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116ca82610d45565b91506116d583610d45565b9250826116e5576116e4611690565b5b828204905092915050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061174c602283610f4e565b9150611757826116f0565b604082019050919050565b6000602082019050818103600083015261177b8161173f565b905091905056fea264697066735822122093cd2aa90463e90c53046e6969f25b4b00bbbf5b3ac36e277f997a9d76887af964736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
Deployed Bytecode
0x6080604052600436106100915760003560e01c8063946647f111610059578063946647f114610153578063ac473c8a1461017e578063bb5f747b1461019a578063c0e6822f146101d7578063d515bb031461020057610091565b80633cd3efef146100965780634c5a628c146100c15780635536bcde146100d85780637362d9c8146101015780637a38d1cb1461012a575b600080fd5b3480156100a257600080fd5b506100ab61022b565b6040516100b89190610c4d565b60405180910390f35b3480156100cd57600080fd5b506100d6610251565b005b3480156100e457600080fd5b506100ff60048036038101906100fa9190610c9e565b610263565b005b34801561010d57600080fd5b5061012860048036038101906101239190610c9e565b6102f6565b005b34801561013657600080fd5b50610151600480360381019061014c9190610c9e565b610351565b005b34801561015f57600080fd5b506101686103e4565b6040516101759190610d2a565b60405180910390f35b61019860048036038101906101939190610e36565b61040a565b005b3480156101a657600080fd5b506101c160048036038101906101bc9190610c9e565b610713565b6040516101ce9190610f33565b60405180910390f35b3480156101e357600080fd5b506101fe60048036038101906101f99190610c9e565b610730565b005b34801561020c57600080fd5b506102156107c3565b6040516102229190610c4d565b60405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61026161025c610938565b610940565b565b61027361026e610938565b610713565b6102b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102a990610fd1565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610306610301610938565b610713565b610345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033c90610fd1565b60405180910390fd5b61034e8161099a565b50565b61036161035c610938565b610713565b6103a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039790610fd1565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878760018a8a90506104559190611020565b81811061046557610464611054565b5b905060200201602081019061047a9190610c9e565b73ffffffffffffffffffffffffffffffffffffffff16146104d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c7906110f5565b60405180910390fd5b600080610520898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b87866109f4565b915091506000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168c848a8a868a60405160240161057a96959493929190611182565b6040516020818303038152906040527fd7c95e98000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516106049190611258565b600060405180830381855af49150503d806000811461063f576040519150601f19603f3d011682016040523d82523d6000602084013e610644565b606091505b5050905080610688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067f906112e1565b60405180910390fd5b8787604051610698929190611326565b60405180910390207f96d0d1d75923f40b50f6fe74613b2c23239149607848fbca3941fee7ac041cdc8c8c8c60008181106106d6576106d5611054565b5b90506020020160208101906106eb9190610c9e565b89886040516106fd949392919061133f565b60405180910390a2505050505050505050505050565b6000610729826001610b4490919063ffffffff16565b9050919050565b61074061073b610938565b610713565b61077f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077690610fd1565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f38282610b44565b15610833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082a906113d0565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61089b8282610b44565b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611462565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b61095481600161089190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b6109ae8160016107e990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6000806000806000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397edd4fa8a6040518263ffffffff1660e01b8152600401610a579190611540565b60606040518083038186803b158015610a6f57600080fd5b505afa158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190611577565b9250925092506000861480610ac75750858242610ac49190611020565b11155b610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90611616565b60405180910390fd5b808389610b139190611636565b610b1d91906116bf565b9450808388610b2c9190611636565b610b3691906116bf565b935050505094509492505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bac90611762565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c3782610c0c565b9050919050565b610c4781610c2c565b82525050565b6000602082019050610c626000830184610c3e565b92915050565b600080fd5b600080fd5b610c7b81610c2c565b8114610c8657600080fd5b50565b600081359050610c9881610c72565b92915050565b600060208284031215610cb457610cb3610c68565b5b6000610cc284828501610c89565b91505092915050565b6000819050919050565b6000610cf0610ceb610ce684610c0c565b610ccb565b610c0c565b9050919050565b6000610d0282610cd5565b9050919050565b6000610d1482610cf7565b9050919050565b610d2481610d09565b82525050565b6000602082019050610d3f6000830184610d1b565b92915050565b6000819050919050565b610d5881610d45565b8114610d6357600080fd5b50565b600081359050610d7581610d4f565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610da057610d9f610d7b565b5b8235905067ffffffffffffffff811115610dbd57610dbc610d80565b5b602083019150836020820283011115610dd957610dd8610d85565b5b9250929050565b60008083601f840112610df657610df5610d7b565b5b8235905067ffffffffffffffff811115610e1357610e12610d80565b5b602083019150836001820283011115610e2f57610e2e610d85565b5b9250929050565b600080600080600080600080600060e08a8c031215610e5857610e57610c68565b5b6000610e668c828d01610c89565b9950506020610e778c828d01610d66565b98505060408a013567ffffffffffffffff811115610e9857610e97610c6d565b5b610ea48c828d01610d8a565b975097505060608a013567ffffffffffffffff811115610ec757610ec6610c6d565b5b610ed38c828d01610de0565b95509550506080610ee68c828d01610d66565b93505060a0610ef78c828d01610c89565b92505060c0610f088c828d01610d66565b9150509295985092959850929598565b60008115159050919050565b610f2d81610f18565b82525050565b6000602082019050610f486000830184610f24565b92915050565b600082825260208201905092915050565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015250565b6000610fbb604083610f4e565b9150610fc682610f5f565b604082019050919050565b60006020820190508181036000830152610fea81610fae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061102b82610d45565b915061103683610d45565b92508282101561104957611048610ff1565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f7061796d656e742063757272656e6379206d75737420626520746865206e617460008201527f69766520746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006110df602983610f4e565b91506110ea82611083565b604082019050919050565b6000602082019050818103600083015261110e816110d2565b9050919050565b61111e81610d45565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006111618385611124565b935061116e838584611135565b61117783611144565b840190509392505050565b600060a0820190506111976000830189610c3e565b6111a46020830188611115565b81810360408301526111b7818688611155565b90506111c66060830185611115565b6111d36080830184610c3e565b979650505050505050565b600081519050919050565b600081905092915050565b60005b838110156112125780820151818401526020810190506111f7565b83811115611221576000848401525b50505050565b6000611232826111de565b61123c81856111e9565b935061124c8185602086016111f4565b80840191505092915050565b60006112648284611227565b915081905092915050565b7f7061796d656e7450726f7879207472616e73666572457861637445746857697460008201527f685265666572656e6365416e64466565206661696c6564000000000000000000602082015250565b60006112cb603783610f4e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600061130d83856111e9565b935061131a838584611135565b82840190509392505050565b6000611333828486611301565b91508190509392505050565b60006080820190506113546000830187611115565b6113616020830186610c3e565b61136e6040830185611115565b61137b6060830184611115565b95945050505050565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500600082015250565b60006113ba601f83610f4e565b91506113c582611384565b602082019050919050565b600060208201905081810360008301526113e9816113ad565b9050919050565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061144c602183610f4e565b9150611457826113f0565b604082019050919050565b6000602082019050818103600083015261147b8161143f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6114b781610c2c565b82525050565b60006114c983836114ae565b60208301905092915050565b6000602082019050919050565b60006114ed82611482565b6114f7818561148d565b93506115028361149e565b8060005b8381101561153357815161151a88826114bd565b9750611525836114d5565b925050600181019050611506565b5085935050505092915050565b6000602082019050818103600083015261155a81846114e2565b905092915050565b60008151905061157181610d4f565b92915050565b6000806000606084860312156115905761158f610c68565b5b600061159e86828701611562565b93505060206115af86828701611562565b92505060406115c086828701611562565b9150509250925092565b7f61676772656761746f722072617465206973206f757464617465640000000000600082015250565b6000611600601b83610f4e565b915061160b826115ca565b602082019050919050565b6000602082019050818103600083015261162f816115f3565b9050919050565b600061164182610d45565b915061164c83610d45565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561168557611684610ff1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006116ca82610d45565b91506116d583610d45565b9250826116e5576116e4611690565b5b828204905092915050565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061174c602283610f4e565b9150611757826116f0565b604082019050919050565b6000602082019050818103600083015261177b8161173f565b905091905056fea264697066735822122093cd2aa90463e90c53046e6969f25b4b00bbbf5b3ac36e277f997a9d76887af964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
-----Decoded View---------------
Arg [0] : _paymentProxyAddress (address): 0x0000000000000000000000000000000000000000
Arg [1] : _chainlinkConversionPathAddress (address): 0x0000000000000000000000000000000000000000
Arg [2] : _nativeTokenHash (address): 0x0000000000000000000000000000000000000000
Arg [3] : _owner (address): 0x63d2062AAcF71e26dEa7111EC556558Fe8199384
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.