Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 46 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Renounce Whiteli... | 19112621 | 363 days ago | IN | 0 ETH | 0.00043259 | ||||
Add Whitelist Ad... | 19112620 | 363 days ago | IN | 0 ETH | 0.00087126 | ||||
Update Aggregato... | 18690253 | 422 days ago | IN | 0 ETH | 0.00089576 | ||||
Update Aggregato... | 18690252 | 422 days ago | IN | 0 ETH | 0.00153399 | ||||
Update Aggregato... | 18684609 | 423 days ago | IN | 0 ETH | 0.0009716 | ||||
Update Aggregato... | 18684608 | 423 days ago | IN | 0 ETH | 0.00164608 | ||||
Update Aggregato... | 18521495 | 446 days ago | IN | 0 ETH | 0.00164574 | ||||
Update Aggregato... | 18521494 | 446 days ago | IN | 0 ETH | 0.00284172 | ||||
Update Aggregato... | 18361841 | 468 days ago | IN | 0 ETH | 0.0002418 | ||||
Update Aggregato... | 18361840 | 468 days ago | IN | 0 ETH | 0.00039267 | ||||
Update Aggregato... | 18034816 | 514 days ago | IN | 0 ETH | 0.00051692 | ||||
Update Aggregato... | 17885895 | 535 days ago | IN | 0 ETH | 0.0012849 | ||||
Update Aggregato... | 17885894 | 535 days ago | IN | 0 ETH | 0.00202761 | ||||
Update Aggregato... | 17885375 | 535 days ago | IN | 0 ETH | 0.00273138 | ||||
Update Aggregato... | 17885372 | 535 days ago | IN | 0 ETH | 0.00966033 | ||||
Update Aggregato... | 17039846 | 654 days ago | IN | 0 ETH | 0.00158993 | ||||
Update Aggregato... | 17039845 | 654 days ago | IN | 0 ETH | 0.00276532 | ||||
Update Aggregato... | 17039842 | 654 days ago | IN | 0 ETH | 0.00160731 | ||||
Update Aggregato... | 17039841 | 654 days ago | IN | 0 ETH | 0.00143524 | ||||
Update Aggregato... | 17039839 | 654 days ago | IN | 0 ETH | 0.00249635 | ||||
Update Aggregato... | 16532857 | 725 days ago | IN | 0 ETH | 0.00048881 | ||||
Update Aggregato... | 16532855 | 725 days ago | IN | 0 ETH | 0.00079186 | ||||
Update Aggregato... | 16133639 | 781 days ago | IN | 0 ETH | 0.00047241 | ||||
Update Aggregato... | 16133639 | 781 days ago | IN | 0 ETH | 0.00047241 | ||||
Update Aggregato... | 16018701 | 797 days ago | IN | 0 ETH | 0.00041345 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ChainlinkConversionPath
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-12 */ // SPDX-License-Identifier: MIT pragma solidity >=0.4.25 <0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @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(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); 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)); return role.bearer[account]; } } /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(msg.sender); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(msg.sender)); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(msg.sender); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } 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 { using SafeMath for uint256; uint constant DECIMALS = 1e18; // 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 (uint 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.mul(rate).div(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 = DECIMALS; decimals = DECIMALS; oldestRateTimestamp = block.timestamp; // For every conversion of the path for (uint 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.mul(10**(decimalsAggregator-decimalsInput)); } if (decimalsAggregator < decimalsOutput) { rate = rate.mul(10**(decimalsOutput-decimalsAggregator)); } // Apply the current rate (if path uses an aggregator in the reverse way, div instead of mul) if (reverseAggregator) { rate = rate.mul(10**decimalsAggregator).div(currentRate); } else { rate = rate.mul(currentRate).div(10**decimalsAggregator); } // div with the difference of decimals AFTER the current rate computation (for more precision) if (decimalsAggregator < decimalsInput) { rate = rate.div(10**(decimalsInput-decimalsAggregator)); } if (decimalsAggregator > decimalsOutput) { rate = rate.div(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 so 8 decimals decimals = 8; // if address is the hash of the ETH currency if (_addr == address(0xF5AF88e117747e87fC5929F2ff87221B1447652E)) { decimals = 18; } 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_input","type":"address"},{"indexed":false,"internalType":"address","name":"_output","type":"address"},{"indexed":false,"internalType":"address","name":"_aggregator","type":"address"}],"name":"AggregatorUpdated","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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allAggregators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getConversion","outputs":[{"internalType":"uint256","name":"result","type":"uint256"},{"internalType":"uint256","name":"oldestRateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"oldestRateTimestamp","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"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":"renounceWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"address","name":"_output","type":"address"},{"internalType":"address","name":"_aggregator","type":"address"}],"name":"updateAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_inputs","type":"address[]"},{"internalType":"address[]","name":"_outputs","type":"address[]"},{"internalType":"address[]","name":"_aggregators","type":"address[]"}],"name":"updateAggregatorsList","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001a3361001f565b6100ef565b61003781600061006e60201b610b981790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b6001600160a01b03811661008157600080fd5b61008b82826100ba565b1561009557600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166100cf57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b611148806100fe6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806397edd4fa1161005b57806397edd4fa14610173578063a3d7afa314610234578063bb5f747b14610348578063fbd4122a1461038f57610088565b806308d5bc581461008d5780634b6c8879146100f15780634c5a628c146101385780637362d9c814610140575b600080fd5b6100c8600480360360408110156100a357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661041f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101366004803603606081101561010757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516610452565b005b61013661050b565b6101366004803603602081101561015657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610516565b6102166004803603602081101561018957600080fd5b8101906020810181356401000000008111156101a457600080fd5b8201836020820111156101b657600080fd5b803590602001918460208302840111640100000000831117156101d857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610534945050505050565b60408051938452602084019290925282820152519081900360600190f35b6101366004803603606081101561024a57600080fd5b81019060208101813564010000000081111561026557600080fd5b82018360208201111561027757600080fd5b8035906020019184602083028401116401000000008311171561029957600080fd5b9193909290916020810190356401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460208302840111640100000000831117156102eb57600080fd5b91939092909160208101903564010000000081111561030957600080fd5b82018360208201111561031b57600080fd5b8035906020019184602083028401116401000000008311171561033d57600080fd5b5090925090506107df565b61037b6004803603602081101561035e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b1d565b604080519115158252519081900360200190f35b610406600480360360408110156103a557600080fd5b813591908101906040810160208201356401000000008111156103c757600080fd5b8201836020820111156103d957600080fd5b803590602001918460208302840111640100000000831117156103fb57600080fd5b509092509050610b31565b6040805192835260208301919091528051918290030190f35b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b61045b33610b1d565b61046457600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083208786168085529083529281902080549587167fffffffffffffffffffffffff0000000000000000000000000000000000000000909616861790558051938452908301919091528181019290925290517f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf9181900360600190a1505050565b61051433610c1c565b565b61051f33610b1d565b61052857600080fd5b61053181610c6b565b50565b670de0b6b3a7640000428160005b60018551038110156107d75760008060008061058789868151811061056357fe5b60200260200101518a876001018151811061057a57fe5b6020026020010151610cba565b935093509350935060008473ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105d757600080fd5b505afa1580156105eb573d6000803e3d6000fd5b505050506040513d602081101561060157600080fd5b5051905087811015610611578097505b60008573ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561065957600080fd5b505afa15801561066d573d6000803e3d6000fd5b505050506040513d602081101561068357600080fd5b5051604080517f313ce567000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff89169163313ce567916004808301926020929190829003018186803b1580156106f157600080fd5b505afa158015610705573d6000803e3d6000fd5b505050506040513d602081101561071b57600080fd5b505160ff1690508481111561073c576107398b868303600a0a610dd7565b9a505b83811015610756576107538b828603600a0a610dd7565b9a505b851561077b576107748261076e8d600a85900a610dd7565b90610e53565b9a50610790565b61078d600a82900a61076e8d85610dd7565b9a505b848110156107aa576107a78b828703600a0a610e53565b9a505b838111156107c4576107c18b858303600a0a610e53565b9a505b5050600190950194506105429350505050565b509193909250565b6107e833610b1d565b6107f157600080fd5b84831461085f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f617272617973206d7573742068617665207468652073616d65206c656e677468604482015290519081900360640190fd5b8481146108cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f617272617973206d7573742068617665207468652073616d65206c656e677468604482015290519081900360640190fd5b60005b85811015610b14578282828181106108e457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166001600089898581811061091157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087878581811061097657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf878783818110610a3857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868684818110610a6157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16858585818110610a8a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a16001016108d0565b50505050505050565b6000610b298183610e95565b90505b919050565b6000806000806000610b7587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061053492505050565b91945092509050610b8a8161076e8a86610dd7565b989197509095505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116610bb857600080fd5b610bc28282610e95565b15610bcc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610c27600082610ee4565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b610c76600082610b98565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320858516845290915281205490911690808083610d365773ffffffffffffffffffffffffffffffffffffffff80861660009081526001602081815260408084208b8616855290915290912054909116945092505b73ffffffffffffffffffffffffffffffffffffffff8416610db857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f2061676772656761746f7220666f756e6400000000000000000000000000604482015290519081900360640190fd5b610dc186610f64565b9150610dcc85610f64565b905092959194509250565b600082610de657506000610e4d565b82820282848281610df357fe5b0414610e4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806110f26021913960400191505060405180910390fd5b90505b92915050565b6000610e4a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611029565b600073ffffffffffffffffffffffffffffffffffffffff8216610eb757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8116610f0457600080fd5b610f0e8282610e95565b610f1757600080fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600873ffffffffffffffffffffffffffffffffffffffff821673f5af88e117747e87fc5929f2ff87221b1447652e1415610fa057506012610b2c565b610fa9826110e5565b15610b2c578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b505160ff1692915050565b600081836110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561109457818101518382015260200161107c565b50505050905090810190601f1680156110c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816110db57fe5b0495945050505050565b3b63ffffffff1615159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122046629d88fad78f77c785e4fae8dba3eedf36f6be9105732a331669a3216903c164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c806397edd4fa1161005b57806397edd4fa14610173578063a3d7afa314610234578063bb5f747b14610348578063fbd4122a1461038f57610088565b806308d5bc581461008d5780634b6c8879146100f15780634c5a628c146101385780637362d9c814610140575b600080fd5b6100c8600480360360408110156100a357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661041f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101366004803603606081101561010757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516610452565b005b61013661050b565b6101366004803603602081101561015657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610516565b6102166004803603602081101561018957600080fd5b8101906020810181356401000000008111156101a457600080fd5b8201836020820111156101b657600080fd5b803590602001918460208302840111640100000000831117156101d857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610534945050505050565b60408051938452602084019290925282820152519081900360600190f35b6101366004803603606081101561024a57600080fd5b81019060208101813564010000000081111561026557600080fd5b82018360208201111561027757600080fd5b8035906020019184602083028401116401000000008311171561029957600080fd5b9193909290916020810190356401000000008111156102b757600080fd5b8201836020820111156102c957600080fd5b803590602001918460208302840111640100000000831117156102eb57600080fd5b91939092909160208101903564010000000081111561030957600080fd5b82018360208201111561031b57600080fd5b8035906020019184602083028401116401000000008311171561033d57600080fd5b5090925090506107df565b61037b6004803603602081101561035e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b1d565b604080519115158252519081900360200190f35b610406600480360360408110156103a557600080fd5b813591908101906040810160208201356401000000008111156103c757600080fd5b8201836020820111156103d957600080fd5b803590602001918460208302840111640100000000831117156103fb57600080fd5b509092509050610b31565b6040805192835260208301919091528051918290030190f35b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b61045b33610b1d565b61046457600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260408083208786168085529083529281902080549587167fffffffffffffffffffffffff0000000000000000000000000000000000000000909616861790558051938452908301919091528181019290925290517f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf9181900360600190a1505050565b61051433610c1c565b565b61051f33610b1d565b61052857600080fd5b61053181610c6b565b50565b670de0b6b3a7640000428160005b60018551038110156107d75760008060008061058789868151811061056357fe5b60200260200101518a876001018151811061057a57fe5b6020026020010151610cba565b935093509350935060008473ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105d757600080fd5b505afa1580156105eb573d6000803e3d6000fd5b505050506040513d602081101561060157600080fd5b5051905087811015610611578097505b60008573ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561065957600080fd5b505afa15801561066d573d6000803e3d6000fd5b505050506040513d602081101561068357600080fd5b5051604080517f313ce567000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff89169163313ce567916004808301926020929190829003018186803b1580156106f157600080fd5b505afa158015610705573d6000803e3d6000fd5b505050506040513d602081101561071b57600080fd5b505160ff1690508481111561073c576107398b868303600a0a610dd7565b9a505b83811015610756576107538b828603600a0a610dd7565b9a505b851561077b576107748261076e8d600a85900a610dd7565b90610e53565b9a50610790565b61078d600a82900a61076e8d85610dd7565b9a505b848110156107aa576107a78b828703600a0a610e53565b9a505b838111156107c4576107c18b858303600a0a610e53565b9a505b5050600190950194506105429350505050565b509193909250565b6107e833610b1d565b6107f157600080fd5b84831461085f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f617272617973206d7573742068617665207468652073616d65206c656e677468604482015290519081900360640190fd5b8481146108cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f617272617973206d7573742068617665207468652073616d65206c656e677468604482015290519081900360640190fd5b60005b85811015610b14578282828181106108e457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166001600089898581811061091157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087878581811061097657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f589e912830d38d62f14a6cf3cea8f8a002fc9288b37f0d914b5e7dc107d278bf878783818110610a3857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868684818110610a6157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16858585818110610a8a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16604051808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a16001016108d0565b50505050505050565b6000610b298183610e95565b90505b919050565b6000806000806000610b7587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061053492505050565b91945092509050610b8a8161076e8a86610dd7565b989197509095505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116610bb857600080fd5b610bc28282610e95565b15610bcc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610c27600082610ee4565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b610c76600082610b98565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320858516845290915281205490911690808083610d365773ffffffffffffffffffffffffffffffffffffffff80861660009081526001602081815260408084208b8616855290915290912054909116945092505b73ffffffffffffffffffffffffffffffffffffffff8416610db857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4e6f2061676772656761746f7220666f756e6400000000000000000000000000604482015290519081900360640190fd5b610dc186610f64565b9150610dcc85610f64565b905092959194509250565b600082610de657506000610e4d565b82820282848281610df357fe5b0414610e4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806110f26021913960400191505060405180910390fd5b90505b92915050565b6000610e4a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611029565b600073ffffffffffffffffffffffffffffffffffffffff8216610eb757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff166000908152602091909152604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8116610f0457600080fd5b610f0e8282610e95565b610f1757600080fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526020919091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b600873ffffffffffffffffffffffffffffffffffffffff821673f5af88e117747e87fc5929f2ff87221b1447652e1415610fa057506012610b2c565b610fa9826110e5565b15610b2c578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b505160ff1692915050565b600081836110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561109457818101518382015260200161107c565b50505050905090810190601f1680156110c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816110db57fe5b0495945050505050565b3b63ffffffff1615159056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a264697066735822122046629d88fad78f77c785e4fae8dba3eedf36f6be9105732a331669a3216903c164736f6c634300060c0033
Deployed Bytecode Sourcemap
8026:7221:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8352:69;;;;;;;;;;;;;;;;-1:-1:-1;8352:69:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8777:238;;;;;;;;;;;;;;;;-1:-1:-1;8777:238:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7143:93;;;:::i;7019:116::-;;;;;;;;;;;;;;;;-1:-1:-1;7019:116:0;;;;:::i;10930:2040::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10930:2040:0;;-1:-1:-1;10930:2040:0;;-1:-1:-1;;;;;10930:2040:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;9301:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9301:577:0;;-1:-1:-1;9301:577:0;-1:-1:-1;9301:577:0;:::i;6886:125::-;;;;;;;;;;;;;;;;-1:-1:-1;6886:125:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10250:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:371:0;;-1:-1:-1;10250:371:0;-1:-1:-1;10250:371:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8352:69;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8777:238::-;6829:28;6846:10;6829:16;:28::i;:::-;6821:37;;;;;;8905:22:::1;::::0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;;:31;;::::1;::::0;;;;;;;;;;:45;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;8962:47;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;8777:238:::0;;;:::o;7143:93::-;7195:33;7217:10;7195:21;:33::i;:::-;7143:93::o;7019:116::-;6829:28;6846:10;6829:16;:28::i;:::-;6821:37;;;;;;7100:27:::1;7119:7;7100:18;:27::i;:::-;7019:116:::0;:::o;10930:2040::-;8144:4;11226:15;8144:4;11017:12;11291:1674;11323:1;11308:5;:12;:16;11304:1;:20;11291:1674;;;11341:29;11372:22;11396:21;11419:22;11445:48;11470:5;11476:1;11470:8;;;;;;;;;;;;;;11480:5;11486:1;11490;11486:5;11480:12;;;;;;;;;;;;;;11445:24;:48::i;:::-;11340:153;;;;;;;;11553:24;11580:10;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11580:28:0;;-1:-1:-1;11621:38:0;;;11617:103;;;11694:16;11672:38;;11617:103;11773:19;11803:10;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11803:25:0;11932:21;;;;;;;;11803:25;;-1:-1:-1;11895:26:0;;11932:19;;;;;;:21;;;;;11803:25;;11932:21;;;;;;;:19;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11932:21:0;11924:30;;;-1:-1:-1;12072:34:0;;;12068:116;;;12126:48;:4;12140:32;;;12135:2;:38;12126:8;:48::i;:::-;12119:55;;12068:116;12217:14;12196:18;:35;12192:118;;;12251:49;:4;12265:33;;;12260:2;:39;12251:8;:49::i;:::-;12244:56;;12192:118;12425:17;12421:183;;;12462:49;12499:11;12462:32;:4;12471:2;:22;;;12462:8;:32::i;:::-;:36;;:49::i;:::-;12455:56;;12421:183;;;12545:49;12571:2;:22;;;12545:21;:4;12554:11;12545:8;:21::i;:49::-;12538:56;;12421:183;12741:13;12720:18;:34;12716:116;;;12774:48;:4;12788:32;;;12783:2;:38;12774:8;:48::i;:::-;12767:55;;12716:116;12865:14;12844:18;:35;12840:118;;;12899:49;:4;12913:33;;;12908:2;:39;12899:8;:49::i;:::-;12892:56;;12840:118;-1:-1:-1;;11326:3:0;;;;;-1:-1:-1;11291:1674:0;;-1:-1:-1;;;;11291:1674:0;;;10930:2040;;;;;:::o;9301:577::-;6829:28;6846:10;6829:16;:28::i;:::-;6821:37;;;;;;9478:33;;::::1;9470:78;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9563:37:::0;;::::1;9555:82;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;9693:6;9688:185;9701:18:::0;;::::1;9688:185;;;9777:12;;9790:1;9777:15;;;;;;;;;;;;;;;9735:14;:26;9750:7;;9758:1;9750:10;;;;;;;;;;;;;;;9735:26;;;;;;;;;;;;;;;:39;9762:8;;9771:1;9762:11;;;;;;;;;;;;;;;9735:39;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;9806:59;9824:7;;9832:1;9824:10;;;;;;;;;;;;;;;9836:8;;9845:1;9836:11;;;;;;;;;;;;;;;9849:12;;9862:1;9849:15;;;;;;;;;;;;;;;9806:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9721:3;;9688:185;;;;9301:577:::0;;;;;;:::o;6886:125::-;6950:4;6974:29;6950:4;6995:7;6974:20;:29::i;:::-;6967:36;;6886:125;;;;:::o;10250:371::-;10371:14;10387:27;10427:12;10441:17;10460:16;10480:14;10488:5;;10480:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10480:7:0;;-1:-1:-1;;;10480:14:0:i;:::-;10426:68;;-1:-1:-1;10426:68:0;-1:-1:-1;10426:68:0;-1:-1:-1;10542:33:0;10426:68;10542:19;:9;10426:68;10542:13;:19::i;:33::-;10533:42;10606:9;;-1:-1:-1;10250:371:0;;-1:-1:-1;;;;;;10250:371:0:o;5615:186::-;5692:21;;;5684:30;;;;;;5734:18;5738:4;5744:7;5734:3;:18::i;:::-;5733:19;5725:28;;;;;;5766:20;;:11;:20;;;;;;;;;;;:27;;;;5789:4;5766:27;;;5615:186::o;7398:154::-;7466:32;:16;7490:7;7466:23;:32::i;:::-;7514:30;;;;;;;;;;;7398:154;:::o;7244:146::-;7309:29;:16;7330:7;7309:20;:29::i;:::-;7354:28;;;;;;;;;;;7244:146;:::o;13379:833::-;13686:22;;;;13483:29;13686:22;;;:14;:22;;;;;;;;:31;;;;;;;;;;;;;;;13483:29;;13842:36;13838:156;;13921:23;;;;;;;;:14;:23;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;13921:14:0;-1:-1:-1;13838:156:0;14010:36;;;14002:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14143:19;14155:6;14143:11;:19::i;:::-;14127:35;;14186:20;14198:7;14186:11;:20::i;:::-;14169:37;;13379:833;;;;;;;:::o;2263:471::-;2321:7;2566:6;2562:47;;-1:-1:-1;2596:1:0;2589:8;;2562:47;2633:5;;;2637:1;2633;:5;:1;2657:5;;;;;:10;2649:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2725:1;-1:-1:-1;2263:471:0;;;;;:::o;3210:132::-;3268:7;3295:39;3299:1;3302;3295:39;;;;;;;;;;;;;;;;;:3;:39::i;6163:165::-;6235:4;6260:21;;;6252:30;;;;;;-1:-1:-1;6300:20:0;;:11;:20;;;;;;;;;;;;;;;6163:165::o;5880:189::-;5960:21;;;5952:30;;;;;;6001:18;6005:4;6011:7;6001:3;:18::i;:::-;5993:27;;;;;;6033:20;;6056:5;6033:20;;;;;;;;;;;:28;;;;;;5880:189::o;14359:479::-;14525:1;14588:60;;;14605:42;14588:60;14584:249;;;-1:-1:-1;14670:2:0;14584:249;;;14690:17;14701:5;14690:10;:17::i;:::-;14686:147;;;14808:5;14794:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14794:31:0;14783:42;;;14359:479;-1:-1:-1;;14359:479:0:o;3838:278::-;3924:7;3959:12;3952:5;3944:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:9;3999:1;3995;:5;;;;;;;3838:278;-1:-1:-1;;;;;3838:278:0:o;15007:237::-;15190:18;15229:8;;;;;15007:237::o
Swarm Source
ipfs://46629d88fad78f77c785e4fae8dba3eedf36f6be9105732a331669a3216903c1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.