ETH Price: $1,981.68 (+2.35%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Schedule...232191352025-08-25 15:51:59188 days ago1756137119IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000033240.72702175
Execute Schedule...230158212025-07-28 6:21:11216 days ago1753683671IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000016060.35141035
Execute Schedule...229818552025-07-23 12:25:23221 days ago1753273523IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000061071.3361381
Execute Schedule...225465842025-05-23 15:53:59282 days ago1748015639IN
0x0C1fDfd6...76ada5DfC
0 ETH0.00018183.97627661
Execute Schedule...224963892025-05-16 15:01:35289 days ago1747407695IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000142333.11307031
Execute Schedule...219880072025-03-06 13:00:23360 days ago1741266023IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000059431.3
Execute Schedule...204606602024-08-05 6:45:23573 days ago1722840323IN
0x0C1fDfd6...76ada5DfC
0 ETH0.0074092162.04912094
Execute Schedule...204606602024-08-05 6:45:23573 days ago1722840323IN
0x0C1fDfd6...76ada5DfC
0 ETH0.0074092162.04912094
Execute Schedule...204606572024-08-05 6:44:47573 days ago1722840287IN
0x0C1fDfd6...76ada5DfC
0 ETH0.0073488160.72797947
Execute Schedule...204606562024-08-05 6:44:35573 days ago1722840275IN
0x0C1fDfd6...76ada5DfC
0 ETH0.00654701143.19182434
Deny204323962024-08-01 8:06:23577 days ago1722499583IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000162326.95699146
Rely204323962024-08-01 8:06:23577 days ago1722499583IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000328986.95699146
Rely204323962024-08-01 8:06:23577 days ago1722499583IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000328986.95699146
Endorse204323952024-08-01 8:06:11577 days ago1722499571IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000313486.63017827
Endorse204323952024-08-01 8:06:11577 days ago1722499571IN
0x0C1fDfd6...76ada5DfC
0 ETH0.000313796.63017827

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60a06040204323932024-08-01 8:05:47577 days ago1722499547  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
Root

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 500 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;

import {Auth} from "src/Auth.sol";
import {MessagesLib} from "src/libraries/MessagesLib.sol";
import {BytesLib} from "src/libraries/BytesLib.sol";
import {IRoot, IRecoverable} from "src/interfaces/IRoot.sol";
import {IAuth} from "src/interfaces/IAuth.sol";

/// @title  Root
/// @notice Core contract that is a ward on all other deployed contracts.
/// @dev    Pausing can happen instantaneously, but relying on other contracts
///         is restricted to the timelock set by the delay.
contract Root is Auth, IRoot {
    using BytesLib for bytes;

    /// @dev To prevent filing a delay that would block any updates indefinitely
    uint256 internal constant MAX_DELAY = 4 weeks;

    address public immutable escrow;

    /// @inheritdoc IRoot
    bool public paused;
    /// @inheritdoc IRoot
    uint256 public delay;
    /// @inheritdoc IRoot
    mapping(address => uint256) public endorsements;
    /// @inheritdoc IRoot
    mapping(address relyTarget => uint256 timestamp) public schedule;

    constructor(address _escrow, uint256 _delay, address deployer) Auth(deployer) {
        require(_delay <= MAX_DELAY, "Root/delay-too-long");

        escrow = _escrow;
        delay = _delay;
    }

    // --- Administration ---
    /// @inheritdoc IRoot
    function file(bytes32 what, uint256 data) external auth {
        if (what == "delay") {
            require(data <= MAX_DELAY, "Root/delay-too-long");
            delay = data;
        } else {
            revert("Root/file-unrecognized-param");
        }
        emit File(what, data);
    }

    /// --- Endorsements ---
    /// @inheritdoc IRoot
    function endorse(address user) external auth {
        endorsements[user] = 1;
        emit Endorse(user);
    }

    /// @inheritdoc IRoot
    function veto(address user) external auth {
        endorsements[user] = 0;
        emit Veto(user);
    }

    /// @inheritdoc IRoot
    function endorsed(address user) public view returns (bool) {
        return endorsements[user] == 1;
    }

    // --- Pause management ---
    /// @inheritdoc IRoot
    function pause() external auth {
        paused = true;
        emit Pause();
    }

    /// @inheritdoc IRoot
    function unpause() external auth {
        paused = false;
        emit Unpause();
    }

    /// --- Timelocked ward management ---
    /// @inheritdoc IRoot
    function scheduleRely(address target) public auth {
        schedule[target] = block.timestamp + delay;
        emit ScheduleRely(target, schedule[target]);
    }

    /// @inheritdoc IRoot
    function cancelRely(address target) public auth {
        require(schedule[target] != 0, "Root/target-not-scheduled");
        schedule[target] = 0;
        emit CancelRely(target);
    }

    /// @inheritdoc IRoot
    function executeScheduledRely(address target) external {
        require(schedule[target] != 0, "Root/target-not-scheduled");
        require(schedule[target] <= block.timestamp, "Root/target-not-ready");

        wards[target] = 1;
        emit Rely(target);

        schedule[target] = 0;
    }

    /// --- Incoming message handling ---
    /// @inheritdoc IRoot
    function handle(bytes calldata message) public auth {
        MessagesLib.Call call = MessagesLib.messageType(message);

        if (call == MessagesLib.Call.ScheduleUpgrade) {
            scheduleRely(message.toAddress(1));
        } else if (call == MessagesLib.Call.CancelUpgrade) {
            cancelRely(message.toAddress(1));
        } else if (call == MessagesLib.Call.RecoverTokens) {
            (address target, address token, address to, uint256 amount) =
                (message.toAddress(1), message.toAddress(33), message.toAddress(65), message.toUint256(97));
            recoverTokens(target, token, to, amount);
        } else {
            revert("Root/invalid-message");
        }
    }

    /// --- External contract ward management ---
    /// @inheritdoc IRoot
    function relyContract(address target, address user) external auth {
        IAuth(target).rely(user);
        emit RelyContract(target, user);
    }

    /// @inheritdoc IRoot
    function denyContract(address target, address user) external auth {
        IAuth(target).deny(user);
        emit DenyContract(target, user);
    }

    /// --- Token recovery ---
    /// @inheritdoc IRoot
    function recoverTokens(address target, address token, address to, uint256 amount) public auth {
        IRecoverable(target).recoverTokens(token, to, amount);
        emit RecoverTokens(target, token, to, amount);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;

import {IAuth} from "src/interfaces/IAuth.sol";

/// @title  Auth
/// @notice Simple authentication pattern
/// @author Based on code from https://github.com/makerdao/dss
abstract contract Auth is IAuth {
    /// @inheritdoc IAuth
    mapping(address => uint256) public wards;

    constructor(address initialWard) {
        wards[initialWard] = 1;
        emit Rely(initialWard);
    }

    /// @dev Check if the msg.sender has permissions
    modifier auth() {
        require(wards[msg.sender] == 1, "Auth/not-authorized");
        _;
    }

    /// @inheritdoc IAuth
    function rely(address user) external auth {
        wards[user] = 1;
        emit Rely(user);
    }

    /// @inheritdoc IAuth
    function deny(address user) external auth {
        wards[user] = 0;
        emit Deny(user);
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;

import {BytesLib} from "src/libraries/BytesLib.sol";

/// @title  MessagesLib
/// @dev    Library for encoding and decoding messages.
library MessagesLib {
    using BytesLib for bytes;

    enum Call {
        /// 0 - An invalid message
        Invalid,
        // --- Gateway ---
        /// 1 - Proof
        MessageProof,
        /// 2 - Initiate Message Recovery
        InitiateMessageRecovery,
        /// 3 - Dispute Message Recovery
        DisputeMessageRecovery,
        /// 4 - Batch Messages
        Batch,
        // --- Root ---
        /// 5 - Schedule an upgrade contract to be granted admin rights
        ScheduleUpgrade,
        /// 6 - Cancel a previously scheduled upgrade
        CancelUpgrade,
        /// 7 - Recover tokens sent to the wrong contract
        RecoverTokens,
        // --- Gas service ---
        /// 8 - Update Centrifuge gas price
        UpdateCentrifugeGasPrice,
        // --- Pool Manager ---
        /// 9 - Add an asset id -> EVM address mapping
        AddAsset,
        /// 10 - Add Pool
        AddPool,
        /// 11 - Add a Pool's Tranche Token
        AddTranche,
        /// 12 - Allow an asset to be used as an asset for investing in pools
        AllowAsset,
        /// 13 - Disallow an asset to be used as an asset for investing in pools
        DisallowAsset,
        /// 14 - Update the price of a Tranche Token
        UpdateTranchePrice,
        /// 15 - Update tranche token metadata
        UpdateTrancheMetadata,
        /// 16 - Update Tranche Hook
        UpdateTrancheHook,
        /// 17 - A transfer of assets
        TransferAssets,
        /// 18 - A transfer of tranche tokens
        TransferTrancheTokens,
        /// 19 - Update a user restriction
        UpdateRestriction,
        /// --- Investment Manager ---
        /// 20 - Increase an investment order by a given amount
        DepositRequest,
        /// 21 - Increase a Redeem order by a given amount
        RedeemRequest,
        /// 22 - Executed Collect Invest
        FulfilledDepositRequest,
        /// 23 - Executed Collect Redeem
        FulfilledRedeemRequest,
        /// 24 - Cancel an investment order
        CancelDepositRequest,
        /// 25 - Cancel a redeem order
        CancelRedeemRequest,
        /// 26 - Executed Decrease Invest Order
        FulfilledCancelDepositRequest,
        /// 27 - Executed Decrease Redeem Order
        FulfilledCancelRedeemRequest,
        /// 28 - Request redeem investor
        TriggerRedeemRequest
    }

    function messageType(bytes memory _msg) internal pure returns (Call _call) {
        _call = Call(_msg.toUint8(0));
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;

/// @title  Bytes Lib
/// @dev    Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
///         The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
/// @author Modified from Solidity Bytes Arrays Utils v0.8.0
library BytesLib {
    function slice(bytes memory _bytes, uint256 _start, uint256 _length) internal pure returns (bytes memory) {
        require(_length + 31 >= _length, "slice_overflow");
        require(_bytes.length >= _start + _length, "slice_outOfBounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } { mstore(mc, mload(cc)) }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)
                //zero out the 32 bytes slice we are about to return
                //we need to do it because Solidity does not garbage collect
                mstore(tempBytes, 0)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
        require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
        require(_bytes.length >= _start + 1, "toUint8_outOfBounds");
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {
        require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {
        require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {
        require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
        require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
        uint256 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {
        require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function toBytes16(bytes memory _bytes, uint256 _start) internal pure returns (bytes16) {
        require(_bytes.length >= _start + 16, "toBytes16_outOfBounds");
        bytes16 tempBytes16;

        assembly {
            tempBytes16 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes16;
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.5.0;

import {IMessageHandler} from "src/interfaces/gateway/IGateway.sol";

interface IRecoverable {
    /// @notice Used to recover any ERC-20 token.
    /// @dev    This method is called only by authorized entities
    /// @param  token It could be 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    ///         to recover locked native ETH or any ERC20 compatible token.
    /// @param  to Receiver of the funds
    /// @param  amount Amount to send to the receiver.
    function recoverTokens(address token, address to, uint256 amount) external;
}

interface IRoot is IMessageHandler {
    // --- Events ---
    event File(bytes32 indexed what, uint256 data);
    event Pause();
    event Unpause();
    event ScheduleRely(address indexed target, uint256 indexed scheduledTime);
    event CancelRely(address indexed target);
    event RelyContract(address indexed target, address indexed user);
    event DenyContract(address indexed target, address indexed user);
    event RecoverTokens(address indexed target, address indexed token, address indexed to, uint256 amount);
    event Endorse(address indexed user);
    event Veto(address indexed user);

    /// @notice Returns whether the root is paused
    function paused() external view returns (bool);

    /// @notice Returns the current timelock for adding new wards
    function delay() external view returns (uint256);

    /// @notice Trusted contracts within the system
    function endorsements(address target) external view returns (uint256);

    /// @notice Returns when `relyTarget` has passed the timelock
    function schedule(address relyTarget) external view returns (uint256 timestamp);

    // --- Administration ---
    /// @notice Updates a contract parameter
    /// @param what Accepts a bytes32 representation of 'delay'
    function file(bytes32 what, uint256 data) external;

    /// --- Endorsements ---
    /// @notice Endorses the `user`
    /// @dev    Endorsed users are trusted contracts in the system. They are allowed to bypass
    ///         token restrictions (e.g. the Escrow can automatically receive tranche tokens by being endorsed), and
    ///         can automatically set operators in ERC-7540 vaults (e.g. the CentrifugeRouter) is always an operator.
    function endorse(address user) external;

    /// @notice Removes the endorsed user
    function veto(address user) external;

    /// @notice Returns whether the user is endorsed
    function endorsed(address user) external view returns (bool);

    // --- Pause management ---
    /// @notice Pause any contracts that depend on `Root.paused()`
    function pause() external;

    /// @notice Unpause any contracts that depend on `Root.paused()`
    function unpause() external;

    /// --- Timelocked ward management ---
    /// @notice Schedule relying a new ward after the delay has passed
    function scheduleRely(address target) external;

    /// @notice Cancel a pending scheduled rely
    function cancelRely(address target) external;

    /// @notice Execute a scheduled rely
    /// @dev    Can be triggered by anyone since the scheduling is protected
    function executeScheduledRely(address target) external;

    /// --- Incoming message handling ---
    function handle(bytes calldata message) external;

    /// --- External contract ward management ---
    /// @notice Make an address a ward on any contract that Root is a ward on
    function relyContract(address target, address user) external;

    /// @notice Removes an address as a ward on any contract that Root is a ward on
    function denyContract(address target, address user) external;

    /// --- Token Recovery ---
    /// @notice Allows Governance to recover tokens sent to the wrong contract by mistake
    function recoverTokens(address target, address token, address to, uint256 amount) external;
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.5.0;

interface IAuth {
    event Rely(address indexed user);
    event Deny(address indexed user);

    /// @notice Returns whether the target is a ward (has admin access)
    function wards(address target) external view returns (uint256);

    /// @notice Make user a ward (give them admin access)
    function rely(address user) external;

    /// @notice Remove user as a ward (remove admin access)
    function deny(address user) external;
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.26;

uint8 constant MAX_ADAPTER_COUNT = 8;

interface IGateway {
    /// @dev Each adapter struct is packed with the quorum to reduce SLOADs on handle
    struct Adapter {
        /// @notice Starts at 1 and maps to id - 1 as the index on the adapters array
        uint8 id;
        /// @notice Number of votes required for a message to be executed
        uint8 quorum;
        /// @notice Each time the quorum is decreased, a new session starts which invalidates old votes
        uint64 activeSessionId;
    }

    struct Message {
        /// @dev Counts are stored as integers (instead of boolean values) to accommodate duplicate
        ///      messages (e.g. two investments from the same user with the same amount) being
        ///      processed in parallel. The entire struct is packed in a single bytes32 slot.
        ///      Max uint16 = 65,535 so at most 65,535 duplicate messages can be processed in parallel.
        uint16[MAX_ADAPTER_COUNT] votes;
        /// @notice Each time adapters are updated, a new session starts which invalidates old votes
        uint64 sessionId;
        bytes pendingMessage;
    }

    // --- Events ---
    event ProcessMessage(bytes message, address adapter);
    event ProcessProof(bytes32 messageHash, address adapter);
    event ExecuteMessage(bytes message, address adapter);
    event SendMessage(bytes message);
    event RecoverMessage(address adapter, bytes message);
    event RecoverProof(address adapter, bytes32 messageHash);
    event InitiateMessageRecovery(bytes32 messageHash, address adapter);
    event DisputeMessageRecovery(bytes32 messageHash, address adapter);
    event ExecuteMessageRecovery(bytes message, address adapter);
    event File(bytes32 indexed what, address[] adapters);
    event File(bytes32 indexed what, address instance);
    event File(bytes32 indexed what, uint8 messageId, address manager);
    event File(bytes32 indexed what, address caller, bool isAllowed);
    event ReceiveNativeTokens(address indexed sender, uint256 amount);

    /// @notice Returns the address of the adapter at the given id.
    function adapters(uint256 id) external view returns (address);

    /// @notice Returns the address of the contract that handles the given message id.
    function messageHandlers(uint8 messageId) external view returns (address);

    /// @notice Returns the timestamp when the given recovery can be executed.
    function recoveries(address adapter, bytes32 messageHash) external view returns (uint256 timestamp);

    // --- Administration ---
    /// @notice Used to update an array of addresses ( state variable ) on very rare occasions.
    /// @dev    Currently it is used to update the supported adapters.
    /// @param  what The name of the variable to be updated.
    /// @param  value New addresses.
    function file(bytes32 what, address[] calldata value) external;

    /// @notice Used to update an address ( state variable ) on very rare occasions.
    /// @dev    Currently used to update addresses of contract instances.
    /// @param  what The name of the variable to be updated.
    /// @param  data New address.
    function file(bytes32 what, address data) external;

    /// @notice Used to update a mapping ( state variables ) on very rare occasions.
    /// @dev    Currently used to update any custom handlers for a specific message type.
    ///         data1 is the message id from MessagesLib.Call and data2 could be any
    ///         custom instance of a contract that will handle that call.
    /// @param  what The name of the variable to be updated.
    /// @param  data1 The key of the mapping.
    /// @param  data2 The value of the mapping
    function file(bytes32 what, uint8 data1, address data2) external;

    /// @notice Used to update a mapping ( state variables ) on very rare occasions.
    /// @dev    Manages who is allowed to call `this.topUp`
    ///
    /// @param what The name of the variable to be updated - `payers`
    /// @param caller Address of the payer allowed to top-up
    /// @param isAllower Whether the `caller` is allowed to top-up or not
    function file(bytes32 what, address caller, bool isAllower) external;

    // --- Incoming ---
    /// @notice Handles incoming messages, proofs, and recoveries.
    /// @dev    Assumes adapters ensure messages cannot be confirmed more than once.
    /// @param  payload Incoming message from the Centrifuge Chain passed through adapters.
    function handle(bytes calldata payload) external;

    /// @notice Governance on Centrifuge Chain can initiate message recovery. After the challenge period,
    ///         the recovery can be executed. If a malign adapter initiates message recovery, governance on
    ///         Centrifuge Chain can dispute and immediately cancel the recovery, using any other valid adapter.
    /// @param  adapter Adapter that the recovery was targeting
    /// @param  messageHash Hash of the message being disputed
    function disputeMessageRecovery(address adapter, bytes32 messageHash) external;

    /// @notice Governance on Centrifuge Chain can initiate message recovery. After the challenge period,
    ///         the recovery can be executed. If a malign adapter initiates message recovery, governance on
    ///         Centrifuge Chain can dispute and immediately cancel the recovery, using any other valid adapter.
    ///
    ///         Only 1 recovery can be outstanding per message hash. If multiple adapters fail at the same time,
    ///         these will need to be recovered serially (increasing the challenge period for each failed adapter).
    /// @param  adapter Adapter's address that the recovery is targeting
    /// @param  message Hash of the message to be recovered
    function executeMessageRecovery(address adapter, bytes calldata message) external;

    // --- Outgoing ---
    /// @notice Sends outgoing messages to the Centrifuge Chain.
    /// @dev    Sends 1 message to the first adapter with the full message,
    ///         and n-1 messages to the other adapters with proofs (hash of message).
    ///         This ensures message uniqueness (can only be executed on the destination once).
    ///         Source could be either Centrifuge router or EoA or any contract
    ///         that calls the ERC7540Vault contract directly.
    /// @param  message Message to be send. Either the message itself or a hash value of it ( proof ).
    /// @param  source Entry point of the transaction.
    ///         Used to determine whether it is eligible for TX cost payment.
    function send(bytes calldata message, address source) external payable;

    /// @notice Prepays for the TX cost for sending through the adapters
    ///         and Centrifuge Chain
    /// @dev    It can be called only through endorsed contracts.
    ///         Currently being called from Centrifuge Router only.
    ///         In order to prepay, the method MUST be called with `msg.value`.
    ///         Called is assumed to have called IGateway.estimate before calling this.
    function topUp() external payable;

    // --- Helpers ---
    /// @notice A view method of the current quorum.abi
    /// @dev    Quorum shows the amount of votes needed in order for a message to be dispatched further.
    ///         The quorum is taken from the first adapter.
    ///         Current quorum is the amount of all adapters.
    /// return  Needed amount
    function quorum() external view returns (uint8);

    /// @notice Gets the current active routers session id.
    /// @dev    When the adapters are updated with new ones,
    ///         each new set of adapters has their own sessionId.
    ///         Currently it uses sessionId of the previous set and
    ///         increments it by 1. The idea of an activeSessionId is
    ///         to invalidate any incoming messages from previously used adapters.
    function activeSessionId() external view returns (uint64);

    /// @notice Counts how many times each incoming messages has been received per adapter.
    /// @dev    It supports parallel messages ( duplicates ). That means that the incoming messages could be
    ///         the result of two or more independ request from the user of the same type.
    ///         i.e. Same user would like to deposit same underlying asset with the same amount more then once.
    /// @param  messageHash The hash value of the incoming message.
    function votes(bytes32 messageHash) external view returns (uint16[MAX_ADAPTER_COUNT] memory);

    /// @notice Used to calculate overall cost for bridging a payload on the first adapter and settling
    ///         on the destination chain and bridging its payload proofs on n-1 adapter
    ///         and settling on the destination chain.
    /// @param  payload Used in gas cost calculations.
    /// @dev    Currenly the payload is not taken into consideration.
    /// @return perAdapter An array of cost values per adapter. Each value is how much it's going to cost
    ///         for a message / proof to be passed through one router and executed on Centrifuge Chain
    /// @return total Total cost for sending one message and corresponding proofs on through all adapters
    function estimate(bytes calldata payload) external view returns (uint256[] memory perAdapter, uint256 total);

    /// @notice Used to check current state of the `caller` and whether they are allowed to call
    ///         `this.topUp` or not.
    /// @param  caller Address to check
    /// @return isAllowed Whether the `caller` `isAllowed to call `this.topUp()`
    function payers(address caller) external view returns (bool isAllowed);
}

interface IMessageHandler {
    /// @notice Handling incoming messages from Centrifuge Chain.
    /// @param  message Incoming message
    function handle(bytes memory message) external;
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@chimera/=lib/chimera/src/",
    "chimera/=lib/chimera/src/",
    "ds-test/=lib/chimera/lib/forge-std/lib/ds-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 500
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_escrow","type":"address"},{"internalType":"uint256","name":"_delay","type":"uint256"},{"internalType":"address","name":"deployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"CancelRely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"DenyContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Endorse","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"File","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoverTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"RelyContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"uint256","name":"scheduledTime","type":"uint256"}],"name":"ScheduleRely","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"Veto","type":"event"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"cancelRely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"denyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"endorse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"endorsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"endorsements","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"executeScheduledRely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"}],"name":"handle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"relyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"relyTarget","type":"address"}],"name":"schedule","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"scheduleRely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"veto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a060405234801561000f575f80fd5b506040516114df3803806114df83398101604081905261002e916100fb565b6001600160a01b0381165f8181526020819052604080822060019055518392917fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6091a2506224ea008211156100c95760405162461bcd60e51b815260206004820152601360248201527f526f6f742f64656c61792d746f6f2d6c6f6e6700000000000000000000000000604482015260640160405180910390fd5b506001600160a01b03909116608052600255610134565b80516001600160a01b03811681146100f6575f80fd5b919050565b5f805f6060848603121561010d575f80fd5b610116846100e0565b92506020840151915061012b604085016100e0565b90509250925092565b60805161139361014c5f395f6102ee01526113935ff3fe608060405234801561000f575f80fd5b5060043610610141575f3560e01c806365fae35e116100c357806395a2ef2a11610088578063bf48bcb611610063578063bf48bcb6146102d6578063e2fdcc17146102e9578063fe0ac3e714610328575f80fd5b806395a2ef2a146102915780639c52a7f1146102a4578063bf353dbb146102b7575f80fd5b806365fae35e1461022f5780636a42b8f8146102425780636ea5511f1461024b5780638456cb591461025e578063854b89d514610266575f80fd5b8063316bef9811610109578063316bef98146101c5578063373e73f8146101e45780633b687461146101f75780633f4ba83a1461020a5780635c975abb14610212575f80fd5b806301257c1a1461014557806301d156021461017757806311fd3baa1461018c57806326ae21a91461019f57806329ae8114146101b2575b5f80fd5b610164610153366004611203565b60036020525f908152604090205481565b6040519081526020015b60405180910390f35b61018a610185366004611203565b61033b565b005b61018a61019a366004611203565b610467565b61018a6101ad366004611203565b610564565b61018a6101c0366004611223565b6105fb565b6101646101d3366004611203565b60046020525f908152604090205481565b61018a6101f2366004611243565b610741565b61018a610205366004611203565b610826565b61018a6108ca565b60015461021f9060ff1681565b604051901515815260200161016e565b61018a61023d366004611203565b610952565b61016460025481565b61018a610259366004611203565b6109ea565b61018a610a82565b61021f610274366004611203565b6001600160a01b03165f9081526003602052604090205460011490565b61018a61029f366004611274565b610b0c565b61018a6102b2366004611203565b610c22565b6101646102c5366004611203565b5f6020819052908152604090205481565b61018a6102e43660046112bc565b610cb9565b6103107f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161016e565b61018a610336366004611243565b610f9f565b6001600160a01b0381165f9081526004602052604081205490036103a65760405162461bcd60e51b815260206004820152601960248201527f526f6f742f7461726765742d6e6f742d7363686564756c65640000000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f9081526004602052604090205442101561040d5760405162461bcd60e51b815260206004820152601560248201527f526f6f742f7461726765742d6e6f742d72656164790000000000000000000000604482015260640161039d565b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a26001600160a01b03165f90815260046020526040812055565b335f908152602081905260409020546001146104bb5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f9081526004602052604081205490036105215760405162461bcd60e51b815260206004820152601960248201527f526f6f742f7461726765742d6e6f742d7363686564756c656400000000000000604482015260640161039d565b6001600160a01b0381165f81815260046020526040808220829055517f12954ba8e01160103c697e7401f753d82b965f8d0a45781718b422502ff774fe9190a250565b335f908152602081905260409020546001146105b85760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f81815260036020526040808220829055517f1c24a27ac669c0278656c76cc711441c8dd32d21c32227dad2b42bf6271e8fae9190a250565b335f9081526020819052604090205460011461064f5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b816464656c617960d81b036106bb576224ea008111156106b15760405162461bcd60e51b815260206004820152601360248201527f526f6f742f64656c61792d746f6f2d6c6f6e6700000000000000000000000000604482015260640161039d565b6002819055610703565b60405162461bcd60e51b815260206004820152601c60248201527f526f6f742f66696c652d756e7265636f676e697a65642d706172616d00000000604482015260640161039d565b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c78260405161073591815260200190565b60405180910390a25050565b335f908152602081905260409020546001146107955760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6040516332fd71af60e11b81526001600160a01b0382811660048301528316906365fae35e906024015f604051808303815f87803b1580156107d5575f80fd5b505af11580156107e7573d5f803e3d5ffd5b50506040516001600160a01b038085169350851691507fe032f99b24b97d34237bef09a8f08752cb036f47cd0ff63043ae749d4ffd1883905f90a35050565b335f9081526020819052604090205460011461087a5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b600254610887904261132a565b6001600160a01b0382165f81815260046020526040808220849055517f642e41875b0eb08854d0256dba9a007f64aa9cd4cf23e127426c2afb166a372b9190a350565b335f9081526020819052604090205460011461091e5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33905f90a1565b335f908152602081905260409020546001146109a65760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b335f90815260208190526040902054600114610a3e5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f8181526003602052604080822060019055517fcf09648f68da83a35dee880bfc05f635fe373c3ba860b4322a8190febc6a1ac19190a250565b335f90815260208190526040902054600114610ad65760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001805460ff1916811790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625905f90a1565b335f90815260208190526040902054600114610b605760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b604051635f3e849f60e01b81526001600160a01b038481166004830152838116602483015260448201839052851690635f3e849f906064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b50505050816001600160a01b0316836001600160a01b0316856001600160a01b03167fa6e4b0db65070e00ef7e36f84930a21033d32cce5b93c77cbe0641c7147df21f84604051610c1491815260200190565b60405180910390a450505050565b335f90815260208190526040902054600114610c765760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f81815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b335f90815260208190526040902054600114610d0d5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b5f610d4c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061108492505050565b9050600581601c811115610d6257610d62611349565b03610db257610dad610205600185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b505050565b600681601c811115610dc657610dc6611349565b03610e1157610dad61019a600185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b600781601c811115610e2557610e25611349565b03610f57575f805f80610e71600188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610eb4602189898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610ef760418a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610f3a60618b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929392505061111e9050565b9350935093509350610f4e84848484610b0c565b50505050505050565b60405162461bcd60e51b815260206004820152601460248201527f526f6f742f696e76616c69642d6d657373616765000000000000000000000000604482015260640161039d565b335f90815260208190526040902054600114610ff35760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b604051639c52a7f160e01b81526001600160a01b038281166004830152831690639c52a7f1906024015f604051808303815f87803b158015611033575f80fd5b505af1158015611045573d5f803e3d5ffd5b50506040516001600160a01b038085169350851691507fd23b91392450f5cbcbeacb8d5fd17534719b16f8bdde4b9b637d25c3e155cd2a905f90a35050565b5f61108f8282611183565b60ff16601c8111156110a3576110a3611349565b92915050565b5f6110b582601461132a565b835110156111055760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015260640161039d565b5001602001516c01000000000000000000000000900490565b5f61112a82602061132a565b8351101561117a5760405162461bcd60e51b815260206004820152601560248201527f746f55696e743235365f6f75744f66426f756e64730000000000000000000000604482015260640161039d565b50016020015190565b5f61118f82600161132a565b835110156111df5760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e647300000000000000000000000000604482015260640161039d565b50016001015190565b80356001600160a01b03811681146111fe575f80fd5b919050565b5f60208284031215611213575f80fd5b61121c826111e8565b9392505050565b5f8060408385031215611234575f80fd5b50508035926020909101359150565b5f8060408385031215611254575f80fd5b61125d836111e8565b915061126b602084016111e8565b90509250929050565b5f805f8060808587031215611287575f80fd5b611290856111e8565b935061129e602086016111e8565b92506112ac604086016111e8565b9396929550929360600135925050565b5f80602083850312156112cd575f80fd5b823567ffffffffffffffff8111156112e3575f80fd5b8301601f810185136112f3575f80fd5b803567ffffffffffffffff811115611309575f80fd5b85602082840101111561131a575f80fd5b6020919091019590945092505050565b808201808211156110a357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea264697066735822122031c273d2e7a9c97cebe9e73f4e4c8e15833cfc5e92bc7cf893dece60c3ffd0f064736f6c634300081a00330000000000000000000000000000000005f458fd6ba9eeb5f365d83b7da913dd000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000007270b20603fbb3df0921381670fbd62b9991ada4

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610141575f3560e01c806365fae35e116100c357806395a2ef2a11610088578063bf48bcb611610063578063bf48bcb6146102d6578063e2fdcc17146102e9578063fe0ac3e714610328575f80fd5b806395a2ef2a146102915780639c52a7f1146102a4578063bf353dbb146102b7575f80fd5b806365fae35e1461022f5780636a42b8f8146102425780636ea5511f1461024b5780638456cb591461025e578063854b89d514610266575f80fd5b8063316bef9811610109578063316bef98146101c5578063373e73f8146101e45780633b687461146101f75780633f4ba83a1461020a5780635c975abb14610212575f80fd5b806301257c1a1461014557806301d156021461017757806311fd3baa1461018c57806326ae21a91461019f57806329ae8114146101b2575b5f80fd5b610164610153366004611203565b60036020525f908152604090205481565b6040519081526020015b60405180910390f35b61018a610185366004611203565b61033b565b005b61018a61019a366004611203565b610467565b61018a6101ad366004611203565b610564565b61018a6101c0366004611223565b6105fb565b6101646101d3366004611203565b60046020525f908152604090205481565b61018a6101f2366004611243565b610741565b61018a610205366004611203565b610826565b61018a6108ca565b60015461021f9060ff1681565b604051901515815260200161016e565b61018a61023d366004611203565b610952565b61016460025481565b61018a610259366004611203565b6109ea565b61018a610a82565b61021f610274366004611203565b6001600160a01b03165f9081526003602052604090205460011490565b61018a61029f366004611274565b610b0c565b61018a6102b2366004611203565b610c22565b6101646102c5366004611203565b5f6020819052908152604090205481565b61018a6102e43660046112bc565b610cb9565b6103107f0000000000000000000000000000000005f458fd6ba9eeb5f365d83b7da913dd81565b6040516001600160a01b03909116815260200161016e565b61018a610336366004611243565b610f9f565b6001600160a01b0381165f9081526004602052604081205490036103a65760405162461bcd60e51b815260206004820152601960248201527f526f6f742f7461726765742d6e6f742d7363686564756c65640000000000000060448201526064015b60405180910390fd5b6001600160a01b0381165f9081526004602052604090205442101561040d5760405162461bcd60e51b815260206004820152601560248201527f526f6f742f7461726765742d6e6f742d72656164790000000000000000000000604482015260640161039d565b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a26001600160a01b03165f90815260046020526040812055565b335f908152602081905260409020546001146104bb5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f9081526004602052604081205490036105215760405162461bcd60e51b815260206004820152601960248201527f526f6f742f7461726765742d6e6f742d7363686564756c656400000000000000604482015260640161039d565b6001600160a01b0381165f81815260046020526040808220829055517f12954ba8e01160103c697e7401f753d82b965f8d0a45781718b422502ff774fe9190a250565b335f908152602081905260409020546001146105b85760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f81815260036020526040808220829055517f1c24a27ac669c0278656c76cc711441c8dd32d21c32227dad2b42bf6271e8fae9190a250565b335f9081526020819052604090205460011461064f5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b816464656c617960d81b036106bb576224ea008111156106b15760405162461bcd60e51b815260206004820152601360248201527f526f6f742f64656c61792d746f6f2d6c6f6e6700000000000000000000000000604482015260640161039d565b6002819055610703565b60405162461bcd60e51b815260206004820152601c60248201527f526f6f742f66696c652d756e7265636f676e697a65642d706172616d00000000604482015260640161039d565b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c78260405161073591815260200190565b60405180910390a25050565b335f908152602081905260409020546001146107955760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6040516332fd71af60e11b81526001600160a01b0382811660048301528316906365fae35e906024015f604051808303815f87803b1580156107d5575f80fd5b505af11580156107e7573d5f803e3d5ffd5b50506040516001600160a01b038085169350851691507fe032f99b24b97d34237bef09a8f08752cb036f47cd0ff63043ae749d4ffd1883905f90a35050565b335f9081526020819052604090205460011461087a5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b600254610887904261132a565b6001600160a01b0382165f81815260046020526040808220849055517f642e41875b0eb08854d0256dba9a007f64aa9cd4cf23e127426c2afb166a372b9190a350565b335f9081526020819052604090205460011461091e5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001805460ff191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b33905f90a1565b335f908152602081905260409020546001146109a65760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f8181526020819052604080822060019055517fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a609190a250565b335f90815260208190526040902054600114610a3e5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f8181526003602052604080822060019055517fcf09648f68da83a35dee880bfc05f635fe373c3ba860b4322a8190febc6a1ac19190a250565b335f90815260208190526040902054600114610ad65760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001805460ff1916811790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff625905f90a1565b335f90815260208190526040902054600114610b605760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b604051635f3e849f60e01b81526001600160a01b038481166004830152838116602483015260448201839052851690635f3e849f906064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b50505050816001600160a01b0316836001600160a01b0316856001600160a01b03167fa6e4b0db65070e00ef7e36f84930a21033d32cce5b93c77cbe0641c7147df21f84604051610c1491815260200190565b60405180910390a450505050565b335f90815260208190526040902054600114610c765760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b6001600160a01b0381165f81815260208190526040808220829055517f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b9190a250565b335f90815260208190526040902054600114610d0d5760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b5f610d4c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061108492505050565b9050600581601c811115610d6257610d62611349565b03610db257610dad610205600185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b505050565b600681601c811115610dc657610dc6611349565b03610e1157610dad61019a600185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b600781601c811115610e2557610e25611349565b03610f57575f805f80610e71600188888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610eb4602189898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610ef760418a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092939250506110a99050565b610f3a60618b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929392505061111e9050565b9350935093509350610f4e84848484610b0c565b50505050505050565b60405162461bcd60e51b815260206004820152601460248201527f526f6f742f696e76616c69642d6d657373616765000000000000000000000000604482015260640161039d565b335f90815260208190526040902054600114610ff35760405162461bcd60e51b8152602060048201526013602482015272105d5d1a0bdb9bdd0b585d5d1a1bdc9a5e9959606a1b604482015260640161039d565b604051639c52a7f160e01b81526001600160a01b038281166004830152831690639c52a7f1906024015f604051808303815f87803b158015611033575f80fd5b505af1158015611045573d5f803e3d5ffd5b50506040516001600160a01b038085169350851691507fd23b91392450f5cbcbeacb8d5fd17534719b16f8bdde4b9b637d25c3e155cd2a905f90a35050565b5f61108f8282611183565b60ff16601c8111156110a3576110a3611349565b92915050565b5f6110b582601461132a565b835110156111055760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015260640161039d565b5001602001516c01000000000000000000000000900490565b5f61112a82602061132a565b8351101561117a5760405162461bcd60e51b815260206004820152601560248201527f746f55696e743235365f6f75744f66426f756e64730000000000000000000000604482015260640161039d565b50016020015190565b5f61118f82600161132a565b835110156111df5760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e647300000000000000000000000000604482015260640161039d565b50016001015190565b80356001600160a01b03811681146111fe575f80fd5b919050565b5f60208284031215611213575f80fd5b61121c826111e8565b9392505050565b5f8060408385031215611234575f80fd5b50508035926020909101359150565b5f8060408385031215611254575f80fd5b61125d836111e8565b915061126b602084016111e8565b90509250929050565b5f805f8060808587031215611287575f80fd5b611290856111e8565b935061129e602086016111e8565b92506112ac604086016111e8565b9396929550929360600135925050565b5f80602083850312156112cd575f80fd5b823567ffffffffffffffff8111156112e3575f80fd5b8301601f810185136112f3575f80fd5b803567ffffffffffffffff811115611309575f80fd5b85602082840101111561131a575f80fd5b6020919091019590945092505050565b808201808211156110a357634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffdfea264697066735822122031c273d2e7a9c97cebe9e73f4e4c8e15833cfc5e92bc7cf893dece60c3ffd0f064736f6c634300081a0033

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

0000000000000000000000000000000005f458fd6ba9eeb5f365d83b7da913dd000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000007270b20603fbb3df0921381670fbd62b9991ada4

-----Decoded View---------------
Arg [0] : _escrow (address): 0x0000000005F458Fd6ba9EEb5f365D83b7dA913dD
Arg [1] : _delay (uint256): 172800
Arg [2] : deployer (address): 0x7270b20603FbB3dF0921381670fbd62b9991aDa4

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000005f458fd6ba9eeb5f365d83b7da913dd
Arg [1] : 000000000000000000000000000000000000000000000000000000000002a300
Arg [2] : 0000000000000000000000007270b20603fbb3df0921381670fbd62b9991ada4


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.