Goerli Testnet

Contract

0xEc9F5db732d10Fba6e14fe89538b07493b37a382
Source Code

Overview

ETH Balance

1,545.704889214172908979 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Value
0x60c0604076616212022-09-26 7:07:48516 days 12 hrs ago1664176068IN
 Create: NativeHandlerSettleable
0 ETH0.001811721.50000001

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
89915842023-05-13 7:24:00287 days 11 hrs ago1683962640
0xEc9F5d...3b37a382
0.01 ETH
89720192023-05-09 22:02:00290 days 21 hrs ago1683669720
0xEc9F5d...3b37a382
0.03 ETH
89720192023-05-09 22:02:00290 days 21 hrs ago1683669720
0xEc9F5d...3b37a382
0.03 ETH
89720192023-05-09 22:02:00290 days 21 hrs ago1683669720
0xEc9F5d...3b37a382
0.03 ETH
89720192023-05-09 22:02:00290 days 21 hrs ago1683669720
0xEc9F5d...3b37a382
0.03 ETH
89720192023-05-09 22:02:00290 days 21 hrs ago1683669720
0xEc9F5d...3b37a382
0.03 ETH
87613202023-04-02 14:20:24328 days 4 hrs ago1680445224
0xEc9F5d...3b37a382
0.1 ETH
87613162023-04-02 14:19:24328 days 4 hrs ago1680445164
0xEc9F5d...3b37a382
0.1 ETH
86738252023-03-18 2:47:48343 days 16 hrs ago1679107668
0xEc9F5d...3b37a382
0.01 ETH
86721812023-03-17 19:50:36343 days 23 hrs ago1679082636
0xEc9F5d...3b37a382
0.05 ETH
86721802023-03-17 19:50:24343 days 23 hrs ago1679082624
0xEc9F5d...3b37a382
0.1 ETH
86501012023-03-13 21:40:24347 days 21 hrs ago1678743624
0xEc9F5d...3b37a382
0.04 ETH
86501012023-03-13 21:40:24347 days 21 hrs ago1678743624
0xEc9F5d...3b37a382
0.03 ETH
85867402023-03-03 0:44:12358 days 18 hrs ago1677804252
0xEc9F5d...3b37a382
0.002 ETH
85867402023-03-03 0:44:12358 days 18 hrs ago1677804252
0xEc9F5d...3b37a382
0.003 ETH
85805642023-03-01 23:38:36359 days 19 hrs ago1677713916
0xEc9F5d...3b37a382
1.1 ETH
85649352023-02-27 7:58:36362 days 11 hrs ago1677484716
0xEc9F5d...3b37a382
0.1 ETH
85649352023-02-27 7:58:36362 days 11 hrs ago1677484716
0xEc9F5d...3b37a382
0.253 ETH
85649182023-02-27 7:54:36362 days 11 hrs ago1677484476
0xEc9F5d...3b37a382
0.1 ETH
85649182023-02-27 7:54:36362 days 11 hrs ago1677484476
0xEc9F5d...3b37a382
0.1 ETH
85649182023-02-27 7:54:36362 days 11 hrs ago1677484476
0xEc9F5d...3b37a382
0.1 ETH
84384642023-02-05 11:53:00384 days 7 hrs ago1675597980
0xEc9F5d...3b37a382
0.02528903 ETH
84318972023-02-04 8:56:12385 days 10 hrs ago1675500972
0xEc9F5d...3b37a382
0.01 ETH
83622862023-01-23 13:35:12397 days 5 hrs ago1674480912
0xEc9F5d...3b37a382
0.01 ETH
83416672023-01-20 1:48:48400 days 17 hrs ago1674179328
0xEc9F5d...3b37a382
0.01 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NativeHandlerSettleable

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : NativeHandlerSettleable.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

import "./HandlerHelpers.sol";
import "../interfaces/IDepositNative.sol";
import "../interfaces/IExecuteProposal.sol";
import "../utils/rollup/Settleable.sol";

/// @notice This contract is intended to be used with the Bridge contract.

contract NativeHandlerSettleable is
    IDepositNative,
    IExecuteProposal,
    HandlerHelpers,
    Settleable
{
    /// @param bridgeAddress Contract address of previously deployed Bridge.
    constructor(address bridgeAddress)
        HandlerHelpers(bridgeAddress)
        Settleable(bridgeAddress)
    {}

    event NativeTokenTransfer(address indexed account, uint256 indexed amount);
    event FailedNativeTokenTransfer(
        address indexed account,
        uint256 indexed amount
    );

    /// @notice A deposit is initiatied by making a deposit in the Bridge contract.
    ///
    /// @notice Requirements:
    /// - {resourceAddress} must be this address.
    /// - {resourceAddress} must be allowed.
    /// - {msg.value} must be equal to {amount}.
    /// - {amount} must be greater than 0.
    /// - Recipient address in data hex string must not be zero address.
    ///
    /// @param resourceID ResourceID used to find address of token to be used for deposit.
    /// @param data Consists of {amount} padded to 32 bytes.
    /// @return an empty data.
    ///
    /// @notice Data passed into the function should be constructed as follows:
    /// amount                                 uint256     bytes  0  - 32
    /// destinationRecipientAddress length     uint256     bytes  32 - 64
    /// destinationRecipientAddress            bytes       bytes  64 - END
    ///
    /// @dev Depending if the corresponding {resourceAddress} for the parsed {resourceID} is
    /// marked true in {_burnList}, deposited tokens will be burned, if not, they will be locked.
    function depositNative(
        bytes32 resourceID,
        address,
        bytes calldata data
    ) external payable onlyBridge returns (bytes memory) {
        uint256 amount;
        uint256 lenDestinationRecipientAddress;
        bytes memory destinationRecipientAddress;

        (amount, lenDestinationRecipientAddress) = abi.decode(
            data,
            (uint256, uint256)
        );
        destinationRecipientAddress = bytes(
            data[64:64 + lenDestinationRecipientAddress]
        );

        bytes20 recipientAddress;
        address resourceAddress = _resourceIDToTokenContractAddress[resourceID];

        // slither-disable-next-line assembly
        assembly {
            // Skip the length field (first 32 bytes) and load 32 bytes
            recipientAddress := mload(add(destinationRecipientAddress, 0x20))
        }

        require(resourceAddress == address(this), "invalid resource address");
        require(msg.value == amount, "invalid native token amount");
        require(amount > 0, "invalid amount");
        require(
            address(recipientAddress) != address(0),
            "must not be zero address"
        );

        return "";
    }

    /// @notice Proposal execution should be initiated when a proposal is finalized in the Bridge contract.
    /// by a relayer on the deposit's destination chain.
    ///
    /// @notice Requirements:
    /// - {resourceAddress} must be this address.
    /// - {resourceAddress} must be allowed.
    ///
    /// @param data Consists of {resourceID}, {amount}, {lenDestinationRecipientAddress},
    /// and {destinationRecipientAddress} all padded to 32 bytes.
    ///
    /// @notice Data passed into the function should be constructed as follows:
    /// amount                                 uint256     bytes  0 - 32
    /// destinationRecipientAddress length     uint256     bytes  32 - 64
    /// destinationRecipientAddress            bytes       bytes  64 - END
    function executeProposal(bytes32 resourceID, bytes calldata data)
        external
        onlyBridge
    {
        uint256 amount;
        uint256 lenDestinationRecipientAddress;
        bytes memory destinationRecipientAddress;

        (amount, lenDestinationRecipientAddress) = abi.decode(
            data,
            (uint256, uint256)
        );
        destinationRecipientAddress = bytes(
            data[64:64 + lenDestinationRecipientAddress]
        );

        bytes20 recipientAddress;
        address resourceAddress = _resourceIDToTokenContractAddress[resourceID];

        // slither-disable-next-line assembly
        assembly {
            // Skip the length field (first 32 bytes) and load 32 bytes
            recipientAddress := mload(add(destinationRecipientAddress, 0x20))
        }
        require(resourceAddress == address(this), "invalid resource address");
        require(
            _contractWhitelist[resourceAddress],
            "not an allowed token address"
        );
        safeTransferETH(address(recipientAddress), amount);
    }

    function safeTransferETH(address to, uint256 value) internal {
        // slither-disable-next-line low-level-calls,arbitrary-send
        (bool success, ) = to.call{value: value}("");
        require(success, "native token transfer failed");
        // slither-disable-next-line reentrancy-events
        emit NativeTokenTransfer(to, value);
    }

    /// @notice Used to manually release ERC20 tokens from ERC20Safe.
    ///
    /// @notice Requirements:
    /// - {resourceAddress} must be this address.
    ///
    /// @param data Consists of {resourceAddress}, {recipient}, and {amount} all padded to 32 bytes.
    ///
    /// @notice Data passed into the function should be constructed as follows:
    /// resourceAddress                        address     bytes  0 - 32
    /// recipient                              address     bytes  32 - 64
    /// amount                                 uint        bytes  64 - 96
    function withdraw(bytes memory data) external override onlyBridge {
        address resourceAddress;
        address recipient;
        uint256 amount;

        (resourceAddress, recipient, amount) = abi.decode(
            data,
            (address, address, uint256)
        );
        require(resourceAddress == address(this), "invalid resource address");

        safeTransferETH(recipient, amount);
    }

    /// @notice Requirements:
    /// - {address(this)} must be allowed.
    function _settle(KeyValuePair[] memory pairs, bytes32)
        internal
        virtual
        override
    {
        require(
            _contractWhitelist[address(this)],
            "this handler is not allowed"
        );

        for (uint256 i = 0; i < pairs.length; i++) {
            address to = abi.decode(pairs[i].key, (address));
            uint256 amount = abi.decode(pairs[i].value, (uint256));

            // To prevent potential DoS Attack, check if `to` is a deployed contract.
            // It' because a receive function of a deployed contract can revert and
            // this will cause the entire state settlement process to fail.
            uint32 size;
            // slither-disable-next-line assembly
            assembly {
                size := extcodesize(to)
            }

            // slither-disable-next-line low-level-calls,unchecked-lowlevel,arbitrary-send
            (bool success, ) = to.call{value: amount}("");

            // Ether transfer must succeed only if `to` is not a deployed contract.
            if (size == 0) {
                require(success, "native token transfer failed");
            }

            // Log succeeded and failed calls.
            // It's because unchecked low-level call is used to prevent blocking operations.
            if (success) {
                // slither-disable-next-line reentrancy-events
                emit NativeTokenTransfer(to, amount);
            } else {
                // slither-disable-next-line reentrancy-events
                emit FailedNativeTokenTransfer(to, amount);
            }
        }
    }
}

File 2 of 8 : HandlerHelpers.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

import "../interfaces/IERCHandler.sol";

/// @notice This contract is intended to be used with the Bridge contract.

contract HandlerHelpers is IERCHandler {
    address public immutable _bridgeAddress;

    // resourceID => token contract address
    mapping(bytes32 => address) public _resourceIDToTokenContractAddress;

    // token contract address => resourceID
    mapping(address => bytes32) public _tokenContractAddressToResourceID;

    // token contract address => is whitelisted
    mapping(address => bool) public _contractWhitelist;

    // token contract address => is burnable
    mapping(address => bool) public _burnList;

    modifier onlyBridge() {
        _onlyBridge();
        _;
    }

    /// @param bridgeAddress Contract address of previously deployed Bridge.
    constructor(address bridgeAddress) {
        _bridgeAddress = bridgeAddress;
    }

    function _onlyBridge() private view {
        require(msg.sender == _bridgeAddress, "sender must be bridge contract");
    }

    /// @notice Sets {_resourceIDToContractAddress} with {contractAddress},
    /// {_contractAddressToResourceID} with {resourceID},
    /// and {_contractWhitelist} to true for {contractAddress}.
    /// @param resourceID ResourceID to be used when making deposits.
    /// @param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
    function setResource(bytes32 resourceID, address contractAddress)
        external
        override
        onlyBridge
    {
        _setResource(resourceID, contractAddress);
    }

    /// @notice First verifies {contractAddress} is whitelisted, then sets {_burnList}[{contractAddress}]
    /// to true.
    /// @param contractAddress Address of contract to be used when making or executing deposits.
    function setBurnable(address contractAddress) external override onlyBridge {
        _setBurnable(contractAddress);
    }

    function withdraw(bytes memory data) external virtual override {}

    function _setResource(bytes32 resourceID, address contractAddress)
        internal
    {
        _resourceIDToTokenContractAddress[resourceID] = contractAddress;
        _tokenContractAddressToResourceID[contractAddress] = resourceID;

        _contractWhitelist[contractAddress] = true;
    }

    function _setBurnable(address contractAddress) internal {
        // solhint-disable-next-line reason-string
        require(
            _contractWhitelist[contractAddress],
            "provided contract is not whitelisted"
        );
        _burnList[contractAddress] = true;
    }
}

File 3 of 8 : IDepositNative.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

interface IDepositNative {
    /// @notice It is intended that deposit are made using the Bridge contract.
    /// @param resourceID ResourceID to be used.
    /// @param depositor Address of account making the deposit in the Bridge contract.
    /// @param data Consists of additional data needed for a specific deposit.
    function depositNative(
        bytes32 resourceID,
        address depositor,
        bytes calldata data
    ) external payable returns (bytes memory);
}

File 4 of 8 : IExecuteProposal.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

interface IExecuteProposal {
    /// @notice It is intended that proposals are executed by the Bridge contract.
    /// @param resourceID ResourceID to be used.
    /// @param data Consists of additional data needed for a specific deposit execution.
    function executeProposal(bytes32 resourceID, bytes calldata data) external;
}

File 5 of 8 : Settleable.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./RollupTypes.sol";

/// @notice Contract module that allows children to implement
/// state settlement mechanisms.
///
/// A settleable is a contract that has {settle} function
/// and makes state changes to destination resource.
///
/// @dev This module is supposed to be used in layer 1 (settlement layer).

abstract contract Settleable {
    address public immutable bridgeAddressSettleable;

    bool private _settleable;
    mapping(uint72 => uint256) private _executedBatches;

    /// @notice Emitted when state settlement is diabled by `account`.
    event SettlementDisabled(address account);

    constructor(address bridgeAddress) {
        bridgeAddressSettleable = bridgeAddress;
        _settleable = true;
    }

    /// @notice Returns the number of successfully executed batches.
    function executedBatches(uint8 originDomainID, uint64 nonce)
        external
        view
        returns (uint256)
    {
        uint72 nonceAndID = (uint72(nonce) << 8) | uint72(originDomainID);
        return _executedBatches[nonceAndID];
    }

    /// @notice Settles state changes.
    ///
    /// @notice Requirements:
    /// - {_settleable} must be true.
    /// - It must be called only by the bridge.
    /// - Batch index must be valid.
    /// - Merkle proof must be verified.
    function settle(
        uint8 originDomainID,
        bytes32 resourceID,
        uint64 nonce,
        bytes32[] calldata proof,
        bytes32 rootHash,
        bytes calldata data
    ) external {
        require(
            msg.sender == bridgeAddressSettleable,
            "Settleable: not from bridge"
        );

        require(_settleable, "Settleable: not settleable");

        uint72 nonceAndID = (uint72(nonce) << 8) | uint72(originDomainID);

        (uint64 batchIndex, KeyValuePair[] memory pairs) = abi.decode(
            data,
            (uint64, KeyValuePair[])
        );

        require(
            _executedBatches[nonceAndID] == batchIndex,
            "Settleable: invalid batch index"
        );
        require(
            MerkleProof.verifyCalldata(proof, rootHash, keccak256(data)),
            "Settleable: failed to verify"
        );
        _executedBatches[nonceAndID]++;

        _settle(pairs, resourceID);
    }

    function _disableSettlement() internal {
        _settleable = false;
        emit SettlementDisabled(msg.sender);
    }

    /// @dev It is implemented in the following:
    /// - ERC20Settleable
    /// - ERC721Settleable
    /// - ERC20HandlerSettleable
    /// - NativeHandlerSettleable
    function _settle(KeyValuePair[] memory, bytes32) internal virtual;

    /// @notice Returns true if the contract is Settleable, and false otherwise.
    ///
    /// @return true if Settleable. otherwise, false.
    function _isSettleable() internal view virtual returns (bool) {
        return _settleable;
    }
}

File 6 of 8 : IERCHandler.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

interface IERCHandler {
    /// @notice Correlates {resourceID} with {contractAddress}.
    /// @param resourceID ResourceID to be used when making deposits.
    /// @param contractAddress Address of contract to be called when a deposit is made and a deposited is executed.
    function setResource(bytes32 resourceID, address contractAddress) external;

    /// @notice Marks {contractAddress} as mintable/burnable.
    /// @param contractAddress Address of contract to be used when making or executing deposits.
    function setBurnable(address contractAddress) external;

    /// @notice Withdraw funds from ERC safes.
    /// @param data ABI-encoded withdrawal params relevant to the handler.
    function withdraw(bytes memory data) external;
}

File 7 of 8 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 8 of 8 : RollupTypes.sol
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity ^0.8.0;

struct StateContext {
    bool _writable;
    bytes32 _hash; // writable
    uint256 _startBlock; // writable
    // readable
    uint8 _epoch;
}

struct KeyValuePair {
    bytes key;
    bytes value;
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"bridgeAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FailedNativeTokenTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeTokenTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"SettlementDisabled","type":"event"},{"inputs":[],"name":"_bridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_burnList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_contractWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"_resourceIDToTokenContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_tokenContractAddressToResourceID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeAddressSettleable","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"depositNative","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"originDomainID","type":"uint8"},{"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"executedBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBurnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"originDomainID","type":"uint8"},{"internalType":"bytes32","name":"resourceID","type":"bytes32"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"settle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b5060405161152f38038061152f83398101604081905261002f91610052565b6001600160a01b0316608081905260a0526004805460ff19166001179055610082565b60006020828403121561006457600080fd5b81516001600160a01b038116811461007b57600080fd5b9392505050565b60805160a05161147a6100b56000396000818161031201526103bc01526000818161016e01526108fd015261147a6000f3fe6080604052600436106100c25760003560e01c80636a70d0811161007f578063b8fa373611610059578063b8fa373614610293578063c8ba6c87146102b3578063e248cff2146102e0578063f7367cc01461030057600080fd5b80636a70d0811461020357806376e234a6146102435780637f79bea81461026357600080fd5b806307b7ed99146100c75780630968f264146100e95780630a6d55d814610109578063318c136e1461015c57806364483eab14610190578063688018e5146101b0575b600080fd5b3480156100d357600080fd5b506100e76100e2366004610daa565b610334565b005b3480156100f557600080fd5b506100e7610104366004610ea7565b610348565b34801561011557600080fd5b5061013f610124366004610ee4565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016857600080fd5b5061013f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561019c57600080fd5b506100e76101ab366004610f74565b6103b1565b3480156101bc57600080fd5b506101f56101cb366004611049565b68ffffffffffffffff00600882901b1660ff83161760009081526005602052604090205492915050565b604051908152602001610153565b34801561020f57600080fd5b5061023361021e366004610daa565b60036020526000908152604090205460ff1681565b6040519015158152602001610153565b61025661025136600461107c565b6105c8565b60405161015391906110d8565b34801561026f57600080fd5b5061023361027e366004610daa565b60026020526000908152604090205460ff1681565b34801561029f57600080fd5b506100e76102ae36600461112d565b610773565b3480156102bf57600080fd5b506101f56102ce366004610daa565b60016020526000908152604090205481565b3480156102ec57600080fd5b506100e76102fb36600461115d565b6107c8565b34801561030c57600080fd5b5061013f7f000000000000000000000000000000000000000000000000000000000000000081565b61033c6108f2565b6103458161096c565b50565b6103506108f2565b60008060008380602001905181019061036991906111a9565b919450925090506001600160a01b03831630146103a15760405162461bcd60e51b8152600401610398906111ec565b60405180910390fd5b6103ab8282610a04565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104295760405162461bcd60e51b815260206004820152601b60248201527f536574746c6561626c653a206e6f742066726f6d2062726964676500000000006044820152606401610398565b60045460ff1661047b5760405162461bcd60e51b815260206004820152601a60248201527f536574746c6561626c653a206e6f7420736574746c6561626c650000000000006044820152606401610398565b68ffffffffffffffff00600887901b1660ff89161760008061049f84860186611223565b68ffffffffffffffffff8516600090815260056020526040902054919350915067ffffffffffffffff8316146105175760405162461bcd60e51b815260206004820152601f60248201527f536574746c6561626c653a20696e76616c696420626174636820696e646578006044820152606401610398565b61053a888888888860405161052d929190611353565b6040518091039020610ae2565b6105865760405162461bcd60e51b815260206004820152601c60248201527f536574746c6561626c653a206661696c656420746f20766572696679000000006044820152606401610398565b68ffffffffffffffffff831660009081526005602052604081208054916105ac83611379565b91905055506105bb818b610afa565b5050505050505050505050565b60606105d26108f2565b60008060606105e385870187611394565b9093509150856040866105f685836113b6565b92610603939291906113ce565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508c81526020818152604090912054908501519495506001600160a01b031692505030821490506106755760405162461bcd60e51b8152600401610398906111ec565b8434146106c45760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e617469766520746f6b656e20616d6f756e7400000000006044820152606401610398565b600085116107055760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b6044820152606401610398565b606082901c6107565760405162461bcd60e51b815260206004820152601860248201527f6d757374206e6f74206265207a65726f206164647265737300000000000000006044820152606401610398565b505060408051602081019091526000815298975050505050505050565b61077b6108f2565b60008281526020818152604080832080546001600160a01b0319166001600160a01b039590951694851790559282526001808252838320949094556002905220805460ff19169091179055565b6107d06108f2565b60008060606107e184860186611394565b9093509150846040856107f485836113b6565b92610801939291906113ce565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508a81526020818152604090912054908501519495506001600160a01b031692505030821490506108735760405162461bcd60e51b8152600401610398906111ec565b6001600160a01b03811660009081526002602052604090205460ff166108db5760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616e20616c6c6f77656420746f6b656e2061646472657373000000006044820152606401610398565b6108e88260601c86610a04565b5050505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461096a5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e747261637400006044820152606401610398565b565b6001600160a01b03811660009081526002602052604090205460ff166109e05760405162461bcd60e51b8152602060048201526024808201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696044820152631cdd195960e21b6064820152608401610398565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a51576040519150601f19603f3d011682016040523d82523d6000602084013e610a56565b606091505b5050905080610aa75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606401610398565b60405182906001600160a01b038516907ff1c9d46e51ef24e4dd5526e493f138832b4dfb6c17839df233a2d48b0af008de90600090a3505050565b600082610af0868685610d17565b1495945050505050565b3060009081526002602052604090205460ff16610b595760405162461bcd60e51b815260206004820152601b60248201527f746869732068616e646c6572206973206e6f7420616c6c6f77656400000000006044820152606401610398565b60005b8251811015610d12576000838281518110610b7957610b796113f8565b602002602001015160000151806020019051810190610b98919061140e565b90506000848381518110610bae57610bae6113f8565b602002602001015160200151806020019051810190610bcd919061142b565b604051909150823b906000906001600160a01b0385169084908381818185875af1925050503d8060008114610c1e576040519150601f19603f3d011682016040523d82523d6000602084013e610c23565b606091505b505090508163ffffffff1660001415610c835780610c835760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606401610398565b8015610cc45760405183906001600160a01b038616907ff1c9d46e51ef24e4dd5526e493f138832b4dfb6c17839df233a2d48b0af008de90600090a3610cfb565b60405183906001600160a01b038616907faa4ff4a275ee4b846ac498585220b98b47cc19b251c4d11e17208d3eecadb11990600090a35b505050508080610d0a90611379565b915050610b5c565b505050565b600081815b84811015610d5a57610d4682878784818110610d3a57610d3a6113f8565b90506020020135610d63565b915080610d5281611379565b915050610d1c565b50949350505050565b6000818310610d7f576000828152602084905260409020610d8e565b60008381526020839052604090205b9392505050565b6001600160a01b038116811461034557600080fd5b600060208284031215610dbc57600080fd5b8135610d8e81610d95565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610e0057610e00610dc7565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610e2f57610e2f610dc7565b604052919050565b600082601f830112610e4857600080fd5b813567ffffffffffffffff811115610e6257610e62610dc7565b610e75601f8201601f1916602001610e06565b818152846020838601011115610e8a57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215610eb957600080fd5b813567ffffffffffffffff811115610ed057600080fd5b610edc84828501610e37565b949350505050565b600060208284031215610ef657600080fd5b5035919050565b803560ff81168114610f0e57600080fd5b919050565b803567ffffffffffffffff81168114610f0e57600080fd5b60008083601f840112610f3d57600080fd5b50813567ffffffffffffffff811115610f5557600080fd5b602083019150836020828501011115610f6d57600080fd5b9250929050565b60008060008060008060008060c0898b031215610f9057600080fd5b610f9989610efd565b975060208901359650610fae60408a01610f13565b9550606089013567ffffffffffffffff80821115610fcb57600080fd5b818b0191508b601f830112610fdf57600080fd5b813581811115610fee57600080fd5b8c60208260051b850101111561100357600080fd5b6020830197508096505060808b0135945060a08b013591508082111561102857600080fd5b506110358b828c01610f2b565b999c989b5096995094979396929594505050565b6000806040838503121561105c57600080fd5b61106583610efd565b915061107360208401610f13565b90509250929050565b6000806000806060858703121561109257600080fd5b8435935060208501356110a481610d95565b9250604085013567ffffffffffffffff8111156110c057600080fd5b6110cc87828801610f2b565b95989497509550505050565b600060208083528351808285015260005b81811015611105578581018301518582016040015282016110e9565b81811115611117576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561114057600080fd5b82359150602083013561115281610d95565b809150509250929050565b60008060006040848603121561117257600080fd5b83359250602084013567ffffffffffffffff81111561119057600080fd5b61119c86828701610f2b565b9497909650939450505050565b6000806000606084860312156111be57600080fd5b83516111c981610d95565b60208501519093506111da81610d95565b80925050604084015190509250925092565b60208082526018908201527f696e76616c6964207265736f7572636520616464726573730000000000000000604082015260600190565b600080604080848603121561123757600080fd5b61124084610f13565b925060208085013567ffffffffffffffff8082111561125e57600080fd5b818701915087601f83011261127257600080fd5b81358181111561128457611284610dc7565b8060051b611293858201610e06565b918252838101850191858101908b8411156112ad57600080fd5b86860192505b83831015611341578235858111156112cb5760008081fd5b8601808d03601f19018913156112e15760008081fd5b6112e9610ddd565b88820135878111156112fb5760008081fd5b6113098f8b83860101610e37565b825250898201358781111561131e5760008081fd5b61132c8f8b83860101610e37565b828b01525083525091860191908601906112b3565b80985050505050505050509250929050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561138d5761138d611363565b5060010190565b600080604083850312156113a757600080fd5b50508035926020909101359150565b600082198211156113c9576113c9611363565b500190565b600080858511156113de57600080fd5b838611156113eb57600080fd5b5050820193919092039150565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561142057600080fd5b8151610d8e81610d95565b60006020828403121561143d57600080fd5b505191905056fea26469706673582212205176cdabcac437e88a5ddf8d62bd5371ddf95cae4fce1557bf25f1f7e031398b64736f6c634300080b003300000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c0

Deployed Bytecode

0x6080604052600436106100c25760003560e01c80636a70d0811161007f578063b8fa373611610059578063b8fa373614610293578063c8ba6c87146102b3578063e248cff2146102e0578063f7367cc01461030057600080fd5b80636a70d0811461020357806376e234a6146102435780637f79bea81461026357600080fd5b806307b7ed99146100c75780630968f264146100e95780630a6d55d814610109578063318c136e1461015c57806364483eab14610190578063688018e5146101b0575b600080fd5b3480156100d357600080fd5b506100e76100e2366004610daa565b610334565b005b3480156100f557600080fd5b506100e7610104366004610ea7565b610348565b34801561011557600080fd5b5061013f610124366004610ee4565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016857600080fd5b5061013f7f00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c081565b34801561019c57600080fd5b506100e76101ab366004610f74565b6103b1565b3480156101bc57600080fd5b506101f56101cb366004611049565b68ffffffffffffffff00600882901b1660ff83161760009081526005602052604090205492915050565b604051908152602001610153565b34801561020f57600080fd5b5061023361021e366004610daa565b60036020526000908152604090205460ff1681565b6040519015158152602001610153565b61025661025136600461107c565b6105c8565b60405161015391906110d8565b34801561026f57600080fd5b5061023361027e366004610daa565b60026020526000908152604090205460ff1681565b34801561029f57600080fd5b506100e76102ae36600461112d565b610773565b3480156102bf57600080fd5b506101f56102ce366004610daa565b60016020526000908152604090205481565b3480156102ec57600080fd5b506100e76102fb36600461115d565b6107c8565b34801561030c57600080fd5b5061013f7f00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c081565b61033c6108f2565b6103458161096c565b50565b6103506108f2565b60008060008380602001905181019061036991906111a9565b919450925090506001600160a01b03831630146103a15760405162461bcd60e51b8152600401610398906111ec565b60405180910390fd5b6103ab8282610a04565b50505050565b336001600160a01b037f00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c016146104295760405162461bcd60e51b815260206004820152601b60248201527f536574746c6561626c653a206e6f742066726f6d2062726964676500000000006044820152606401610398565b60045460ff1661047b5760405162461bcd60e51b815260206004820152601a60248201527f536574746c6561626c653a206e6f7420736574746c6561626c650000000000006044820152606401610398565b68ffffffffffffffff00600887901b1660ff89161760008061049f84860186611223565b68ffffffffffffffffff8516600090815260056020526040902054919350915067ffffffffffffffff8316146105175760405162461bcd60e51b815260206004820152601f60248201527f536574746c6561626c653a20696e76616c696420626174636820696e646578006044820152606401610398565b61053a888888888860405161052d929190611353565b6040518091039020610ae2565b6105865760405162461bcd60e51b815260206004820152601c60248201527f536574746c6561626c653a206661696c656420746f20766572696679000000006044820152606401610398565b68ffffffffffffffffff831660009081526005602052604081208054916105ac83611379565b91905055506105bb818b610afa565b5050505050505050505050565b60606105d26108f2565b60008060606105e385870187611394565b9093509150856040866105f685836113b6565b92610603939291906113ce565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508c81526020818152604090912054908501519495506001600160a01b031692505030821490506106755760405162461bcd60e51b8152600401610398906111ec565b8434146106c45760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e617469766520746f6b656e20616d6f756e7400000000006044820152606401610398565b600085116107055760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b6044820152606401610398565b606082901c6107565760405162461bcd60e51b815260206004820152601860248201527f6d757374206e6f74206265207a65726f206164647265737300000000000000006044820152606401610398565b505060408051602081019091526000815298975050505050505050565b61077b6108f2565b60008281526020818152604080832080546001600160a01b0319166001600160a01b039590951694851790559282526001808252838320949094556002905220805460ff19169091179055565b6107d06108f2565b60008060606107e184860186611394565b9093509150846040856107f485836113b6565b92610801939291906113ce565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508a81526020818152604090912054908501519495506001600160a01b031692505030821490506108735760405162461bcd60e51b8152600401610398906111ec565b6001600160a01b03811660009081526002602052604090205460ff166108db5760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616e20616c6c6f77656420746f6b656e2061646472657373000000006044820152606401610398565b6108e88260601c86610a04565b5050505050505050565b336001600160a01b037f00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c0161461096a5760405162461bcd60e51b815260206004820152601e60248201527f73656e646572206d7573742062652062726964676520636f6e747261637400006044820152606401610398565b565b6001600160a01b03811660009081526002602052604090205460ff166109e05760405162461bcd60e51b8152602060048201526024808201527f70726f766964656420636f6e7472616374206973206e6f742077686974656c696044820152631cdd195960e21b6064820152608401610398565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610a51576040519150601f19603f3d011682016040523d82523d6000602084013e610a56565b606091505b5050905080610aa75760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606401610398565b60405182906001600160a01b038516907ff1c9d46e51ef24e4dd5526e493f138832b4dfb6c17839df233a2d48b0af008de90600090a3505050565b600082610af0868685610d17565b1495945050505050565b3060009081526002602052604090205460ff16610b595760405162461bcd60e51b815260206004820152601b60248201527f746869732068616e646c6572206973206e6f7420616c6c6f77656400000000006044820152606401610398565b60005b8251811015610d12576000838281518110610b7957610b796113f8565b602002602001015160000151806020019051810190610b98919061140e565b90506000848381518110610bae57610bae6113f8565b602002602001015160200151806020019051810190610bcd919061142b565b604051909150823b906000906001600160a01b0385169084908381818185875af1925050503d8060008114610c1e576040519150601f19603f3d011682016040523d82523d6000602084013e610c23565b606091505b505090508163ffffffff1660001415610c835780610c835760405162461bcd60e51b815260206004820152601c60248201527f6e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606401610398565b8015610cc45760405183906001600160a01b038616907ff1c9d46e51ef24e4dd5526e493f138832b4dfb6c17839df233a2d48b0af008de90600090a3610cfb565b60405183906001600160a01b038616907faa4ff4a275ee4b846ac498585220b98b47cc19b251c4d11e17208d3eecadb11990600090a35b505050508080610d0a90611379565b915050610b5c565b505050565b600081815b84811015610d5a57610d4682878784818110610d3a57610d3a6113f8565b90506020020135610d63565b915080610d5281611379565b915050610d1c565b50949350505050565b6000818310610d7f576000828152602084905260409020610d8e565b60008381526020839052604090205b9392505050565b6001600160a01b038116811461034557600080fd5b600060208284031215610dbc57600080fd5b8135610d8e81610d95565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610e0057610e00610dc7565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610e2f57610e2f610dc7565b604052919050565b600082601f830112610e4857600080fd5b813567ffffffffffffffff811115610e6257610e62610dc7565b610e75601f8201601f1916602001610e06565b818152846020838601011115610e8a57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215610eb957600080fd5b813567ffffffffffffffff811115610ed057600080fd5b610edc84828501610e37565b949350505050565b600060208284031215610ef657600080fd5b5035919050565b803560ff81168114610f0e57600080fd5b919050565b803567ffffffffffffffff81168114610f0e57600080fd5b60008083601f840112610f3d57600080fd5b50813567ffffffffffffffff811115610f5557600080fd5b602083019150836020828501011115610f6d57600080fd5b9250929050565b60008060008060008060008060c0898b031215610f9057600080fd5b610f9989610efd565b975060208901359650610fae60408a01610f13565b9550606089013567ffffffffffffffff80821115610fcb57600080fd5b818b0191508b601f830112610fdf57600080fd5b813581811115610fee57600080fd5b8c60208260051b850101111561100357600080fd5b6020830197508096505060808b0135945060a08b013591508082111561102857600080fd5b506110358b828c01610f2b565b999c989b5096995094979396929594505050565b6000806040838503121561105c57600080fd5b61106583610efd565b915061107360208401610f13565b90509250929050565b6000806000806060858703121561109257600080fd5b8435935060208501356110a481610d95565b9250604085013567ffffffffffffffff8111156110c057600080fd5b6110cc87828801610f2b565b95989497509550505050565b600060208083528351808285015260005b81811015611105578581018301518582016040015282016110e9565b81811115611117576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561114057600080fd5b82359150602083013561115281610d95565b809150509250929050565b60008060006040848603121561117257600080fd5b83359250602084013567ffffffffffffffff81111561119057600080fd5b61119c86828701610f2b565b9497909650939450505050565b6000806000606084860312156111be57600080fd5b83516111c981610d95565b60208501519093506111da81610d95565b80925050604084015190509250925092565b60208082526018908201527f696e76616c6964207265736f7572636520616464726573730000000000000000604082015260600190565b600080604080848603121561123757600080fd5b61124084610f13565b925060208085013567ffffffffffffffff8082111561125e57600080fd5b818701915087601f83011261127257600080fd5b81358181111561128457611284610dc7565b8060051b611293858201610e06565b918252838101850191858101908b8411156112ad57600080fd5b86860192505b83831015611341578235858111156112cb5760008081fd5b8601808d03601f19018913156112e15760008081fd5b6112e9610ddd565b88820135878111156112fb5760008081fd5b6113098f8b83860101610e37565b825250898201358781111561131e5760008081fd5b61132c8f8b83860101610e37565b828b01525083525091860191908601906112b3565b80985050505050505050509250929050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561138d5761138d611363565b5060010190565b600080604083850312156113a757600080fd5b50508035926020909101359150565b600082198211156113c9576113c9611363565b500190565b600080858511156113de57600080fd5b838611156113eb57600080fd5b5050820193919092039150565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561142057600080fd5b8151610d8e81610d95565b60006020828403121561143d57600080fd5b505191905056fea26469706673582212205176cdabcac437e88a5ddf8d62bd5371ddf95cae4fce1557bf25f1f7e031398b64736f6c634300080b0033

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

00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c0

-----Decoded View---------------
Arg [0] : bridgeAddress (address): 0x29cf815FDad26e93A32f53f1DeBcd276B4Cd32C0

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000029cf815fdad26e93a32f53f1debcd276b4cd32c0


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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