Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 15 from a total of 15 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Schedule... | 23219135 | 188 days ago | IN | 0 ETH | 0.00003324 | ||||
| Execute Schedule... | 23015821 | 216 days ago | IN | 0 ETH | 0.00001606 | ||||
| Execute Schedule... | 22981855 | 221 days ago | IN | 0 ETH | 0.00006107 | ||||
| Execute Schedule... | 22546584 | 282 days ago | IN | 0 ETH | 0.0001818 | ||||
| Execute Schedule... | 22496389 | 289 days ago | IN | 0 ETH | 0.00014233 | ||||
| Execute Schedule... | 21988007 | 360 days ago | IN | 0 ETH | 0.00005943 | ||||
| Execute Schedule... | 20460660 | 573 days ago | IN | 0 ETH | 0.0074092 | ||||
| Execute Schedule... | 20460660 | 573 days ago | IN | 0 ETH | 0.0074092 | ||||
| Execute Schedule... | 20460657 | 573 days ago | IN | 0 ETH | 0.0073488 | ||||
| Execute Schedule... | 20460656 | 573 days ago | IN | 0 ETH | 0.00654701 | ||||
| Deny | 20432396 | 577 days ago | IN | 0 ETH | 0.00016232 | ||||
| Rely | 20432396 | 577 days ago | IN | 0 ETH | 0.00032898 | ||||
| Rely | 20432396 | 577 days ago | IN | 0 ETH | 0.00032898 | ||||
| Endorse | 20432395 | 577 days ago | IN | 0 ETH | 0.00031348 | ||||
| Endorse | 20432395 | 577 days ago | IN | 0 ETH | 0.00031379 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60a06040 | 20432393 | 577 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Root
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 500 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.