ETH Price: $2,925.15 (+4.08%)

Contract

0x508927b6247179D72142B60Fc69f5E4d58cbEb64

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve And Exec...323548842025-11-14 6:54:0373 days ago1763103243IN
0x508927b6...d58cbEb64
0 ETH0.00000050.00100065
Approve And Exec...323543322025-11-14 6:44:5173 days ago1763102691IN
0x508927b6...d58cbEb64
0 ETH0.00000050.00100031
Approve And Exec...323463762025-11-14 4:32:1573 days ago1763094735IN
0x508927b6...d58cbEb64
0 ETH0.00000050.0010003
Approve And Exec...323462892025-11-14 4:30:4873 days ago1763094648IN
0x508927b6...d58cbEb64
0 ETH0.000000430.00100029
Proposal322520302025-11-13 2:19:4974 days ago1763000389IN
0x508927b6...d58cbEb64
0 ETH0.000001440.003
Proposal322520292025-11-13 2:19:4874 days ago1763000388IN
0x508927b6...d58cbEb64
0 ETH0.000001580.003
Approve And Exec...297549762025-10-15 4:42:15103 days ago1760503335IN
0x508927b6...d58cbEb64
0 ETH0.000000430.00100028
Approve And Exec...297549752025-10-15 4:42:14103 days ago1760503334IN
0x508927b6...d58cbEb64
0 ETH0.000000140.00100028
Approve And Exec...297549742025-10-15 4:42:13103 days ago1760503333IN
0x508927b6...d58cbEb64
0 ETH0.000000430.00100028
Proposal297531572025-10-15 4:11:56103 days ago1760501516IN
0x508927b6...d58cbEb64
0 ETH0.000000040.00010028
Proposal297531242025-10-15 4:11:23103 days ago1760501483IN
0x508927b6...d58cbEb64
0 ETH0.000000090.00020448
Proposal296751992025-10-14 6:32:38104 days ago1760423558IN
0x508927b6...d58cbEb64
0 ETH0.000000210.001509

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GroupApprove

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

import "./IMPC.sol";
import "./ICross.sol";

/**
 * @title GroupApprove
 * @dev Contract that implements a multi-signature governance mechanism for cross-chain operations
 * where proposals require approval from a storeman group before execution
 *
 * @custom:architecture This contract acts as a governance layer for critical cross-chain operations,
 * requiring both foundation proposal and storeman group approval for actions
 */
contract GroupApprove {
    /**
     * @dev Structure representing an executable task
     * @param to Target contract address to call
     * @param data Call data to be executed
     * @param executed Flag indicating if the task has been executed
     */
    struct Task {
        address to;
        bytes data;
        bool executed;
    }

    /**
     * @dev Structure for signature verification data
     * @param sigHash Hash of the message being signed
     * @param smgID Storeman group ID that signed the message
     * @param r R component of the signature (contains X and Y coordinates)
     * @param s S component of the signature
     */
    struct SigData {
        bytes32 sigHash;
        bytes32 smgID; 
        bytes r;
        bytes32 s;
    }

    // slip-0044 chainId
    uint256 public chainId;
    uint256 public taskCount;
    address public foundation;
    address public signatureVerifier;
    address public oracle;

    // proposalId => task
    mapping(uint256 => Task) public tasks;

    /**
     * @dev Enum representing various states a storeman group can be in
     */
    enum GroupStatus { none, initial, curveSet, failed, selected, ready, unregistered, dismissed }

    /**
     * @dev Restricts function access to the foundation address
     */
    modifier onlyFoundation() {
        require(msg.sender == foundation, "not foundation");
        _;
    }

    /**
     * @dev Restricts function access to the contract itself
     * Used for functions that should only be called via executing a task
     */
    modifier onlySelf() {
        require(msg.sender == address(this), "not self");
        _;
    }

    /**
     * @dev Validates signature from a storeman group before executing a function
     * @param proposalId ID of the proposal being approved
     * @param smgID ID of the storeman group signing the approval
     * @param r R component of the signature
     * @param s S component of the signature
     */
    modifier onlySmg(uint proposalId, bytes32 smgID, bytes calldata r, bytes32 s) {
        bytes32 sigHash = keccak256(abi.encode(proposalId, chainId));
        _verifyMpcSignature(
            SigData(
                sigHash, smgID, r, s
            )
        );
        _;
    }

    /**
     * @dev Emitted when a new proposal is created
     * @param proposalId Unique identifier for the proposal
     * @param to Target contract address to call
     * @param data Call data to be executed
     */
    event Proposal(
        uint256 indexed proposalId, 
        address indexed to, 
        bytes data
    );

    /**
     * @dev Emitted when a proposal is approved and executed
     * @param proposalId Unique identifier for the proposal
     * @param to Target contract address that was called
     * @param data Call data that was executed
     * @param smgID ID of the storeman group that approved the proposal
     */
    event ApprovedAndExecuted(
        uint256 indexed proposalId, 
        address indexed to, 
        bytes data,
        bytes32 smgID
    );

    /**
     * @dev Emitted when the foundation address is transferred
     * @param oldFoundation Previous foundation address
     * @param newFoundation New foundation address
     */
    event TransferFoundation(
        address indexed oldFoundation, 
        address indexed newFoundation
    );

    /**
     * @dev Error thrown when signature verification fails
     * @param smgID ID of the storeman group
     * @param sigHash Hash of the signed message
     * @param r R component of the signature
     * @param s S component of the signature
     */
    error SignatureVerifyFailed(
        bytes32 smgID,
        bytes32 sigHash,
        bytes r,
        bytes32 s
    );

    /**
     * @dev Error thrown when a storeman group is not in ready state
     * @param smgID ID of the storeman group
     * @param status Current status of the storeman group
     * @param timestamp Current block timestamp
     * @param startTime Start time of the storeman group
     * @param endTime End time of the storeman group
     */
    error StoremanGroupNotReady(
        bytes32 smgID,
        uint256 status,
        uint256 timestamp,
        uint256 startTime,
        uint256 endTime
    );
    
    /**
     * @dev Constructor initializes the contract with key addresses and validates cross-chain configuration
     * @param _foundation Address of the foundation that can create proposals
     * @param _signatureVerifier Address of the contract used to verify signatures
     * @param _oracle Address of the oracle contract that provides storeman group information
     * @param _cross Address of the cross-chain bridge contract
     *
     * @notice Validates that the provided oracle and signatureVerifier match the ones in the cross contract
     */
    constructor(address _foundation, address _signatureVerifier, address _oracle, address _cross) {
        require(_foundation != address(0), "foundation is empty");
        address _oracleCross;
        address _signatureVerifierCross;

        // cross check oracle and signatureVerifier address with cross contract
        (, _oracleCross, , , _signatureVerifierCross) = ICross(_cross).getPartners();
        oracle = _oracle;
        signatureVerifier = _signatureVerifier;
        require(_oracle == _oracleCross, "oracle not match");
        require(_signatureVerifier == _signatureVerifierCross, "signatureVerifier not match");

        chainId = ICross(_cross).currentChainID(); // read from cross
        require(chainId != 0, "chainId is empty");

        foundation = _foundation;
    }

    /**
     * @dev Creates a new proposal to be executed after storeman group approval
     * @param _chainId Chain ID for which the proposal is intended
     * @param _to Target contract address to call
     * @param _data Call data to be executed
     *
     * @notice Only the foundation can create proposals
     * @notice The chain ID must match the current chain ID
     */
    function proposal(
        uint256 _chainId,
        address _to, 
        bytes memory _data
    ) external onlyFoundation {
        require(_data.length > 0, "data is empty");
        require(_to != address(0), "to is empty");
        require(_chainId == chainId, "chainId not match");

        // save task 
        tasks[taskCount] = Task(_to, _data, false);
        emit Proposal(taskCount, _to, _data);
        taskCount++;
    }

    /**
     * @dev Approves and executes a proposal with storeman group signature
     * @param proposalId ID of the proposal to execute
     * @param smgID ID of the storeman group providing approval
     * @param r R component of the signature
     * @param s S component of the signature
     *
     * @notice Requires valid signature from an active storeman group
     * @notice The task must not have been executed before
     */
    function approveAndExecute(
        uint256 proposalId,
        bytes32 smgID,
        bytes calldata r,
        bytes32 s
    ) external onlySmg(proposalId, smgID, r, s) {
        Task storage task = tasks[proposalId];
        require(task.to != address(0), "task not exists");
        require(!task.executed, "task already executed");

        (bool success, ) = task.to.call(task.data);
        require(success, "call failed");
        task.executed = true;
        emit ApprovedAndExecuted(proposalId, task.to, task.data, smgID);
    }

    /**
     * @dev Sets the halt status of a cross-chain contract
     * @param _to Address of the cross-chain contract to halt or resume
     * @param _halt True to halt, false to resume
     *
     * @notice Only the foundation can call this function
     */
    function halt(address _to, bool _halt) external onlyFoundation {
        ICross(_to).setHalt(_halt);
    }

    /**
     * @dev Transfers the foundation role to a new address
     * @param _newFoundation Address of the new foundation
     *
     * @notice This function can only be called through executing a task
     * @notice Ensures security by requiring both foundation proposal and storeman approval
     */
    function transferFoundation(address _newFoundation) external onlySelf {
        require(_newFoundation != address(0), "new foundation is empty");
        require(_newFoundation != foundation, "new foundation is same as old");
        foundation = _newFoundation;
        emit TransferFoundation(foundation, _newFoundation);
    }

    // -------- internal functions --------

    /**
     * @notice Check if a storeman group is ready and retrieve its cryptographic information
     * @param smgID ID of the storeman group to check
     * @return curveID ID of the elliptic curve used by the storeman group
     * @return PK Public key of the storeman group
     *
     * @dev Reverts if the storeman group is not in ready state or outside its active time window
     */
    function _acquireReadySmgInfo(bytes32 smgID)
        internal
        view
        returns (uint curveID, bytes memory PK)
    {
        uint8 status;
        uint startTime;
        uint endTime;
        (,status,,,,curveID,,PK,,startTime,endTime) = IMPC(oracle).getStoremanGroupConfig(smgID);

        if (!(status == uint8(GroupStatus.ready) && block.timestamp >= startTime && block.timestamp <= endTime)) {
            revert StoremanGroupNotReady({
                smgID: smgID,
                status: uint256(status),
                timestamp: block.timestamp,
                startTime: startTime,
                endTime: endTime
            });
        }

        return (curveID, PK);
    }

    /**
     * @notice Convert bytes to bytes32 at a specific offset
     * @param b Bytes array to convert
     * @param offset Offset in the bytes array
     * @return result The bytes32 value at the specified offset
     * 
     * @dev Uses assembly for gas-efficient conversion
     */
    function _bytesToBytes32(bytes memory b, uint offset) internal pure returns (bytes32 result) {
        assembly {
            result := mload(add(add(b, offset), 32))
        }
    }

    /**
     * @dev Verifies an MPC signature for a given message and Storeman Group ID
     * @param sig The signature data structure containing all verification components
     *
     * @dev Reverts with SignatureVerifyFailed if verification fails
     * @dev Uses the external signature verifier contract for the actual verification
     */
    function _verifyMpcSignature(SigData memory sig) internal {
        uint curveID;
        bytes memory PK;

        // Acquire the curve ID and group public key for the given Storeman Group ID
        (curveID, PK) = _acquireReadySmgInfo(sig.smgID);

        // Extract the X and Y components of the group public key
        bytes32 PKx = _bytesToBytes32(PK, 0);
        bytes32 PKy = _bytesToBytes32(PK, 32);

        // Extract the X and Y components of the signature
        bytes32 Rx = _bytesToBytes32(sig.r, 0);
        bytes32 Ry = _bytesToBytes32(sig.r, 32);

        // Verify the signature using the Wanchain MPC contract
        if (!IMPC(signatureVerifier).verify(curveID, sig.s, PKx, PKy, Rx, Ry, sig.sigHash)) {
            revert SignatureVerifyFailed({
                smgID: sig.smgID,
                sigHash: sig.sigHash,
                r: sig.r,
                s: sig.s
            });
        }
    }
}

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

/**
 * @title ICross
 * @dev Interface for the cross-chain functionality contract that handles asset transfers and communication between chains
 * 
 * @custom:key-features
 * - Enable/disable cross-chain functionality
 * - Get related contract addresses
 * - Get current chain ID information
 */
interface ICross {
    /**
     * @dev Sets the halt status of the cross-chain contract
     * 
     * @param halt true to halt cross-chain functionality, false to resume
     */
    function setHalt(bool halt) external;
    
    /**
     * @dev Gets the addresses of related contracts in the cross-chain system
     * 
     * @return tokenManager Token manager contract address
     * @return smgAdminProxy Storeman group admin proxy contract address
     * @return smgFeeProxy Storeman group fee proxy contract address
     * @return quota Quota management contract address
     * @return sigVerifier Signature verification contract address
     * 
     * @custom:usage
     * - Used to verify key contract addresses
     * - Ensures system component consistency
     */
    function getPartners() external view returns(address tokenManager, address smgAdminProxy, address smgFeeProxy, address quota, address sigVerifier);
    
    /**
     * @dev Gets the ID of the current blockchain
     * 
     * @return uint256 The unique identifier of the current blockchain
     * 
     * @custom:usage
     * - Used in cross-chain transactions to verify target chains
     * - Ensures messages are sent to the correct target chain
     */
    function currentChainID() external view returns (uint256);
}

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

/**
 * @title IMPC
 * @dev Interface for Multi-Party Computation (MPC) operations related to storeman groups
 * 
 * @custom:key-features
 * - Storeman group configuration retrieval
 * - Threshold signature verification
 * - Cross-chain security validation
 * 
 * @custom:security
 * - Cryptographic signature verification
 * - Elliptic curve operations
 * - Group public key management
 */
interface IMPC {
    /**
     * @dev Retrieves the configuration of a Storeman Group by ID
     * @param id The ID of the Storeman Group to retrieve
     * @return groupId The group ID of the Storeman Group
     * @return status The status of the Storeman Group
     * @return deposit The deposit amount of the Storeman Group
     * @return chain1 The ID of the first chain supported by the Storeman Group
     * @return chain2 The ID of the second chain supported by the Storeman Group
     * @return curve1 The ID of the first elliptic curve supported by the Storeman Group
     * @return curve2 The ID of the second elliptic curve supported by the Storeman Group
     * @return gpk1 The Group Public Key for the first elliptic curve
     * @return gpk2 The Group Public Key for the second elliptic curve
     * @return startTime The start time of the Storeman Group
     * @return endTime The end time of the Storeman Group
     * 
     * @custom:usage
     * - Used to validate storeman group status
     * - Provides cryptographic parameters for signature verification
     * - Ensures group is active within its time window
     */
    function getStoremanGroupConfig(
        bytes32 id
    ) external view returns (
        bytes32 groupId,
        uint8 status,
        uint deposit,
        uint chain1,
        uint chain2,
        uint curve1,
        uint curve2,
        bytes memory gpk1,
        bytes memory gpk2,
        uint startTime,
        uint endTime
    );

    /**
     * @dev Verifies a signature using the provided parameters
     * @param curveId The ID of the elliptic curve used for the signature
     * @param signature The signature to be verified
     * @param groupKeyX The X component of the group public key
     * @param groupKeyY The Y component of the group public key
     * @param randomPointX The X component of the random point
     * @param randomPointY The Y component of the random point
     * @param message The message that was signed
     * @return true if the signature is valid, false otherwise
     * 
     * @custom:security
     * - Performs threshold signature verification
     * - Uses secure elliptic curve cryptography
     * - Critical for cross-chain message authentication
     * - Protects against signature forgery attacks
     */
    function verify(
        uint curveId,
        bytes32 signature,
        bytes32 groupKeyX,
        bytes32 groupKeyY,
        bytes32 randomPointX,
        bytes32 randomPointY,
        bytes32 message
    ) external returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_foundation","type":"address"},{"internalType":"address","name":"_signatureVerifier","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_cross","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"smgID","type":"bytes32"},{"internalType":"bytes32","name":"sigHash","type":"bytes32"},{"internalType":"bytes","name":"r","type":"bytes"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"SignatureVerifyFailed","type":"error"},{"inputs":[{"internalType":"bytes32","name":"smgID","type":"bytes32"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"StoremanGroupNotReady","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"smgID","type":"bytes32"}],"name":"ApprovedAndExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldFoundation","type":"address"},{"indexed":true,"internalType":"address","name":"newFoundation","type":"address"}],"name":"TransferFoundation","type":"event"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bytes32","name":"smgID","type":"bytes32"},{"internalType":"bytes","name":"r","type":"bytes"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"approveAndExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"bool","name":"_halt","type":"bool"}],"name":"halt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"proposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signatureVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taskCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tasks","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newFoundation","type":"address"}],"name":"transferFoundation","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200154a3803806200154a8339810160408190526200003491620002d1565b6001600160a01b038416620000905760405162461bcd60e51b815260206004820152601360248201527f666f756e646174696f6e20697320656d7074790000000000000000000000000060448201526064015b60405180910390fd5b600080826001600160a01b03166373e29b0d6040518163ffffffff1660e01b815260040160a060405180830381865afa158015620000d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000f891906200032e565b600480546001600160a01b03199081166001600160a01b038c8116918217909355600380549092168d84161790915594975090955086169092149250620001789150505760405162461bcd60e51b815260206004820152601060248201526f0dee4c2c6d8ca40dcdee840dac2e8c6d60831b604482015260640162000087565b806001600160a01b0316856001600160a01b031614620001db5760405162461bcd60e51b815260206004820152601b60248201527f7369676e61747572655665726966696572206e6f74206d617463680000000000604482015260640162000087565b826001600160a01b031663b179e1e76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024091906200039e565b600081815503620002875760405162461bcd60e51b815260206004820152601060248201526f636861696e496420697320656d70747960801b604482015260640162000087565b5050600280546001600160a01b0319166001600160a01b03959095169490941790935550620003b8915050565b80516001600160a01b0381168114620002cc57600080fd5b919050565b60008060008060808587031215620002e857600080fd5b620002f385620002b4565b93506200030360208601620002b4565b92506200031360408601620002b4565b91506200032360608601620002b4565b905092959194509250565b600080600080600060a086880312156200034757600080fd5b6200035286620002b4565b94506200036260208701620002b4565b93506200037260408701620002b4565b92506200038260608701620002b4565b91506200039260808701620002b4565b90509295509295909350565b600060208284031215620003b157600080fd5b5051919050565b61118280620003c86000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638d977672116100665780638d97767214610121578063946951fb146101435780639a8a059214610156578063b6cb58a51461016d578063fde919f61461017657600080fd5b8063229bb7af146100a3578063320432d4146100b8578063413df8aa146100cb57806341fbb050146100de5780637dc0d1d01461010e575b600080fd5b6100b66100b1366004610b23565b610189565b005b6100b66100c6366004610bbd565b61037f565b6100b66100d9366004610bdf565b6104b9565b6002546100f1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6004546100f1906001600160a01b031681565b61013461012f366004610c67565b610723565b60405161010593929190610cd0565b6100b6610151366004610d17565b6107db565b61015f60005481565b604051908152602001610105565b61015f60015481565b6003546100f1906001600160a01b031681565b6002546001600160a01b031633146101d95760405162461bcd60e51b815260206004820152600e60248201526d3737ba103337bab73230ba34b7b760911b60448201526064015b60405180910390fd5b600081511161021a5760405162461bcd60e51b815260206004820152600d60248201526c6461746120697320656d70747960981b60448201526064016101d0565b6001600160a01b03821661025e5760405162461bcd60e51b815260206004820152600b60248201526a746f20697320656d70747960a81b60448201526064016101d0565b60005483146102a35760405162461bcd60e51b81526020600482015260116024820152700c6d0c2d2dc92c840dcdee840dac2e8c6d607b1b60448201526064016101d0565b604080516060810182526001600160a01b03848116825260208083018581526000848601819052600180548252600590935294909420835181546001600160a01b0319169316929092178255925191929091908201906103039082610dd3565b50604091820151600291909101805460ff191691151591909117905560015490516001600160a01b03841691907f4c589e53ce12231a0fbfdfff2a62db33943cd4b856b2bd59059f77d42a54c0399061035d908590610e93565b60405180910390a36001805490600061037583610ea6565b9190505550505050565b3330146103b95760405162461bcd60e51b81526020600482015260086024820152673737ba1039b2b63360c11b60448201526064016101d0565b6001600160a01b03811661040f5760405162461bcd60e51b815260206004820152601760248201527f6e657720666f756e646174696f6e20697320656d70747900000000000000000060448201526064016101d0565b6002546001600160a01b039081169082160361046d5760405162461bcd60e51b815260206004820152601d60248201527f6e657720666f756e646174696f6e2069732073616d65206173206f6c6400000060448201526064016101d0565b600280546001600160a01b0319166001600160a01b03831690811790915560405181907fc764c5bb0c90175b0736137bb096f668df98f6927dc0f46ac0326a96b446a49a90600090a350565b84848484846000856000546040516020016104de929190918252602082015260400190565b604051602081830303815290604052805190602001209050610554604051806080016040528083815260200187815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001849052610885565b60008b815260056020526040902080546001600160a01b03166105ab5760405162461bcd60e51b815260206004820152600f60248201526e7461736b206e6f742065786973747360881b60448201526064016101d0565b600281015460ff16156105f85760405162461bcd60e51b81526020600482015260156024820152741d185cdac8185b1c9958591e48195e1958dd5d1959605a1b60448201526064016101d0565b80546040516000916001600160a01b031690610618906001850190610ecd565b6000604051808303816000865af19150503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b50509050806106995760405162461bcd60e51b815260206004820152600b60248201526a18d85b1b0819985a5b195960aa1b60448201526064016101d0565b60018260020160006101000a81548160ff0219169083151502179055508160000160009054906101000a90046001600160a01b03166001600160a01b03168d7ff171265be1c5f8abad69597cc0df677443efea8c2e769e9709e08585f4ef58ac846001018f60405161070c929190610f43565b60405180910390a350505050505050505050505050565b600560205260009081526040902080546001820180546001600160a01b03909216929161074f90610d4e565b80601f016020809104026020016040519081016040528092919081815260200182805461077b90610d4e565b80156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b5050506002909301549192505060ff1683565b6002546001600160a01b031633146108265760405162461bcd60e51b815260206004820152600e60248201526d3737ba103337bab73230ba34b7b760911b60448201526064016101d0565b60405163f495438760e01b815281151560048201526001600160a01b0383169063f495438790602401600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050565b600060606108968360200151610994565b60208181015160408084015188820151808501519083015160035460608c01518c518651631161eded60e21b8152600481018c9052602481019290925260448201889052606482018690526084820185905260a4820184905260c48201529451989a509698509396919590946001600160a01b0390911692634587b7b49260e4808301939282900301816000875af1158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190610fd7565b61098b57602087015187516040808a015160608b01519151635d2d123b60e11b81526101d094939290600401610ff4565b50505050505050565b600480546040516344cefb6960e01b81526000926060928492839283926001600160a01b0316916344cefb69916109d1918a910190815260200190565b600060405180830381865afa1580156109ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a169190810190611082565b949e50919c50969a50985090965060059550610a33945050505050565b60ff168360ff16148015610a475750814210155b8015610a535750804211155b610a90576040516320b0fccf60e01b81526004810187905260ff84166024820152426044820152606481018390526084810182905260a4016101d0565b505050915091565b80356001600160a01b0381168114610aaf57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610af357610af3610ab4565b604052919050565b600067ffffffffffffffff821115610b1557610b15610ab4565b50601f01601f191660200190565b600080600060608486031215610b3857600080fd5b83359250610b4860208501610a98565b9150604084013567ffffffffffffffff811115610b6457600080fd5b8401601f81018613610b7557600080fd5b8035610b88610b8382610afb565b610aca565b818152876020838501011115610b9d57600080fd5b816020840160208301376000602083830101528093505050509250925092565b600060208284031215610bcf57600080fd5b610bd882610a98565b9392505050565b600080600080600060808688031215610bf757600080fd5b8535945060208601359350604086013567ffffffffffffffff80821115610c1d57600080fd5b818801915088601f830112610c3157600080fd5b813581811115610c4057600080fd5b896020828501011115610c5257600080fd5b96999598505060200195606001359392505050565b600060208284031215610c7957600080fd5b5035919050565b60005b83811015610c9b578181015183820152602001610c83565b50506000910152565b60008151808452610cbc816020860160208601610c80565b601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201819052600090610cf490830185610ca4565b90508215156040830152949350505050565b8015158114610d1457600080fd5b50565b60008060408385031215610d2a57600080fd5b610d3383610a98565b91506020830135610d4381610d06565b809150509250929050565b600181811c90821680610d6257607f821691505b602082108103610d8257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610dce57600081815260208120601f850160051c81016020861015610daf5750805b601f850160051c820191505b8181101561087d57828155600101610dbb565b505050565b815167ffffffffffffffff811115610ded57610ded610ab4565b610e0181610dfb8454610d4e565b84610d88565b602080601f831160018114610e365760008415610e1e5750858301515b600019600386901b1c1916600185901b17855561087d565b600085815260208120601f198616915b82811015610e6557888601518255948401946001909101908401610e46565b5085821015610e835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610bd86020830184610ca4565b600060018201610ec657634e487b7160e01b600052601160045260246000fd5b5060010190565b6000808354610edb81610d4e565b60018281168015610ef35760018114610f0857610f37565b60ff1984168752821515830287019450610f37565b8760005260208060002060005b85811015610f2e5781548a820152908401908201610f15565b50505082870194505b50929695505050505050565b604081526000808454610f5581610d4e565b8060408601526060600180841660008114610f775760018114610f9157610fc2565b60ff1985168884015283151560051b880183019550610fc2565b8960005260208060002060005b86811015610fb95781548b8201870152908401908201610f9e565b8a018501975050505b50505050506020929092019290925292915050565b600060208284031215610fe957600080fd5b8151610bd881610d06565b8481528360208201526080604082015260006110136080830185610ca4565b905082606083015295945050505050565b805160ff81168114610aaf57600080fd5b600082601f83011261104657600080fd5b8151611054610b8382610afb565b81815284602083860101111561106957600080fd5b61107a826020830160208701610c80565b949350505050565b60008060008060008060008060008060006101608c8e0312156110a457600080fd5b8b519a506110b460208d01611024565b995060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015167ffffffffffffffff8111156110f357600080fd5b6110ff8e828f01611035565b9450506101008c015167ffffffffffffffff81111561111d57600080fd5b6111298e828f01611035565b9350506101208c015191506101408c015190509295989b509295989b909396995056fea2646970667358221220ba41d8358b895758c0f4f0b64e5b62fa1c14b479162cd23cc56bc3c6a1cade8164736f6c6343000812003300000000000000000000000005caf88ff0b089a9f31ea7275bcaa90f8ad90fb900000000000000000000000086ec03f7bafab24f69ebc456cc429b6f389ea4e4000000000000000000000000e0c8c2fdc6fc440bd1ec918299585321494536ff0000000000000000000000009c11539603661b6c90e65e96aa8ac4b8e4b914c8

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638d977672116100665780638d97767214610121578063946951fb146101435780639a8a059214610156578063b6cb58a51461016d578063fde919f61461017657600080fd5b8063229bb7af146100a3578063320432d4146100b8578063413df8aa146100cb57806341fbb050146100de5780637dc0d1d01461010e575b600080fd5b6100b66100b1366004610b23565b610189565b005b6100b66100c6366004610bbd565b61037f565b6100b66100d9366004610bdf565b6104b9565b6002546100f1906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6004546100f1906001600160a01b031681565b61013461012f366004610c67565b610723565b60405161010593929190610cd0565b6100b6610151366004610d17565b6107db565b61015f60005481565b604051908152602001610105565b61015f60015481565b6003546100f1906001600160a01b031681565b6002546001600160a01b031633146101d95760405162461bcd60e51b815260206004820152600e60248201526d3737ba103337bab73230ba34b7b760911b60448201526064015b60405180910390fd5b600081511161021a5760405162461bcd60e51b815260206004820152600d60248201526c6461746120697320656d70747960981b60448201526064016101d0565b6001600160a01b03821661025e5760405162461bcd60e51b815260206004820152600b60248201526a746f20697320656d70747960a81b60448201526064016101d0565b60005483146102a35760405162461bcd60e51b81526020600482015260116024820152700c6d0c2d2dc92c840dcdee840dac2e8c6d607b1b60448201526064016101d0565b604080516060810182526001600160a01b03848116825260208083018581526000848601819052600180548252600590935294909420835181546001600160a01b0319169316929092178255925191929091908201906103039082610dd3565b50604091820151600291909101805460ff191691151591909117905560015490516001600160a01b03841691907f4c589e53ce12231a0fbfdfff2a62db33943cd4b856b2bd59059f77d42a54c0399061035d908590610e93565b60405180910390a36001805490600061037583610ea6565b9190505550505050565b3330146103b95760405162461bcd60e51b81526020600482015260086024820152673737ba1039b2b63360c11b60448201526064016101d0565b6001600160a01b03811661040f5760405162461bcd60e51b815260206004820152601760248201527f6e657720666f756e646174696f6e20697320656d70747900000000000000000060448201526064016101d0565b6002546001600160a01b039081169082160361046d5760405162461bcd60e51b815260206004820152601d60248201527f6e657720666f756e646174696f6e2069732073616d65206173206f6c6400000060448201526064016101d0565b600280546001600160a01b0319166001600160a01b03831690811790915560405181907fc764c5bb0c90175b0736137bb096f668df98f6927dc0f46ac0326a96b446a49a90600090a350565b84848484846000856000546040516020016104de929190918252602082015260400190565b604051602081830303815290604052805190602001209050610554604051806080016040528083815260200187815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001849052610885565b60008b815260056020526040902080546001600160a01b03166105ab5760405162461bcd60e51b815260206004820152600f60248201526e7461736b206e6f742065786973747360881b60448201526064016101d0565b600281015460ff16156105f85760405162461bcd60e51b81526020600482015260156024820152741d185cdac8185b1c9958591e48195e1958dd5d1959605a1b60448201526064016101d0565b80546040516000916001600160a01b031690610618906001850190610ecd565b6000604051808303816000865af19150503d8060008114610655576040519150601f19603f3d011682016040523d82523d6000602084013e61065a565b606091505b50509050806106995760405162461bcd60e51b815260206004820152600b60248201526a18d85b1b0819985a5b195960aa1b60448201526064016101d0565b60018260020160006101000a81548160ff0219169083151502179055508160000160009054906101000a90046001600160a01b03166001600160a01b03168d7ff171265be1c5f8abad69597cc0df677443efea8c2e769e9709e08585f4ef58ac846001018f60405161070c929190610f43565b60405180910390a350505050505050505050505050565b600560205260009081526040902080546001820180546001600160a01b03909216929161074f90610d4e565b80601f016020809104026020016040519081016040528092919081815260200182805461077b90610d4e565b80156107c85780601f1061079d576101008083540402835291602001916107c8565b820191906000526020600020905b8154815290600101906020018083116107ab57829003601f168201915b5050506002909301549192505060ff1683565b6002546001600160a01b031633146108265760405162461bcd60e51b815260206004820152600e60248201526d3737ba103337bab73230ba34b7b760911b60448201526064016101d0565b60405163f495438760e01b815281151560048201526001600160a01b0383169063f495438790602401600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050565b600060606108968360200151610994565b60208181015160408084015188820151808501519083015160035460608c01518c518651631161eded60e21b8152600481018c9052602481019290925260448201889052606482018690526084820185905260a4820184905260c48201529451989a509698509396919590946001600160a01b0390911692634587b7b49260e4808301939282900301816000875af1158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190610fd7565b61098b57602087015187516040808a015160608b01519151635d2d123b60e11b81526101d094939290600401610ff4565b50505050505050565b600480546040516344cefb6960e01b81526000926060928492839283926001600160a01b0316916344cefb69916109d1918a910190815260200190565b600060405180830381865afa1580156109ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a169190810190611082565b949e50919c50969a50985090965060059550610a33945050505050565b60ff168360ff16148015610a475750814210155b8015610a535750804211155b610a90576040516320b0fccf60e01b81526004810187905260ff84166024820152426044820152606481018390526084810182905260a4016101d0565b505050915091565b80356001600160a01b0381168114610aaf57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610af357610af3610ab4565b604052919050565b600067ffffffffffffffff821115610b1557610b15610ab4565b50601f01601f191660200190565b600080600060608486031215610b3857600080fd5b83359250610b4860208501610a98565b9150604084013567ffffffffffffffff811115610b6457600080fd5b8401601f81018613610b7557600080fd5b8035610b88610b8382610afb565b610aca565b818152876020838501011115610b9d57600080fd5b816020840160208301376000602083830101528093505050509250925092565b600060208284031215610bcf57600080fd5b610bd882610a98565b9392505050565b600080600080600060808688031215610bf757600080fd5b8535945060208601359350604086013567ffffffffffffffff80821115610c1d57600080fd5b818801915088601f830112610c3157600080fd5b813581811115610c4057600080fd5b896020828501011115610c5257600080fd5b96999598505060200195606001359392505050565b600060208284031215610c7957600080fd5b5035919050565b60005b83811015610c9b578181015183820152602001610c83565b50506000910152565b60008151808452610cbc816020860160208601610c80565b601f01601f19169290920160200192915050565b6001600160a01b0384168152606060208201819052600090610cf490830185610ca4565b90508215156040830152949350505050565b8015158114610d1457600080fd5b50565b60008060408385031215610d2a57600080fd5b610d3383610a98565b91506020830135610d4381610d06565b809150509250929050565b600181811c90821680610d6257607f821691505b602082108103610d8257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610dce57600081815260208120601f850160051c81016020861015610daf5750805b601f850160051c820191505b8181101561087d57828155600101610dbb565b505050565b815167ffffffffffffffff811115610ded57610ded610ab4565b610e0181610dfb8454610d4e565b84610d88565b602080601f831160018114610e365760008415610e1e5750858301515b600019600386901b1c1916600185901b17855561087d565b600085815260208120601f198616915b82811015610e6557888601518255948401946001909101908401610e46565b5085821015610e835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000610bd86020830184610ca4565b600060018201610ec657634e487b7160e01b600052601160045260246000fd5b5060010190565b6000808354610edb81610d4e565b60018281168015610ef35760018114610f0857610f37565b60ff1984168752821515830287019450610f37565b8760005260208060002060005b85811015610f2e5781548a820152908401908201610f15565b50505082870194505b50929695505050505050565b604081526000808454610f5581610d4e565b8060408601526060600180841660008114610f775760018114610f9157610fc2565b60ff1985168884015283151560051b880183019550610fc2565b8960005260208060002060005b86811015610fb95781548b8201870152908401908201610f9e565b8a018501975050505b50505050506020929092019290925292915050565b600060208284031215610fe957600080fd5b8151610bd881610d06565b8481528360208201526080604082015260006110136080830185610ca4565b905082606083015295945050505050565b805160ff81168114610aaf57600080fd5b600082601f83011261104657600080fd5b8151611054610b8382610afb565b81815284602083860101111561106957600080fd5b61107a826020830160208701610c80565b949350505050565b60008060008060008060008060008060006101608c8e0312156110a457600080fd5b8b519a506110b460208d01611024565b995060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015167ffffffffffffffff8111156110f357600080fd5b6110ff8e828f01611035565b9450506101008c015167ffffffffffffffff81111561111d57600080fd5b6111298e828f01611035565b9350506101208c015191506101408c015190509295989b509295989b909396995056fea2646970667358221220ba41d8358b895758c0f4f0b64e5b62fa1c14b479162cd23cc56bc3c6a1cade8164736f6c63430008120033

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

00000000000000000000000005caf88ff0b089a9f31ea7275bcaa90f8ad90fb900000000000000000000000086ec03f7bafab24f69ebc456cc429b6f389ea4e4000000000000000000000000e0c8c2fdc6fc440bd1ec918299585321494536ff0000000000000000000000009c11539603661b6c90e65e96aa8ac4b8e4b914c8

-----Decoded View---------------
Arg [0] : _foundation (address): 0x05CAF88FF0b089a9F31eA7275BCAA90F8Ad90fB9
Arg [1] : _signatureVerifier (address): 0x86Ec03F7BaFAB24f69EBc456cC429b6F389EA4e4
Arg [2] : _oracle (address): 0xe0C8c2fDc6fc440BD1eC918299585321494536Ff
Arg [3] : _cross (address): 0x9C11539603661b6c90E65E96Aa8aC4B8E4b914c8

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000005caf88ff0b089a9f31ea7275bcaa90f8ad90fb9
Arg [1] : 00000000000000000000000086ec03f7bafab24f69ebc456cc429b6f389ea4e4
Arg [2] : 000000000000000000000000e0c8c2fdc6fc440bd1ec918299585321494536ff
Arg [3] : 0000000000000000000000009c11539603661b6c90e65e96aa8ac4b8e4b914c8


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
[ 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.