S Price: $0.538692 (+18.75%)

Contract

0xe43fd55Da253628Ed7Cad5ab198664F5B3659DA9

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer From Wi...69664272025-02-08 0:39:294 days ago1738975169IN
0xe43fd55D...5B3659DA9
0 S0.0082643155.01
Update Conversio...39752402025-01-15 9:35:0328 days ago1736933703IN
0xe43fd55D...5B3659DA9
0 S0.0014590131.5
Update Conversio...39752342025-01-15 9:34:5728 days ago1736933697IN
0xe43fd55D...5B3659DA9
0 S0.0014604331.5

Latest 1 internal transaction

Parent Transaction Hash Block From To
39741512025-01-15 9:25:0628 days ago1736933106  Contract Creation0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Erc20ConversionProxy

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : Erc20ConversionProxy.sol
// 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;
  }
}

File 2 of 7 : Ownable.sol
// 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);
    }
}

File 3 of 7 : Context.sol
// 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;
    }
}

File 4 of 7 : ChainlinkConversionPath.sol
// 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;
  }
}

File 5 of 7 : ERC20FeeProxy.sol
// 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;
}

File 6 of 7 : Roles.sol
// 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];
  }
}

File 7 of 7 : WhitelistAdminRole.sol
// 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);
  }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

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


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.