Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
3974151 | 28 days ago | Contract Creation | 0 S |
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:
Erc20ConversionProxy
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 './interfaces/ERC20FeeProxy.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; /** * @title Erc20ConversionProxy * @notice This contract convert from chainlink then swaps ERC20 tokens * before paying a request thanks to a conversion payment proxy */ contract Erc20ConversionProxy is Ownable { address public paymentProxy; ChainlinkConversionPath public chainlinkConversionPath; constructor( address _paymentProxyAddress, address _chainlinkConversionPathAddress, address _owner ) { paymentProxy = _paymentProxyAddress; chainlinkConversionPath = ChainlinkConversionPath(_chainlinkConversionPathAddress); transferOwnership(_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 event TransferWithReferenceAndFee( address tokenAddress, address to, uint256 amount, bytes indexed paymentReference, uint256 feeAmount, address feeAddress ); /** * @notice Transfers ERC20 tokens with a reference with amount based on the request amount in fiat * @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 _maxToSpend Amount max that we can spend on the behalf of the user * @param _maxRateTimespan Max time span with the oldestrate, ignored if zero */ function transferFromWithReferenceAndFee( address _to, uint256 _requestAmount, address[] calldata _path, bytes calldata _paymentReference, uint256 _feeAmount, address _feeAddress, uint256 _maxToSpend, uint256 _maxRateTimespan ) external { (uint256 amountToPay, uint256 amountToPayInFees) = getConversions( _path, _requestAmount, _feeAmount, _maxRateTimespan ); require(amountToPay + amountToPayInFees <= _maxToSpend, 'Amount to pay is over the user limit'); // Pay the request and fees (bool status, ) = paymentProxy.delegatecall( abi.encodeWithSignature( 'transferFromWithReferenceAndFee(address,address,uint256,bytes,uint256,address)', // payment currency _path[_path.length - 1], _to, amountToPay, _paymentReference, amountToPayInFees, _feeAddress ) ); require(status, 'transferFromWithReferenceAndFee 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 crypto currency chosen 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 onlyOwner { 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 onlyOwner { paymentProxy = _paymentProxyAddress; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// 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; interface IERC20FeeProxy { event TransferWithReferenceAndFee( address tokenAddress, address to, uint256 amount, bytes indexed paymentReference, uint256 feeAmount, address feeAddress ); function transferFromWithReferenceAndFee( address _tokenAddress, address _to, uint256 _amount, bytes calldata _paymentReference, uint256 _feeAmount, address _feeAddress ) external; }
// 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
[{"inputs":[{"internalType":"address","name":"_paymentProxyAddress","type":"address"},{"internalType":"address","name":"_chainlinkConversionPathAddress","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"tokenAddress","type":"address"},{"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"},{"inputs":[],"name":"chainlinkConversionPath","outputs":[{"internalType":"contract ChainlinkConversionPath","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"renounceOwnership","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":"_maxToSpend","type":"uint256"},{"internalType":"uint256","name":"_maxRateTimespan","type":"uint256"}],"name":"transferFromWithReferenceAndFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620018363803806200183683398181016040528101906200003791906200037a565b620000576200004b620000f360201b60201c565b620000fb60201b60201c565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620000ea81620001bf60201b60201c565b505050620004f1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001cf6200025660201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000239906200045d565b60405180910390fd5b6200025381620000fb60201b60201c565b50565b62000266620000f360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028c620002e760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002dc90620004cf565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003428262000315565b9050919050565b620003548162000335565b81146200036057600080fd5b50565b600081519050620003748162000349565b92915050565b60008060006060848603121562000396576200039562000310565b5b6000620003a68682870162000363565b9350506020620003b98682870162000363565b9250506040620003cc8682870162000363565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000445602683620003d6565b91506200045282620003e7565b604082019050919050565b60006020820190508181036000830152620004788162000436565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620004b7602083620003d6565b9150620004c4826200047f565b602082019050919050565b60006020820190508181036000830152620004ea81620004a8565b9050919050565b61133580620005016000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637a38d1cb1161005b5780637a38d1cb146100ed5780638da5cb5b14610109578063946647f114610127578063f2fde38b1461014557610088565b80633af2c0121461008d5780633cd3efef146100a95780635536bcde146100c7578063715018a6146100e3575b600080fd5b6100a760048036038101906100a291906109c3565b610161565b005b6100b161042b565b6040516100be9190610ac9565b60405180910390f35b6100e160048036038101906100dc9190610ae4565b610451565b005b6100eb61049d565b005b61010760048036038101906101029190610ae4565b6104b1565b005b6101116104fd565b60405161011e9190610ac9565b60405180910390f35b61012f610526565b60405161013c9190610b70565b60405180910390f35b61015f600480360381019061015a9190610ae4565b61054c565b005b6000806101b18a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c88866105d0565b915091508381836101c29190610bba565b1115610203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fa90610c93565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b8b60018e8e90506102509190610cb3565b8181106102605761025f610ce7565b5b90506020020160208101906102759190610ae4565b8e858c8c878c6040516024016102919796959493929190610d83565b6040516020818303038152906040527fc219a14d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161031b9190610e67565b600060405180830381855af49150503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b505090508061039f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039690610ef0565b60405180910390fd5b88886040516103af929190610f35565b60405180910390207f96d0d1d75923f40b50f6fe74613b2c23239149607848fbca3941fee7ac041cdc8d8d8d60008181106103ed576103ec610ce7565b5b90506020020160208101906104029190610ae4565b8a886040516104149493929190610f4e565b60405180910390a250505050505050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610459610720565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6104a5610720565b6104af600061079e565b565b6104b9610720565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610554610720565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90611005565b60405180910390fd5b6105cd8161079e565b50565b6000806000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397edd4fa8a6040518263ffffffff1660e01b815260040161063391906110e3565b60606040518083038186803b15801561064b57600080fd5b505afa15801561065f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610683919061111a565b92509250925060008614806106a357508582426106a09190610cb3565b11155b6106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906111b9565b60405180910390fd5b8083896106ef91906111d9565b6106f99190611262565b945080838861070891906111d9565b6107129190611262565b935050505094509492505050565b610728610862565b73ffffffffffffffffffffffffffffffffffffffff166107466104fd565b73ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610793906112df565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061089f82610874565b9050919050565b6108af81610894565b81146108ba57600080fd5b50565b6000813590506108cc816108a6565b92915050565b6000819050919050565b6108e5816108d2565b81146108f057600080fd5b50565b600081359050610902816108dc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261092d5761092c610908565b5b8235905067ffffffffffffffff81111561094a5761094961090d565b5b60208301915083602082028301111561096657610965610912565b5b9250929050565b60008083601f84011261098357610982610908565b5b8235905067ffffffffffffffff8111156109a05761099f61090d565b5b6020830191508360018202830111156109bc576109bb610912565b5b9250929050565b6000806000806000806000806000806101008b8d0312156109e7576109e661086a565b5b60006109f58d828e016108bd565b9a50506020610a068d828e016108f3565b99505060408b013567ffffffffffffffff811115610a2757610a2661086f565b5b610a338d828e01610917565b985098505060608b013567ffffffffffffffff811115610a5657610a5561086f565b5b610a628d828e0161096d565b96509650506080610a758d828e016108f3565b94505060a0610a868d828e016108bd565b93505060c0610a978d828e016108f3565b92505060e0610aa88d828e016108f3565b9150509295989b9194979a5092959850565b610ac381610894565b82525050565b6000602082019050610ade6000830184610aba565b92915050565b600060208284031215610afa57610af961086a565b5b6000610b08848285016108bd565b91505092915050565b6000819050919050565b6000610b36610b31610b2c84610874565b610b11565b610874565b9050919050565b6000610b4882610b1b565b9050919050565b6000610b5a82610b3d565b9050919050565b610b6a81610b4f565b82525050565b6000602082019050610b856000830184610b61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610bc5826108d2565b9150610bd0836108d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610c0557610c04610b8b565b5b828201905092915050565b600082825260208201905092915050565b7f416d6f756e7420746f20706179206973206f766572207468652075736572206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b6000610c7d602483610c10565b9150610c8882610c21565b604082019050919050565b60006020820190508181036000830152610cac81610c70565b9050919050565b6000610cbe826108d2565b9150610cc9836108d2565b925082821015610cdc57610cdb610b8b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b610d1f816108d2565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000610d628385610d25565b9350610d6f838584610d36565b610d7883610d45565b840190509392505050565b600060c082019050610d98600083018a610aba565b610da56020830189610aba565b610db26040830188610d16565b8181036060830152610dc5818688610d56565b9050610dd46080830185610d16565b610de160a0830184610aba565b98975050505050505050565b600081519050919050565b600081905092915050565b60005b83811015610e21578082015181840152602081019050610e06565b83811115610e30576000848401525b50505050565b6000610e4182610ded565b610e4b8185610df8565b9350610e5b818560208601610e03565b80840191505092915050565b6000610e738284610e36565b915081905092915050565b7f7472616e7366657246726f6d576974685265666572656e6365416e644665652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b6000610eda602683610c10565b9150610ee582610e7e565b604082019050919050565b60006020820190508181036000830152610f0981610ecd565b9050919050565b6000610f1c8385610df8565b9350610f29838584610d36565b82840190509392505050565b6000610f42828486610f10565b91508190509392505050565b6000608082019050610f636000830187610d16565b610f706020830186610aba565b610f7d6040830185610d16565b610f8a6060830184610d16565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610fef602683610c10565b9150610ffa82610f93565b604082019050919050565b6000602082019050818103600083015261101e81610fe2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61105a81610894565b82525050565b600061106c8383611051565b60208301905092915050565b6000602082019050919050565b600061109082611025565b61109a8185611030565b93506110a583611041565b8060005b838110156110d65781516110bd8882611060565b97506110c883611078565b9250506001810190506110a9565b5085935050505092915050565b600060208201905081810360008301526110fd8184611085565b905092915050565b600081519050611114816108dc565b92915050565b6000806000606084860312156111335761113261086a565b5b600061114186828701611105565b935050602061115286828701611105565b925050604061116386828701611105565b9150509250925092565b7f61676772656761746f722072617465206973206f757464617465640000000000600082015250565b60006111a3601b83610c10565b91506111ae8261116d565b602082019050919050565b600060208201905081810360008301526111d281611196565b9050919050565b60006111e4826108d2565b91506111ef836108d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561122857611227610b8b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061126d826108d2565b9150611278836108d2565b92508261128857611287611233565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006112c9602083610c10565b91506112d482611293565b602082019050919050565b600060208201905081810360008301526112f8816112bc565b905091905056fea2646970667358221220203064c72d613f2e79c1a9a40b87c5064db2984f3a70fda9fb424647cb47c75a64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80637a38d1cb1161005b5780637a38d1cb146100ed5780638da5cb5b14610109578063946647f114610127578063f2fde38b1461014557610088565b80633af2c0121461008d5780633cd3efef146100a95780635536bcde146100c7578063715018a6146100e3575b600080fd5b6100a760048036038101906100a291906109c3565b610161565b005b6100b161042b565b6040516100be9190610ac9565b60405180910390f35b6100e160048036038101906100dc9190610ae4565b610451565b005b6100eb61049d565b005b61010760048036038101906101029190610ae4565b6104b1565b005b6101116104fd565b60405161011e9190610ac9565b60405180910390f35b61012f610526565b60405161013c9190610b70565b60405180910390f35b61015f600480360381019061015a9190610ae4565b61054c565b005b6000806101b18a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c88866105d0565b915091508381836101c29190610bba565b1115610203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fa90610c93565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b8b60018e8e90506102509190610cb3565b8181106102605761025f610ce7565b5b90506020020160208101906102759190610ae4565b8e858c8c878c6040516024016102919796959493929190610d83565b6040516020818303038152906040527fc219a14d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161031b9190610e67565b600060405180830381855af49150503d8060008114610356576040519150601f19603f3d011682016040523d82523d6000602084013e61035b565b606091505b505090508061039f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039690610ef0565b60405180910390fd5b88886040516103af929190610f35565b60405180910390207f96d0d1d75923f40b50f6fe74613b2c23239149607848fbca3941fee7ac041cdc8d8d8d60008181106103ed576103ec610ce7565b5b90506020020160208101906104029190610ae4565b8a886040516104149493929190610f4e565b60405180910390a250505050505050505050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610459610720565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6104a5610720565b6104af600061079e565b565b6104b9610720565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610554610720565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156105c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105bb90611005565b60405180910390fd5b6105cd8161079e565b50565b6000806000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397edd4fa8a6040518263ffffffff1660e01b815260040161063391906110e3565b60606040518083038186803b15801561064b57600080fd5b505afa15801561065f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610683919061111a565b92509250925060008614806106a357508582426106a09190610cb3565b11155b6106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906111b9565b60405180910390fd5b8083896106ef91906111d9565b6106f99190611262565b945080838861070891906111d9565b6107129190611262565b935050505094509492505050565b610728610862565b73ffffffffffffffffffffffffffffffffffffffff166107466104fd565b73ffffffffffffffffffffffffffffffffffffffff161461079c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610793906112df565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061089f82610874565b9050919050565b6108af81610894565b81146108ba57600080fd5b50565b6000813590506108cc816108a6565b92915050565b6000819050919050565b6108e5816108d2565b81146108f057600080fd5b50565b600081359050610902816108dc565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261092d5761092c610908565b5b8235905067ffffffffffffffff81111561094a5761094961090d565b5b60208301915083602082028301111561096657610965610912565b5b9250929050565b60008083601f84011261098357610982610908565b5b8235905067ffffffffffffffff8111156109a05761099f61090d565b5b6020830191508360018202830111156109bc576109bb610912565b5b9250929050565b6000806000806000806000806000806101008b8d0312156109e7576109e661086a565b5b60006109f58d828e016108bd565b9a50506020610a068d828e016108f3565b99505060408b013567ffffffffffffffff811115610a2757610a2661086f565b5b610a338d828e01610917565b985098505060608b013567ffffffffffffffff811115610a5657610a5561086f565b5b610a628d828e0161096d565b96509650506080610a758d828e016108f3565b94505060a0610a868d828e016108bd565b93505060c0610a978d828e016108f3565b92505060e0610aa88d828e016108f3565b9150509295989b9194979a5092959850565b610ac381610894565b82525050565b6000602082019050610ade6000830184610aba565b92915050565b600060208284031215610afa57610af961086a565b5b6000610b08848285016108bd565b91505092915050565b6000819050919050565b6000610b36610b31610b2c84610874565b610b11565b610874565b9050919050565b6000610b4882610b1b565b9050919050565b6000610b5a82610b3d565b9050919050565b610b6a81610b4f565b82525050565b6000602082019050610b856000830184610b61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610bc5826108d2565b9150610bd0836108d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610c0557610c04610b8b565b5b828201905092915050565b600082825260208201905092915050565b7f416d6f756e7420746f20706179206973206f766572207468652075736572206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b6000610c7d602483610c10565b9150610c8882610c21565b604082019050919050565b60006020820190508181036000830152610cac81610c70565b9050919050565b6000610cbe826108d2565b9150610cc9836108d2565b925082821015610cdc57610cdb610b8b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b610d1f816108d2565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b6000610d628385610d25565b9350610d6f838584610d36565b610d7883610d45565b840190509392505050565b600060c082019050610d98600083018a610aba565b610da56020830189610aba565b610db26040830188610d16565b8181036060830152610dc5818688610d56565b9050610dd46080830185610d16565b610de160a0830184610aba565b98975050505050505050565b600081519050919050565b600081905092915050565b60005b83811015610e21578082015181840152602081019050610e06565b83811115610e30576000848401525b50505050565b6000610e4182610ded565b610e4b8185610df8565b9350610e5b818560208601610e03565b80840191505092915050565b6000610e738284610e36565b915081905092915050565b7f7472616e7366657246726f6d576974685265666572656e6365416e644665652060008201527f6661696c65640000000000000000000000000000000000000000000000000000602082015250565b6000610eda602683610c10565b9150610ee582610e7e565b604082019050919050565b60006020820190508181036000830152610f0981610ecd565b9050919050565b6000610f1c8385610df8565b9350610f29838584610d36565b82840190509392505050565b6000610f42828486610f10565b91508190509392505050565b6000608082019050610f636000830187610d16565b610f706020830186610aba565b610f7d6040830185610d16565b610f8a6060830184610d16565b95945050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610fef602683610c10565b9150610ffa82610f93565b604082019050919050565b6000602082019050818103600083015261101e81610fe2565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61105a81610894565b82525050565b600061106c8383611051565b60208301905092915050565b6000602082019050919050565b600061109082611025565b61109a8185611030565b93506110a583611041565b8060005b838110156110d65781516110bd8882611060565b97506110c883611078565b9250506001810190506110a9565b5085935050505092915050565b600060208201905081810360008301526110fd8184611085565b905092915050565b600081519050611114816108dc565b92915050565b6000806000606084860312156111335761113261086a565b5b600061114186828701611105565b935050602061115286828701611105565b925050604061116386828701611105565b9150509250925092565b7f61676772656761746f722072617465206973206f757464617465640000000000600082015250565b60006111a3601b83610c10565b91506111ae8261116d565b602082019050919050565b600060208201905081810360008301526111d281611196565b9050919050565b60006111e4826108d2565b91506111ef836108d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561122857611227610b8b565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061126d826108d2565b9150611278836108d2565b92508261128857611287611233565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006112c9602083610c10565b91506112d482611293565b602082019050919050565b600060208201905081810360008301526112f8816112bc565b905091905056fea2646970667358221220203064c72d613f2e79c1a9a40b87c5064db2984f3a70fda9fb424647cb47c75a64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
-----Decoded View---------------
Arg [0] : _paymentProxyAddress (address): 0x0000000000000000000000000000000000000000
Arg [1] : _chainlinkConversionPathAddress (address): 0x0000000000000000000000000000000000000000
Arg [2] : _owner (address): 0x63d2062AAcF71e26dEa7111EC556558Fe8199384
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000063d2062aacf71e26dea7111ec556558fe8199384
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.