ETH Price: $3,019.26 (+3.14%)

Contract

0x62559Ba07F93b1F298aACeF5a87935FE881Dbb6E
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XERC20Module

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 10000 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {ISettlementModule} from 'interfaces/common/ISettlementModule.sol';
import {IXERC20} from 'interfaces/common/IXERC20.sol';
import {IXERC20Module} from 'interfaces/intent/modules/IXERC20Module.sol';

/**
 * @title XERC20Module
 * @notice Module for handling minting and burning through XERC20 specific methods
 */
contract XERC20Module is IXERC20Module {
  /// @inheritdoc IXERC20Module
  mapping(address _user => mapping(address _asset => uint256 _amount)) public mintable;

  /// @inheritdoc IXERC20Module
  address public spoke;

  /**
   * @notice Check that the function is called by the local `EverclearSpoke`
   */
  modifier onlySpoke() {
    if (msg.sender != spoke) revert XERC20Module_HandleStrategy_OnlySpoke();
    _;
  }

  constructor(
    address _spoke
  ) {
    spoke = _spoke;
  }

  /// @inheritdoc ISettlementModule
  function handleMintStrategy(
    address _asset,
    address _recipient,
    address _fallbackRecipient,
    uint256 _amount,
    bytes calldata
  ) external onlySpoke returns (bool _success) {
    uint256 _limit = IXERC20(_asset).mintingCurrentLimitOf(address(this));
    if (_amount <= _limit) {
      try IXERC20(_asset).mint(_recipient, _amount) {
        _success = true;
      } catch {}
    }
    if (!_success) {
      mintable[_fallbackRecipient][_asset] += _amount;
      emit HandleMintStrategyFailed(_asset, _recipient, _amount);
    }
  }

  /// @inheritdoc ISettlementModule
  function handleBurnStrategy(address _asset, address _user, uint256 _amount, bytes calldata) external onlySpoke {
    uint256 _limit = IXERC20(_asset).burningMaxLimitOf(address(this));
    if (_limit < _amount) revert XERC20Module_HandleBurnStrategy_InsufficientBurningLimit(_asset, _limit, _amount);

    IXERC20(_asset).burn(_user, _amount);
  }

  /// @inheritdoc IXERC20Module
  function mintDebt(address _asset, address _recipient, uint256 _amount) external {
    uint256 _limit = IXERC20(_asset).mintingMaxLimitOf(address(this));

    if (_limit < _amount) revert XERC20Module_MintDebt_InsufficientMintingLimit(_asset, _limit, _amount);

    mintable[_recipient][_asset] -= _amount;
    IXERC20(_asset).mint(_recipient, _amount);

    emit DebtMinted(_asset, _recipient, _amount);
  }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

/**
 * @title ISettlementModule
 * @notice Interface for the base settlement module
 */
interface ISettlementModule {
  /*///////////////////////////////////////////////////////////////
                              LOGIC
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Handle a mint action for a specific strategy
   * @param _asset The address of the asset to mint
   * @param _recipient The recipient of the minted assets
   * @param _fallbackRecipient The fallback recipient of the minted assets (in case of failure)
   * @param _amount The amount to mint
   * @param _data Extra data needed by some modules
   * @return _success The outcome of the minting strategy
   * @dev In case of failure, the parent module will handle the operation accordingly
   */
  function handleMintStrategy(
    address _asset,
    address _recipient,
    address _fallbackRecipient,
    uint256 _amount,
    bytes calldata _data
  ) external returns (bool _success);

  /**
   * @notice Handle a burn action for a specific strategy
   * @param _asset The address of the asset to burn
   * @param _user The user whose assets are being burned
   * @param _amount The amount to burn
   * @param _data Extra data needed by some modules
   * @dev In case of failure, the `newIntent` flow will revert
   */
  function handleBurnStrategy(address _asset, address _user, uint256 _amount, bytes calldata _data) external;
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.4 <0.9.0;

interface IXERC20 {
  /**
   * @notice Contains the full minting and burning data for a particular bridge
   *
   * @param minterParams The minting parameters for the bridge
   * @param burnerParams The burning parameters for the bridge
   */
  struct Bridge {
    BridgeParameters minterParams;
    BridgeParameters burnerParams;
  }

  /**
   * @notice Contains the mint or burn parameters for a bridge
   *
   * @param timestamp The timestamp of the last mint/burn
   * @param ratePerSecond The rate per second of the bridge
   * @param maxLimit The max limit of the bridge
   * @param currentLimit The current limit of the bridge
   */
  struct BridgeParameters {
    uint256 timestamp;
    uint256 ratePerSecond;
    uint256 maxLimit;
    uint256 currentLimit;
  }

  /**
   * @notice Emits when a lockbox is set
   *
   * @param _lockbox The address of the lockbox
   */
  event LockboxSet(address _lockbox);

  /**
   * @notice Emits when a limit is set
   *
   * @param _mintingLimit The updated minting limit we are setting to the bridge
   * @param _burningLimit The updated burning limit we are setting to the bridge
   * @param _bridge The address of the bridge we are setting the limit too
   */
  event BridgeLimitsSet(uint256 _mintingLimit, uint256 _burningLimit, address indexed _bridge);

  /**
   * @notice Reverts when a user with too low of a limit tries to call mint/burn
   */
  error IXERC20_NotHighEnoughLimits();

  /**
   * @notice Reverts when caller is not the factory
   */
  error IXERC20_NotFactory();

  /**
   * @notice Reverts when limits are too high
   */
  error IXERC20_LimitsTooHigh();

  /**
   * @notice Sets the lockbox address
   *
   * @param _lockbox The address of the lockbox
   */
  function setLockbox(
    address _lockbox
  ) external;

  /**
   * @notice Updates the limits of any bridge
   * @dev Can only be called by the owner
   * @param _mintingLimit The updated minting limit we are setting to the bridge
   * @param _burningLimit The updated burning limit we are setting to the bridge
   * @param _bridge The address of the bridge we are setting the limits too
   */
  function setLimits(address _bridge, uint256 _mintingLimit, uint256 _burningLimit) external;

  /**
   * @notice Mints tokens for a user
   * @dev Can only be called by a minter
   * @param _user The address of the user who needs tokens minted
   * @param _amount The amount of tokens being minted
   */
  function mint(address _user, uint256 _amount) external;

  /**
   * @notice Burns tokens for a user
   * @dev Can only be called by a minter
   * @param _user The address of the user who needs tokens burned
   * @param _amount The amount of tokens being burned
   */
  function burn(address _user, uint256 _amount) external;

  /**
   * @notice Returns the max limit of a minter
   *
   * @param _minter The minter we are viewing the limits of
   *  @return _limit The limit the minter has
   */
  function mintingMaxLimitOf(
    address _minter
  ) external view returns (uint256 _limit);

  /**
   * @notice Returns the max limit of a bridge
   *
   * @param _bridge the bridge we are viewing the limits of
   * @return _limit The limit the bridge has
   */
  function burningMaxLimitOf(
    address _bridge
  ) external view returns (uint256 _limit);

  /**
   * @notice Returns the current limit of a minter
   *
   * @param _minter The minter we are viewing the limits of
   * @return _limit The limit the minter has
   */
  function mintingCurrentLimitOf(
    address _minter
  ) external view returns (uint256 _limit);

  /**
   * @notice Returns the current limit of a bridge
   *
   * @param _bridge the bridge we are viewing the limits of
   * @return _limit The limit the bridge has
   */
  function burningCurrentLimitOf(
    address _bridge
  ) external view returns (uint256 _limit);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;

import {ISettlementModule} from 'interfaces/common/ISettlementModule.sol';

/**
 * @title Interface
 * @notice Interface for
 */
interface IXERC20Module is ISettlementModule {
  /*///////////////////////////////////////////////////////////////
                              EVENTS
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Emitted when debt is minted in favor of a user
   * @param _asset The address of the minted asset
   * @param _recipient The address of the minted tokens recipient
   * @param _amount The amount of tokens minted
   */
  event DebtMinted(address indexed _asset, address indexed _recipient, uint256 _amount);

  /**
   * @notice Emitted when the handle mint strategy fails
   * @param _asset The address of the minted asset
   * @param _recipient The address of the minted tokens recipient
   * @param _amount The amount of tokens minted
   */
  event HandleMintStrategyFailed(address indexed _asset, address indexed _recipient, uint256 _amount);

  /*///////////////////////////////////////////////////////////////
                              ERRORS
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Thrown when the XERC20 minting limit is lower than the amount being minted
   * @param _asset The address of the asset
   * @param _limit The hit limit
   * @param _amount The amount trying to be minted
   */
  error XERC20Module_MintDebt_InsufficientMintingLimit(address _asset, uint256 _limit, uint256 _amount);

  /**
   * @notice Thrown when the XERC20 burning limit is lower than the amount being burned
   * @param _asset The address of the asset
   * @param _limit The hit limit
   * @param _amount The amount trying to be burned
   */
  error XERC20Module_HandleBurnStrategy_InsufficientBurningLimit(address _asset, uint256 _limit, uint256 _amount);

  /**
   * @notice Thrown when the caller is not the `EverclearSpoke`
   */
  error XERC20Module_HandleStrategy_OnlySpoke();

  /*///////////////////////////////////////////////////////////////
                              LOGIC
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Mints owed assets to an account
   * @param _asset The address of the asset to mint
   * @param _recipient The recipient of the minted assets
   * @param _amount The amount to mint
   */
  function mintDebt(address _asset, address _recipient, uint256 _amount) external;

  /*///////////////////////////////////////////////////////////////
                              VIEWS
  //////////////////////////////////////////////////////////////*/

  /**
   * @notice Returns the address of the local `EverclearSpoke`
   * @return _spoke The address of the `EverclearSpoke`
   */
  function spoke() external view returns (address _spoke);

  /**
   * @notice Returns the amount of tokens mintable by a user
   * @param _account The address of the owed user
   * @param _asset The address of the mintable asset
   * @return _amount The total mintable amount
   */
  function mintable(address _account, address _asset) external view returns (uint256 _amount);
}

Settings
{
  "remappings": [
    "ds-test/=../../node_modules/ds-test/src/",
    "forge-std/=../../node_modules/forge-std/src/",
    "isolmate/=../../node_modules/isolmate/src/",
    "@hyperlane/=../../node_modules/@hyperlane-xyz/core/contracts/",
    "@openzeppelin/=../../node_modules/@openzeppelin/",
    "@upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "xerc20/=lib/xerc20/solidity/contracts/",
    "contracts/=src/contracts/",
    "interfaces/=src/interfaces/",
    "utils/=script/utils/",
    "@eth-optimism/=../../node_modules/@eth-optimism/",
    "@hyperlane-xyz/=../../node_modules/@hyperlane-xyz/",
    "@layerzerolabs/=../../node_modules/@layerzerolabs/",
    "erc4626-tests/=lib/xerc20/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-gas-snapshot/=lib/xerc20/lib/permit2/lib/forge-gas-snapshot/src/",
    "fx-portal/=../../node_modules/fx-portal/",
    "openzeppelin-contracts/=lib/xerc20/lib/openzeppelin-contracts/",
    "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "openzeppelin/=lib/xerc20/lib/openzeppelin-contracts/contracts/",
    "permit2/=lib/xerc20/lib/permit2/",
    "prb-test/=lib/xerc20/lib/prb-test/src/",
    "prb/test/=lib/xerc20/lib/prb-test/src/",
    "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/",
    "solmate/=lib/xerc20/lib/permit2/lib/solmate/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_spoke","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"XERC20Module_HandleBurnStrategy_InsufficientBurningLimit","type":"error"},{"inputs":[],"name":"XERC20Module_HandleStrategy_OnlySpoke","type":"error"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"XERC20Module_MintDebt_InsufficientMintingLimit","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_asset","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"DebtMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_asset","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"HandleMintStrategyFailed","type":"event"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"handleBurnStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_fallbackRecipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"handleMintStrategy","outputs":[{"internalType":"bool","name":"_success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_asset","type":"address"}],"name":"mintable","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spoke","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052348015600e575f80fd5b50604051610a43380380610a43833981016040819052602b91604f565b600180546001600160a01b0319166001600160a01b0392909216919091179055607a565b5f60208284031215605e575f80fd5b81516001600160a01b03811681146073575f80fd5b9392505050565b6109bc806100875f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c806355389fb01161004d57806355389fb0146100e75780638cad6e771461010a578063f3a9a59e1461011f575f80fd5b806304b4d1fb1461006857806347bfbcc6146100a2575b5f80fd5b61008f610076366004610783565b5f60208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6001546100c29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610099565b6100fa6100f53660046107f9565b610132565b6040519015158152602001610099565b61011d610118366004610873565b610364565b005b61011d61012d3660046108ac565b61058f565b6001545f9073ffffffffffffffffffffffffffffffffffffffff163314610185576040517f5e28321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f651fd2680000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff89169063651fd26890602401602060405180830381865afa1580156101ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102139190610916565b90508085116102a4576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528916906340c10f19906044015f604051808303815f87803b158015610289575f80fd5b505af192505050801561029a575060015b156102a457600191505b816103595773ffffffffffffffffffffffffffffffffffffffff8087165f90815260208181526040808320938c16835292905290812080548792906102ea90849061095a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f471d6aaacf1235d0caa925387363751a53c3eae2c8fc2f0a39cc89d23f7170048760405161035091815260200190565b60405180910390a35b509695505050505050565b6040517f0c05f82c0000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff851690630c05f82c90602401602060405180830381865afa1580156103ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f29190610916565b905081811015610459576040517f29b0606800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081815260408083209388168352929052908120805484929061049a908490610973565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490528516906340c10f19906044015f604051808303815f87803b15801561050c575f80fd5b505af115801561051e573d5f803e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f582189f7394b93e93476738fd1de7cf483e1f99dfb27e00a7c345a393eefe18c8460405161058191815260200190565b60405180910390a350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105e0576040517f5e28321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fc1eb71370000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff87169063c1eb713790602401602060405180830381865afa15801561064a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066e9190610916565b9050838110156106d0576040517f2609e7ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024810182905260448101859052606401610450565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201869052871690639dc29fac906044015f604051808303815f87803b15801561073d575f80fd5b505af115801561074f573d5f803e3d5ffd5b50505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461077e575f80fd5b919050565b5f8060408385031215610794575f80fd5b61079d8361075b565b91506107ab6020840161075b565b90509250929050565b5f8083601f8401126107c4575f80fd5b50813567ffffffffffffffff8111156107db575f80fd5b6020830191508360208285010111156107f2575f80fd5b9250929050565b5f805f805f8060a0878903121561080e575f80fd5b6108178761075b565b95506108256020880161075b565b94506108336040880161075b565b935060608701359250608087013567ffffffffffffffff811115610855575f80fd5b61086189828a016107b4565b979a9699509497509295939492505050565b5f805f60608486031215610885575f80fd5b61088e8461075b565b925061089c6020850161075b565b9150604084013590509250925092565b5f805f805f608086880312156108c0575f80fd5b6108c98661075b565b94506108d76020870161075b565b935060408601359250606086013567ffffffffffffffff8111156108f9575f80fd5b610905888289016107b4565b969995985093965092949392505050565b5f60208284031215610926575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561096d5761096d61092d565b92915050565b8181038181111561096d5761096d61092d56fea264697066735822122077fba96493256ee32a184b0a03ada506f8fc4fb0aad23955235e2943d2003e9c64736f6c63430008190033000000000000000000000000f1d5d2d7c6c3d125ebbf137be5093c0c5d7fa032

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c806355389fb01161004d57806355389fb0146100e75780638cad6e771461010a578063f3a9a59e1461011f575f80fd5b806304b4d1fb1461006857806347bfbcc6146100a2575b5f80fd5b61008f610076366004610783565b5f60208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b6001546100c29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610099565b6100fa6100f53660046107f9565b610132565b6040519015158152602001610099565b61011d610118366004610873565b610364565b005b61011d61012d3660046108ac565b61058f565b6001545f9073ffffffffffffffffffffffffffffffffffffffff163314610185576040517f5e28321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f651fd2680000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff89169063651fd26890602401602060405180830381865afa1580156101ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102139190610916565b90508085116102a4576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018790528916906340c10f19906044015f604051808303815f87803b158015610289575f80fd5b505af192505050801561029a575060015b156102a457600191505b816103595773ffffffffffffffffffffffffffffffffffffffff8087165f90815260208181526040808320938c16835292905290812080548792906102ea90849061095a565b925050819055508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f471d6aaacf1235d0caa925387363751a53c3eae2c8fc2f0a39cc89d23f7170048760405161035091815260200190565b60405180910390a35b509695505050505050565b6040517f0c05f82c0000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff851690630c05f82c90602401602060405180830381865afa1580156103ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f29190610916565b905081811015610459576040517f29b0606800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8084165f908152602081815260408083209388168352929052908120805484929061049a908490610973565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018490528516906340c10f19906044015f604051808303815f87803b15801561050c575f80fd5b505af115801561051e573d5f803e3d5ffd5b505050508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f582189f7394b93e93476738fd1de7cf483e1f99dfb27e00a7c345a393eefe18c8460405161058191815260200190565b60405180910390a350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105e0576040517f5e28321b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fc1eb71370000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff87169063c1eb713790602401602060405180830381865afa15801561064a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066e9190610916565b9050838110156106d0576040517f2609e7ff00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024810182905260448101859052606401610450565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201869052871690639dc29fac906044015f604051808303815f87803b15801561073d575f80fd5b505af115801561074f573d5f803e3d5ffd5b50505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461077e575f80fd5b919050565b5f8060408385031215610794575f80fd5b61079d8361075b565b91506107ab6020840161075b565b90509250929050565b5f8083601f8401126107c4575f80fd5b50813567ffffffffffffffff8111156107db575f80fd5b6020830191508360208285010111156107f2575f80fd5b9250929050565b5f805f805f8060a0878903121561080e575f80fd5b6108178761075b565b95506108256020880161075b565b94506108336040880161075b565b935060608701359250608087013567ffffffffffffffff811115610855575f80fd5b61086189828a016107b4565b979a9699509497509295939492505050565b5f805f60608486031215610885575f80fd5b61088e8461075b565b925061089c6020850161075b565b9150604084013590509250925092565b5f805f805f608086880312156108c0575f80fd5b6108c98661075b565b94506108d76020870161075b565b935060408601359250606086013567ffffffffffffffff8111156108f9575f80fd5b610905888289016107b4565b969995985093965092949392505050565b5f60208284031215610926575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561096d5761096d61092d565b92915050565b8181038181111561096d5761096d61092d56fea264697066735822122077fba96493256ee32a184b0a03ada506f8fc4fb0aad23955235e2943d2003e9c64736f6c63430008190033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f1d5d2d7c6c3d125ebbf137be5093c0c5d7fa032

-----Decoded View---------------
Arg [0] : _spoke (address): 0xf1D5d2D7C6c3D125eBbf137BE5093c0C5D7Fa032

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f1d5d2d7c6c3d125ebbf137be5093c0c5d7fa032


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.