Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
SimulatorUtils
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.19; import "../../interfaces/IDecapacitor.sol"; import "../../interfaces/ISocket.sol"; import "../../interfaces/ISignatureVerifier.sol"; import {TRANSMITTER_ROLE, EXECUTOR_ROLE} from "../../utils/AccessRoles.sol"; import "../../utils/AccessControlExtended.sol"; contract SimulatorUtils is AccessControlExtended { ISocket public socket__; ISignatureVerifier public signatureVerifier__; error InsufficientMsgValue(); constructor( address socket_, address signatureVerifier_, address signer_, uint32 siblingSlug_ ) AccessControlExtended(msg.sender) { socket__ = ISocket(socket_); signatureVerifier__ = ISignatureVerifier(signatureVerifier_); _grantRoleWithSlug(TRANSMITTER_ROLE, siblingSlug_, signer_); _grantRole(EXECUTOR_ROLE, signer_); } // TM function checkTransmitter( uint32 siblingSlug_, bytes32 digest_, bytes calldata signature_ ) external view returns (address, bool) { address transmitter = signatureVerifier__.recoverSigner( digest_, signature_ ); _hasRoleWithSlug(TRANSMITTER_ROLE, siblingSlug_, transmitter); return (transmitter, true); } // EM function updateExecutionFees(address, uint128, bytes32) external view { if (msg.sender != address(socket__)) return; } function verifyParams( bytes32 executionParams_, uint256 msgValue_ ) external pure { uint256 params = uint256(executionParams_); uint8 paramType = uint8(params >> 248); if (paramType == 0) return; uint256 expectedMsgValue = uint256(uint248(params)); if (msgValue_ < expectedMsgValue) revert InsufficientMsgValue(); } function isExecutor( bytes32 packedMessage, bytes memory sig ) external view returns (address executor, bool isValidExecutor) { executor = signatureVerifier__.recoverSigner(packedMessage, sig); _hasRole(EXECUTOR_ROLE, executor); isValidExecutor = true; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; /** * @title IDecapacitor interface * @notice Interface for a contract that verifies if a packed message is part of a packet or not */ interface IDecapacitor { /** * @notice Returns true if packed message is part of root. * @param root_ root hash of the packet. * @param packedMessage_ packed message which needs to be verified. * @param proof_ proof used to determine the inclusion * @dev This function is kept as view instead of pure, as in future we may have stateful decapacitors * @return isIncluded boolean indicating whether the message is included in the packet or not. */ function verifyMessageInclusion( bytes32 root_, bytes32 packedMessage_, bytes calldata proof_ ) external returns (bool isIncluded); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; /** * @title Execution Manager Interface * @dev This interface defines the functions for managing and executing transactions on external chains * @dev It is also responsible for collecting all the socket fees, which can then be pulled by others */ interface IExecutionManager { struct ExecutionFeesParam { // for calculating perGasCost * gasLimit uint80 perGasCost; // for calculating cost for executing payload (needed for rollups) uint80 perByteCost; // additional cost (differs based on chain) uint80 overhead; } /** * @notice Returns the executor of the packed message and whether the executor is authorized * @param packedMessage The message packed with payload, fees and config * @param sig The signature of the message * @return The address of the executor and a boolean indicating if the executor is authorized */ function isExecutor( bytes32 packedMessage, bytes memory sig ) external view returns (address, bool); /** * @notice Pays the fees for executing a transaction on the external chain * @dev This function is payable and assumes the socket is going to send correct amount of fees. * @param minMsgGasLimit_ The minimum gas limit for the transaction * @param payloadSize_ The payload size in bytes * @param executionParams_ Extra params for execution * @param transmissionParams_ Extra params for transmission * @param siblingChainSlug_ Sibling chain identifier * @param switchboardFees_ fee charged by switchboard for processing transaction * @param verificationOverheadFees_ fee charged for verifying transaction * @param transmitManager_ The transmitManager address * @param switchboard_ The switchboard address * @param maxPacketLength_ The maxPacketLength for the capacitor */ function payAndCheckFees( uint256 minMsgGasLimit_, uint256 payloadSize_, bytes32 executionParams_, bytes32 transmissionParams_, uint32 siblingChainSlug_, uint128 switchboardFees_, uint128 verificationOverheadFees_, address transmitManager_, address switchboard_, uint256 maxPacketLength_ ) external payable returns (uint128, uint128); /** * @notice Returns the minimum fees required for executing a transaction on the external chain * @param minMsgGasLimit_ minMsgGasLimit_ * @param siblingChainSlug_ The destination slug * @return The minimum fees required for executing the transaction */ function getMinFees( uint256 minMsgGasLimit_, uint256 payloadSize_, bytes32 executionParams_, uint32 siblingChainSlug_ ) external view returns (uint128); /** * @notice function for getting the minimum fees required for executing and transmitting a cross-chain transaction * @dev this function is called at source to calculate the execution cost. * @param payloadSize_ byte length of payload. Currently only used to check max length, later on will be used for fees calculation. * @param executionParams_ Can be used for providing extra information. Currently used for msgValue * @param siblingChainSlug_ Sibling chain identifier * @return minExecutionFee : Minimum fees required for executing the transaction */ function getExecutionTransmissionMinFees( uint256 minMsgGasLimit_, uint256 payloadSize_, bytes32 executionParams_, bytes32 transmissionParams_, uint32 siblingChainSlug_, address transmitManager_ ) external view returns (uint128, uint128); /** * @notice Updates the execution fees for an executor and message ID * @param executor The executor address * @param executionFees The execution fees to update * @param msgId The ID of the message */ function updateExecutionFees( address executor, uint128 executionFees, bytes32 msgId ) external; /** * @notice updates the transmission fee * @param remoteChainSlug_ sibling chain identifier * @param transmitMinFees_ transmission fees collected */ function setTransmissionMinFees( uint32 remoteChainSlug_, uint128 transmitMinFees_ ) external; /** * @notice sets the minimum execution fees required for executing at `siblingChainSlug_` * @dev this function currently sets the price for a constant msg gas limit and payload size * @param nonce_ incremental id to prevent signature replay * @param siblingChainSlug_ sibling chain identifier * @param executionFees_ total fees where price in destination native token is converted to source native tokens * @param signature_ signature of fee updater */ function setExecutionFees( uint256 nonce_, uint32 siblingChainSlug_, ExecutionFeesParam calldata executionFees_, bytes calldata signature_ ) external; /** * @notice sets the min limit for msg value for `siblingChainSlug_` * @param nonce_ incremental id to prevent signature replay * @param siblingChainSlug_ sibling chain identifier * @param msgValueMinThreshold_ min msg value * @param signature_ signature of fee updater */ function setMsgValueMinThreshold( uint256 nonce_, uint32 siblingChainSlug_, uint256 msgValueMinThreshold_, bytes calldata signature_ ) external; /** * @notice sets the max limit for msg value for `siblingChainSlug_` * @param nonce_ incremental id to prevent signature replay * @param siblingChainSlug_ sibling chain identifier * @param msgValueMaxThreshold_ max msg value * @param signature_ signature of fee updater */ function setMsgValueMaxThreshold( uint256 nonce_, uint32 siblingChainSlug_, uint256 msgValueMaxThreshold_, bytes calldata signature_ ) external; /** * @notice sets the relative token price for `siblingChainSlug_` * @dev this function is expected to be called frequently to match the original prices * @param nonce_ incremental id to prevent signature replay * @param siblingChainSlug_ sibling chain identifier * @param relativeNativeTokenPrice_ relative price * @param signature_ signature of fee updater */ function setRelativeNativeTokenPrice( uint256 nonce_, uint32 siblingChainSlug_, uint256 relativeNativeTokenPrice_, bytes calldata signature_ ) external; /** * @notice called by socket while executing message to validate if the msg value provided is enough * @param executionParams_ a bytes32 string where first byte gives param type (if value is 0 or not) * and remaining bytes give the msg value needed * @param msgValue_ msg.value to be sent with inbound */ function verifyParams( bytes32 executionParams_, uint256 msgValue_ ) external view; /** * @notice withdraws switchboard fees from contract * @param siblingChainSlug_ withdraw fees corresponding to this slug * @param amount_ withdraw amount */ function withdrawSwitchboardFees( uint32 siblingChainSlug_, address switchboard_, uint128 amount_ ) external; /** * @dev this function gets the transmitManager address from the socket contract. If it is ever upgraded in socket, * @dev remove the fees from executionManager first, and then upgrade address at socket. * @notice withdraws transmission fees from contract * @param siblingChainSlug_ withdraw fees corresponding to this slug * @param amount_ withdraw amount */ function withdrawTransmissionFees( uint32 siblingChainSlug_, uint128 amount_ ) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; /** * @title Signature Verifier * @notice Verifies the signatures and returns the address of signer recovered from the input signature or digest. */ interface ISignatureVerifier { /** * @notice returns the address of signer recovered from input signature and digest */ function recoverSigner( bytes32 digest_, bytes memory signature_ ) external pure returns (address signer); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; import "./ITransmitManager.sol"; import "./IExecutionManager.sol"; /** * @title ISocket * @notice An interface for a cross-chain communication contract * @dev This interface provides methods for transmitting and executing messages between chains, * connecting a plug to a remote chain and setting up switchboards for the message transmission * This interface also emits events for important operations such as message transmission, execution status, * and plug connection */ interface ISocket { /** * @notice A struct containing fees required for message transmission and execution * @param transmissionFees fees needed for transmission * @param switchboardFees fees needed by switchboard * @param executionFee fees needed for execution */ struct Fees { uint128 transmissionFees; uint128 executionFee; uint128 switchboardFees; } /** * @title MessageDetails * @dev This struct defines the details of a message to be executed in a Decapacitor contract. */ struct MessageDetails { // A unique identifier for the message. bytes32 msgId; // The fee to be paid for executing the message. uint256 executionFee; // The min amount of gas that can be used to execute the message. uint256 minMsgGasLimit; // The extra params which might provide msg value and additional info needed for message exec bytes32 executionParams; // The payload data to be executed in the message. bytes payload; } /** * @title ExecutionDetails * @dev This struct defines the execution details */ struct ExecutionDetails { // packet id bytes32 packetId; // proposal count uint256 proposalCount; // gas limit needed to execute inbound uint256 executionGasLimit; // proof data required by the Decapacitor contract to verify the message's authenticity bytes decapacitorProof; // signature of executor bytes signature; } /** * @notice emits the status of message after inbound call * @param msgId msg id which is executed */ event ExecutionSuccess(bytes32 msgId); /** * @notice emits the config set by a plug for a remoteChainSlug * @param plug address of plug on current chain * @param siblingChainSlug sibling chain slug * @param siblingPlug address of plug on sibling chain * @param inboundSwitchboard inbound switchboard (select from registered options) * @param outboundSwitchboard outbound switchboard (select from registered options) * @param capacitor capacitor selected based on outbound switchboard * @param decapacitor decapacitor selected based on inbound switchboard */ event PlugConnected( address plug, uint32 siblingChainSlug, address siblingPlug, address inboundSwitchboard, address outboundSwitchboard, address capacitor, address decapacitor ); /** * @notice registers a message * @dev Packs the message and includes it in a packet with capacitor * @param remoteChainSlug_ the remote chain slug * @param minMsgGasLimit_ the gas limit needed to execute the payload on remote * @param payload_ the data which is needed by plug at inbound call on remote */ function outbound( uint32 remoteChainSlug_, uint256 minMsgGasLimit_, bytes32 executionParams_, bytes32 transmissionParams_, bytes calldata payload_ ) external payable returns (bytes32 msgId); /** * @notice executes a message * @param executionDetails_ the packet details, proof and signature needed for message execution * @param messageDetails_ the message details */ function execute( ISocket.ExecutionDetails calldata executionDetails_, ISocket.MessageDetails calldata messageDetails_ ) external payable; /** * @notice seals data in capacitor for specific batchSize * @param batchSize_ size of batch to be sealed * @param capacitorAddress_ address of capacitor * @param signature_ signed Data needed for verification */ function seal( uint256 batchSize_, address capacitorAddress_, bytes calldata signature_ ) external payable; /** * @notice proposes a packet * @param packetId_ packet id * @param root_ root data * @param switchboard_ The address of switchboard for which this packet is proposed * @param signature_ signed Data needed for verification */ function proposeForSwitchboard( bytes32 packetId_, bytes32 root_, address switchboard_, bytes calldata signature_ ) external payable; /** * @notice sets the config specific to the plug * @param siblingChainSlug_ the sibling chain slug * @param siblingPlug_ address of plug present at sibling chain to call inbound * @param inboundSwitchboard_ the address of switchboard to use for receiving messages * @param outboundSwitchboard_ the address of switchboard to use for sending messages */ function connect( uint32 siblingChainSlug_, address siblingPlug_, address inboundSwitchboard_, address outboundSwitchboard_ ) external; /** * @notice deploy capacitor and decapacitor for a switchboard with a specified max packet length, sibling chain slug, and capacitor type. * @param siblingChainSlug_ The slug of the sibling chain that the switchboard is registered with. * @param maxPacketLength_ The maximum length of a packet allowed by the switchboard. * @param capacitorType_ The type of capacitor that the switchboard uses. * @param siblingSwitchboard_ The switchboard address deployed on `siblingChainSlug_` */ function registerSwitchboardForSibling( uint32 siblingChainSlug_, uint256 maxPacketLength_, uint256 capacitorType_, address siblingSwitchboard_ ) external returns (address capacitor, address decapacitor); /** * @notice Emits the sibling switchboard for given `siblingChainSlug_`. * @dev This function is expected to be only called by switchboard. * @dev the event emitted is tracked by transmitters to decide which switchboard a packet should be proposed on * @param siblingChainSlug_ The slug of the sibling chain * @param siblingSwitchboard_ The switchboard address deployed on `siblingChainSlug_` */ function useSiblingSwitchboard( uint32 siblingChainSlug_, address siblingSwitchboard_ ) external; /** * @notice Retrieves the packet id roots for a specified packet id. * @param packetId_ The packet id for which to retrieve the root. * @param proposalCount_ The proposal id for packetId_ for which to retrieve the root. * @param switchboard_ The address of switchboard for which this packet is proposed * @return The packet id roots for the specified packet id. */ function packetIdRoots( bytes32 packetId_, uint256 proposalCount_, address switchboard_ ) external view returns (bytes32); /** * @notice Retrieves the latest proposalCount for a packet id. * @return The proposal count for the specified packet id. */ function proposalCount(bytes32 packetId_) external view returns (uint256); /** * @notice Retrieves the minimum fees required for a message with a specified gas limit and destination chain. * @param minMsgGasLimit_ The gas limit of the message. * @param remoteChainSlug_ The slug of the destination chain for the message. * @param plug_ The address of the plug through which the message is sent. * @return totalFees The minimum fees required for the specified message. */ function getMinFees( uint256 minMsgGasLimit_, uint256 payloadSize_, bytes32 executionParams_, bytes32 transmissionParams_, uint32 remoteChainSlug_, address plug_ ) external view returns (uint256 totalFees); /// return instance of transmit manager function transmitManager__() external view returns (ITransmitManager); /// return instance of execution manager function executionManager__() external view returns (IExecutionManager); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; /** * @title ITransmitManager * @dev The interface for a transmit manager contract */ interface ITransmitManager { /** * @notice Checks if a given transmitter is authorized to send transactions to the destination chain. * @param siblingSlug The unique identifier for the sibling chain. * @param digest The digest of the message being signed. * @param signature The signature of the message being signed. * @return The address of the transmitter and a boolean indicating whether the transmitter is authorized or not. */ function checkTransmitter( uint32 siblingSlug, bytes32 digest, bytes calldata signature ) external view returns (address, bool); /** * @notice sets the transmission fee needed to transmit message to given `siblingSlug_` * @dev recovered address should add have feeUpdater role for `siblingSlug_` * @param nonce_ The incremental nonce to prevent signature replay * @param siblingSlug_ sibling id for which fee updater is registered * @param transmissionFees_ digest which is signed by transmitter * @param signature_ signature */ function setTransmissionFees( uint256 nonce_, uint32 siblingSlug_, uint128 transmissionFees_, bytes calldata signature_ ) external; /** * @notice receives fees from Execution manager * @dev this function can be used to keep track of fees received for each slug * @param siblingSlug_ sibling id for which fee updater is registered */ function receiveFees(uint32 siblingSlug_) external payable; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; import "./Ownable.sol"; /** * @title AccessControl * @dev This abstract contract implements access control mechanism based on roles. * Each role can have one or more addresses associated with it, which are granted * permission to execute functions with the onlyRole modifier. */ abstract contract AccessControl is Ownable { /** * @dev A mapping of roles to a mapping of addresses to boolean values indicating whether or not they have the role. */ mapping(bytes32 => mapping(address => bool)) private _permits; /** * @dev Emitted when a role is granted to an address. */ event RoleGranted(bytes32 indexed role, address indexed grantee); /** * @dev Emitted when a role is revoked from an address. */ event RoleRevoked(bytes32 indexed role, address indexed revokee); /** * @dev Error message thrown when an address does not have permission to execute a function with onlyRole modifier. */ error NoPermit(bytes32 role); /** * @dev Constructor that sets the owner of the contract. */ constructor(address owner_) Ownable(owner_) {} /** * @dev Modifier that restricts access to addresses having roles * Throws an error if the caller do not have permit */ modifier onlyRole(bytes32 role) { if (!_permits[role][msg.sender]) revert NoPermit(role); _; } /** * @dev Checks and reverts if an address do not have a specific role. * @param role_ The role to check. * @param address_ The address to check. */ function _checkRole(bytes32 role_, address address_) internal virtual { if (!_hasRole(role_, address_)) revert NoPermit(role_); } /** * @dev Grants a role to a given address. * @param role_ The role to grant. * @param grantee_ The address to grant the role to. * Emits a RoleGranted event. * Can only be called by the owner of the contract. */ function grantRole( bytes32 role_, address grantee_ ) external virtual onlyOwner { _grantRole(role_, grantee_); } /** * @dev Revokes a role from a given address. * @param role_ The role to revoke. * @param revokee_ The address to revoke the role from. * Emits a RoleRevoked event. * Can only be called by the owner of the contract. */ function revokeRole( bytes32 role_, address revokee_ ) external virtual onlyOwner { _revokeRole(role_, revokee_); } /** * @dev Internal function to grant a role to a given address. * @param role_ The role to grant. * @param grantee_ The address to grant the role to. * Emits a RoleGranted event. */ function _grantRole(bytes32 role_, address grantee_) internal { _permits[role_][grantee_] = true; emit RoleGranted(role_, grantee_); } /** * @dev Internal function to revoke a role from a given address. * @param role_ The role to revoke. * @param revokee_ The address to revoke the role from. * Emits a RoleRevoked event. */ function _revokeRole(bytes32 role_, address revokee_) internal { _permits[role_][revokee_] = false; emit RoleRevoked(role_, revokee_); } /** * @dev Checks whether an address has a specific role. * @param role_ The role to check. * @param address_ The address to check. * @return A boolean value indicating whether or not the address has the role. */ function hasRole( bytes32 role_, address address_ ) external view returns (bool) { return _hasRole(role_, address_); } function _hasRole( bytes32 role_, address address_ ) internal view returns (bool) { return _permits[role_][address_]; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; import "./AccessControl.sol"; /** * @title AccessControlExtended * @dev This contract extends the functionality of the AccessControl contract by adding * the ability to grant and revoke roles based on a combination of role name and a chain slug. * It also provides batch operations for granting and revoking roles. */ contract AccessControlExtended is AccessControl { /** * @dev Constructor that sets the owner of the contract. */ constructor(address owner_) AccessControl(owner_) {} /** * @dev thrown when array lengths are not equal */ error UnequalArrayLengths(); /** * @dev Checks if an address has the role. * @param roleName_ The name of the role. * @param chainSlug_ The chain slug associated with the role. * @param address_ The address to be granted the role. */ function _checkRoleWithSlug( bytes32 roleName_, uint256 chainSlug_, address address_ ) internal virtual { bytes32 roleHash = keccak256(abi.encode(roleName_, chainSlug_)); if (!_hasRole(roleHash, address_)) revert NoPermit(roleHash); } /** * @dev Grants a role to an address based on the role name and chain slug. * @param roleName_ The name of the role. * @param chainSlug_ The chain slug associated with the role. * @param grantee_ The address to be granted the role. */ function grantRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address grantee_ ) external virtual onlyOwner { _grantRoleWithSlug(roleName_, chainSlug_, grantee_); } /** * @dev Grants multiple roles to multiple addresses in batch. * @param roleNames_ The names of the roles to grant. * @param slugs_ The slugs for chain specific roles. For roles which are not chain-specific, we can use slug = 0 * @param grantees_ The addresses to be granted the roles. */ function grantBatchRole( bytes32[] calldata roleNames_, uint32[] calldata slugs_, address[] calldata grantees_ ) external virtual onlyOwner { if ( roleNames_.length != grantees_.length || roleNames_.length != slugs_.length ) revert UnequalArrayLengths(); uint256 totalRoles = roleNames_.length; for (uint256 index = 0; index < totalRoles; ) { if (slugs_[index] > 0) _grantRoleWithSlug( roleNames_[index], slugs_[index], grantees_[index] ); else _grantRole(roleNames_[index], grantees_[index]); // inputs are controlled by owner unchecked { ++index; } } } /** * @dev Revokes multiple roles from multiple addresses in batch. * @param roleNames_ The names of the roles to revoke. * @param slugs_ The slugs for chain specific roles. For roles which are not chain-specific, we can use slug = 0 * @param grantees_ The addresses to be revoked the roles. */ function revokeBatchRole( bytes32[] calldata roleNames_, uint32[] calldata slugs_, address[] calldata grantees_ ) external virtual onlyOwner { if ( roleNames_.length != grantees_.length || roleNames_.length != slugs_.length ) revert UnequalArrayLengths(); uint256 totalRoles = roleNames_.length; for (uint256 index = 0; index < totalRoles; ) { if (slugs_[index] > 0) _revokeRoleWithSlug( roleNames_[index], slugs_[index], grantees_[index] ); else _revokeRole(roleNames_[index], grantees_[index]); // inputs are controlled by owner unchecked { ++index; } } } function _grantRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address grantee_ ) internal { _grantRole(keccak256(abi.encode(roleName_, chainSlug_)), grantee_); } /** * @dev Checks if an address has a role based on the role name and chain slug. * @param roleName_ The name of the role. * @param chainSlug_ The chain slug associated with the role. * @param address_ The address to check for the role. * @return A boolean indicating whether the address has the specified role. */ function hasRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address address_ ) external view returns (bool) { return _hasRoleWithSlug(roleName_, chainSlug_, address_); } function _hasRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address address_ ) internal view returns (bool) { return _hasRole(keccak256(abi.encode(roleName_, chainSlug_)), address_); } /** * @dev Revokes roles from an address * @param roleName_ The names of the roles to revoke. * @param chainSlug_ The chain slug associated with the role. * @param grantee_ The addresses to be revoked the roles. */ function revokeRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address grantee_ ) external virtual onlyOwner { _revokeRoleWithSlug(roleName_, chainSlug_, grantee_); } function _revokeRoleWithSlug( bytes32 roleName_, uint32 chainSlug_, address revokee_ ) internal { _revokeRole(keccak256(abi.encode(roleName_, chainSlug_)), revokee_); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; // contains role hashes used in socket dl for various different operations // used to rescue funds bytes32 constant RESCUE_ROLE = keccak256("RESCUE_ROLE"); // used to withdraw fees bytes32 constant WITHDRAW_ROLE = keccak256("WITHDRAW_ROLE"); // used to trip switchboards bytes32 constant TRIP_ROLE = keccak256("TRIP_ROLE"); // used to un trip switchboards bytes32 constant UN_TRIP_ROLE = keccak256("UN_TRIP_ROLE"); // used by governance bytes32 constant GOVERNANCE_ROLE = keccak256("GOVERNANCE_ROLE"); //used by executors which executes message at destination bytes32 constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); // used by transmitters who seal and propose packets in socket bytes32 constant TRANSMITTER_ROLE = keccak256("TRANSMITTER_ROLE"); // used by switchboard watchers who work against transmitters bytes32 constant WATCHER_ROLE = keccak256("WATCHER_ROLE"); // used by fee updaters responsible for updating fees at switchboards, transmit manager and execution manager bytes32 constant FEES_UPDATER_ROLE = keccak256("FEES_UPDATER_ROLE");
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.19; /** * @title Ownable * @dev The Ownable contract provides a simple way to manage ownership of a contract * and allows for ownership to be transferred to a nominated address. */ abstract contract Ownable { address private _owner; address private _nominee; event OwnerNominated(address indexed nominee); event OwnerClaimed(address indexed claimer); error OnlyOwner(); error OnlyNominee(); /** * @dev Sets the contract's owner to the address that is passed to the constructor. */ constructor(address owner_) { _claimOwner(owner_); } /** * @dev Modifier that restricts access to only the contract's owner. * Throws an error if the caller is not the owner. */ modifier onlyOwner() { if (msg.sender != _owner) revert OnlyOwner(); _; } /** * @dev Returns the current owner of the contract. */ function owner() external view returns (address) { return _owner; } /** * @dev Returns the current nominee for ownership of the contract. */ function nominee() external view returns (address) { return _nominee; } /** * @dev Allows the current owner to nominate a new owner for the contract. * Throws an error if the caller is not the owner. * Emits an `OwnerNominated` event with the address of the nominee. */ function nominateOwner(address nominee_) external { if (msg.sender != _owner) revert OnlyOwner(); _nominee = nominee_; emit OwnerNominated(_nominee); } /** * @dev Allows the nominated owner to claim ownership of the contract. * Throws an error if the caller is not the nominee. * Sets the nominated owner as the new owner of the contract. * Emits an `OwnerClaimed` event with the address of the new owner. */ function claimOwner() external { if (msg.sender != _nominee) revert OnlyNominee(); _claimOwner(msg.sender); } /** * @dev Internal function that sets the owner of the contract to the specified address * and sets the nominee to address(0). */ function _claimOwner(address claimer_) internal { _owner = claimer_; _nominee = address(0); emit OwnerClaimed(claimer_); } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"socket_","type":"address"},{"internalType":"address","name":"signatureVerifier_","type":"address"},{"internalType":"address","name":"signer_","type":"address"},{"internalType":"uint32","name":"siblingSlug_","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientMsgValue","type":"error"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"NoPermit","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"UnequalArrayLengths","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"grantee","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"revokee","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[{"internalType":"uint32","name":"siblingSlug_","type":"uint32"},{"internalType":"bytes32","name":"digest_","type":"bytes32"},{"internalType":"bytes","name":"signature_","type":"bytes"}],"name":"checkTransmitter","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roleNames_","type":"bytes32[]"},{"internalType":"uint32[]","name":"slugs_","type":"uint32[]"},{"internalType":"address[]","name":"grantees_","type":"address[]"}],"name":"grantBatchRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role_","type":"bytes32"},{"internalType":"address","name":"grantee_","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleName_","type":"bytes32"},{"internalType":"uint32","name":"chainSlug_","type":"uint32"},{"internalType":"address","name":"grantee_","type":"address"}],"name":"grantRoleWithSlug","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role_","type":"bytes32"},{"internalType":"address","name":"address_","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleName_","type":"bytes32"},{"internalType":"uint32","name":"chainSlug_","type":"uint32"},{"internalType":"address","name":"address_","type":"address"}],"name":"hasRoleWithSlug","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"packedMessage","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"isExecutor","outputs":[{"internalType":"address","name":"executor","type":"address"},{"internalType":"bool","name":"isValidExecutor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roleNames_","type":"bytes32[]"},{"internalType":"uint32[]","name":"slugs_","type":"uint32[]"},{"internalType":"address[]","name":"grantees_","type":"address[]"}],"name":"revokeBatchRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role_","type":"bytes32"},{"internalType":"address","name":"revokee_","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleName_","type":"bytes32"},{"internalType":"uint32","name":"chainSlug_","type":"uint32"},{"internalType":"address","name":"grantee_","type":"address"}],"name":"revokeRoleWithSlug","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signatureVerifier__","outputs":[{"internalType":"contract ISignatureVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"socket__","outputs":[{"internalType":"contract ISocket","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"updateExecutionFees","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"executionParams_","type":"bytes32"},{"internalType":"uint256","name":"msgValue_","type":"uint256"}],"name":"verifyParams","outputs":[],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620015aa380380620015aa8339810160408190526200003491620001f2565b3380806200004281620000d8565b5050600380546001600160a01b038088166001600160a01b031992831617909255600480549287169290911691909117905550620000a27fd6a0f92c822ccba0fa91b30f08f085e68bc8eb3bb140aa16f8dc33ea47eb6cf282846200012b565b620000ce7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63836200017a565b5050505062000259565b600080546001600160a01b0383166001600160a01b0319918216811783556001805490921690915560405190917ffbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f8791a250565b6200017583836040516020016200015292919091825263ffffffff16602082015260400190565b60405160208183030381529060405280519060200120826200017a60201b60201c565b505050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551909184917f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f39190a35050565b80516001600160a01b0381168114620001ed57600080fd5b919050565b600080600080608085870312156200020957600080fd5b6200021485620001d5565b93506200022460208601620001d5565b92506200023460408601620001d5565b9150606085015163ffffffff811681146200024e57600080fd5b939692955090935050565b61134180620002696000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806391d14854116100b2578063c6a261d211610081578063d5b8da7311610066578063d5b8da73146102d4578063ecb97484146102f4578063f1f069d61461030757600080fd5b8063c6a261d2146102a1578063d547741f146102c157600080fd5b806391d1485414610219578063954d09c91461023c578063a56d92ce1461027b578063b7ee4eb91461028e57600080fd5b80632f2ff15d1161010957806343fa97ca116100ee57806343fa97ca146101d55780635b94db27146101e85780638da5cb5b146101fb57600080fd5b80632f2ff15d146101ba5780633bd1adec146101cd57600080fd5b80631ba8e4841461013b5780631e8673111461015057806320f99c0a146101635780632e7eb258146101a7575b600080fd5b61014e610149366004610e62565b61031a565b005b61014e61015e366004610eee565b61037b565b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014e6101b5366004610e62565b610521565b61014e6101c8366004610f88565b61057d565b61014e6105dc565b61014e6101e3366004610eee565b610638565b61014e6101f6366004610fb8565b6107d4565b60005473ffffffffffffffffffffffffffffffffffffffff1661017d565b61022c610227366004610f88565b610894565b604051901515815260200161019e565b61024f61024a366004611004565b6108cf565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835290151560208301520161019e565b61014e6102893660046110dd565b6109b3565b61024f61029c3660046110ff565b610a2b565b60035461017d9073ffffffffffffffffffffffffffffffffffffffff1681565b61014e6102cf366004610f88565b610b07565b60045461017d9073ffffffffffffffffffffffffffffffffffffffff1681565b61022c610302366004610e62565b610b62565b61014e610315366004611186565b610b77565b60005473ffffffffffffffffffffffffffffffffffffffff16331461036b576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610376838383610b9b565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103cc576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84811415806103db5750848314155b15610412576040517f11e86f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460005b81811015610517576000868683818110610432576104326111dc565b9050602002016020810190610447919061120b565b63ffffffff1611156104c7576104c2888883818110610468576104686111dc565b90506020020135878784818110610481576104816111dc565b9050602002016020810190610496919061120b565b8686858181106104a8576104a86111dc565b90506020020160208101906104bd9190610fb8565b610b9b565b61050f565b61050f8888838181106104dc576104dc6111dc565b905060200201358585848181106104f5576104f56111dc565b905060200201602081019061050a9190610fb8565b610bd8565b600101610416565b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610572576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610376838383610c5b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ce576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105d88282610c98565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461062d576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063633610d1e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610689576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84811415806106985750848314155b156106cf576040517f11e86f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460005b818110156105175760008686838181106106ef576106ef6111dc565b9050602002016020810190610704919061120b565b63ffffffff1611156107845761077f888883818110610725576107256111dc565b9050602002013587878481811061073e5761073e6111dc565b9050602002016020810190610753919061120b565b868685818110610765576107656111dc565b905060200201602081019061077a9190610fb8565b610c5b565b6107cc565b6107cc888883818110610799576107996111dc565b905060200201358585848181106107b2576107b26111dc565b90506020020160208101906107c79190610fb8565b610c98565b6001016106d3565b60005473ffffffffffffffffffffffffffffffffffffffff163314610825576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff165b9392505050565b600480546040517f97aba7f9000000000000000000000000000000000000000000000000000000008152600092839273ffffffffffffffffffffffffffffffffffffffff16916397aba7f991610929918891889101611226565b602060405180830381865afa158015610946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096a919061129a565b73ffffffffffffffffffffffffffffffffffffffff81166000527f59aaad84481dba1ea935653b992572e94234e3bd8a15f7adf9511af432a4fd4f602052946001945092505050565b8160f881901c60008190036109c85750505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821680841015610a24576040517f78f38f7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600480546040517f97aba7f90000000000000000000000000000000000000000000000000000000081526000928392839273ffffffffffffffffffffffffffffffffffffffff909116916397aba7f991610a8b918a918a918a91016112b7565b602060405180830381865afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc919061129a565b9050610af97fd6a0f92c822ccba0fa91b30f08f085e68bc8eb3bb140aa16f8dc33ea47eb6cf28883610d96565b509660019650945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b58576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105d88282610bd8565b6000610b6f848484610d96565b949350505050565b60035473ffffffffffffffffffffffffffffffffffffffff16331461037657505050565b6103768383604051602001610bc092919091825263ffffffff16602082015260400190565b60405160208183030381529060405280519060200120825b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551909184917f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a529190a35050565b6103768383604051602001610c8092919091825263ffffffff16602082015260400190565b60405160208183030381529060405280519060200120825b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551909184917f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f39190a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001805490921690915560405190917ffbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f8791a250565b6000610b6f8484604051602001610dbd92919091825263ffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526002835281812073ffffffffffffffffffffffffffffffffffffffff8716825290925290205460ff1690565b803563ffffffff81168114610e3857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5f57600080fd5b50565b600080600060608486031215610e7757600080fd5b83359250610e8760208501610e24565b91506040840135610e9781610e3d565b809150509250925092565b60008083601f840112610eb457600080fd5b50813567ffffffffffffffff811115610ecc57600080fd5b6020830191508360208260051b8501011115610ee757600080fd5b9250929050565b60008060008060008060608789031215610f0757600080fd5b863567ffffffffffffffff80821115610f1f57600080fd5b610f2b8a838b01610ea2565b90985096506020890135915080821115610f4457600080fd5b610f508a838b01610ea2565b90965094506040890135915080821115610f6957600080fd5b50610f7689828a01610ea2565b979a9699509497509295939492505050565b60008060408385031215610f9b57600080fd5b823591506020830135610fad81610e3d565b809150509250929050565b600060208284031215610fca57600080fd5b81356108c881610e3d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561101757600080fd5b82359150602083013567ffffffffffffffff8082111561103657600080fd5b818501915085601f83011261104a57600080fd5b81358181111561105c5761105c610fd5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156110a2576110a2610fd5565b816040528281528860208487010111156110bb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080604083850312156110f057600080fd5b50508035926020909101359150565b6000806000806060858703121561111557600080fd5b61111e85610e24565b935060208501359250604085013567ffffffffffffffff8082111561114257600080fd5b818701915087601f83011261115657600080fd5b81358181111561116557600080fd5b88602082850101111561117757600080fd5b95989497505060200194505050565b60008060006060848603121561119b57600080fd5b83356111a681610e3d565b925060208401356fffffffffffffffffffffffffffffffff811681146111cb57600080fd5b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561121d57600080fd5b6108c882610e24565b82815260006020604081840152835180604085015260005b8181101561125a5785810183015185820160600152820161123e565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b6000602082840312156112ac57600080fd5b81516108c881610e3d565b83815260406020820152816040820152818360608301376000818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019291505056fea2646970667358221220e64a890ade8013c020781142a93a08a84ebdb18e93a8a3f8938af21ead45844764736f6c63430008130033000000000000000000000000525a6489a1df5ff1ae077faf628e43b7f52298ef000000000000000000000000c8a4d2fd77c155fd52e65ab07f337abf84495ead000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c18360000000000000000000000000000000000000000000000000000000000000092
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c806391d14854116100b2578063c6a261d211610081578063d5b8da7311610066578063d5b8da73146102d4578063ecb97484146102f4578063f1f069d61461030757600080fd5b8063c6a261d2146102a1578063d547741f146102c157600080fd5b806391d1485414610219578063954d09c91461023c578063a56d92ce1461027b578063b7ee4eb91461028e57600080fd5b80632f2ff15d1161010957806343fa97ca116100ee57806343fa97ca146101d55780635b94db27146101e85780638da5cb5b146101fb57600080fd5b80632f2ff15d146101ba5780633bd1adec146101cd57600080fd5b80631ba8e4841461013b5780631e8673111461015057806320f99c0a146101635780632e7eb258146101a7575b600080fd5b61014e610149366004610e62565b61031a565b005b61014e61015e366004610eee565b61037b565b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61014e6101b5366004610e62565b610521565b61014e6101c8366004610f88565b61057d565b61014e6105dc565b61014e6101e3366004610eee565b610638565b61014e6101f6366004610fb8565b6107d4565b60005473ffffffffffffffffffffffffffffffffffffffff1661017d565b61022c610227366004610f88565b610894565b604051901515815260200161019e565b61024f61024a366004611004565b6108cf565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835290151560208301520161019e565b61014e6102893660046110dd565b6109b3565b61024f61029c3660046110ff565b610a2b565b60035461017d9073ffffffffffffffffffffffffffffffffffffffff1681565b61014e6102cf366004610f88565b610b07565b60045461017d9073ffffffffffffffffffffffffffffffffffffffff1681565b61022c610302366004610e62565b610b62565b61014e610315366004611186565b610b77565b60005473ffffffffffffffffffffffffffffffffffffffff16331461036b576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610376838383610b9b565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103cc576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84811415806103db5750848314155b15610412576040517f11e86f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460005b81811015610517576000868683818110610432576104326111dc565b9050602002016020810190610447919061120b565b63ffffffff1611156104c7576104c2888883818110610468576104686111dc565b90506020020135878784818110610481576104816111dc565b9050602002016020810190610496919061120b565b8686858181106104a8576104a86111dc565b90506020020160208101906104bd9190610fb8565b610b9b565b61050f565b61050f8888838181106104dc576104dc6111dc565b905060200201358585848181106104f5576104f56111dc565b905060200201602081019061050a9190610fb8565b610bd8565b600101610416565b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610572576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610376838383610c5b565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ce576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105d88282610c98565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461062d576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61063633610d1e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610689576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84811415806106985750848314155b156106cf576040517f11e86f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460005b818110156105175760008686838181106106ef576106ef6111dc565b9050602002016020810190610704919061120b565b63ffffffff1611156107845761077f888883818110610725576107256111dc565b9050602002013587878481811061073e5761073e6111dc565b9050602002016020810190610753919061120b565b868685818110610765576107656111dc565b905060200201602081019061077a9190610fb8565b610c5b565b6107cc565b6107cc888883818110610799576107996111dc565b905060200201358585848181106107b2576107b26111dc565b90506020020160208101906107c79190610fb8565b610c98565b6001016106d3565b60005473ffffffffffffffffffffffffffffffffffffffff163314610825576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff165b9392505050565b600480546040517f97aba7f9000000000000000000000000000000000000000000000000000000008152600092839273ffffffffffffffffffffffffffffffffffffffff16916397aba7f991610929918891889101611226565b602060405180830381865afa158015610946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096a919061129a565b73ffffffffffffffffffffffffffffffffffffffff81166000527f59aaad84481dba1ea935653b992572e94234e3bd8a15f7adf9511af432a4fd4f602052946001945092505050565b8160f881901c60008190036109c85750505050565b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821680841015610a24576040517f78f38f7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600480546040517f97aba7f90000000000000000000000000000000000000000000000000000000081526000928392839273ffffffffffffffffffffffffffffffffffffffff909116916397aba7f991610a8b918a918a918a91016112b7565b602060405180830381865afa158015610aa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acc919061129a565b9050610af97fd6a0f92c822ccba0fa91b30f08f085e68bc8eb3bb140aa16f8dc33ea47eb6cf28883610d96565b509660019650945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b58576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105d88282610bd8565b6000610b6f848484610d96565b949350505050565b60035473ffffffffffffffffffffffffffffffffffffffff16331461037657505050565b6103768383604051602001610bc092919091825263ffffffff16602082015260400190565b60405160208183030381529060405280519060200120825b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551909184917f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a529190a35050565b6103768383604051602001610c8092919091825263ffffffff16602082015260400190565b60405160208183030381529060405280519060200120825b600082815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551909184917f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f39190a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001805490921690915560405190917ffbe19c9b601f5ee90b44c7390f3fa2319eba01762d34ee372aeafd59b25c7f8791a250565b6000610b6f8484604051602001610dbd92919091825263ffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060009081526002835281812073ffffffffffffffffffffffffffffffffffffffff8716825290925290205460ff1690565b803563ffffffff81168114610e3857600080fd5b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e5f57600080fd5b50565b600080600060608486031215610e7757600080fd5b83359250610e8760208501610e24565b91506040840135610e9781610e3d565b809150509250925092565b60008083601f840112610eb457600080fd5b50813567ffffffffffffffff811115610ecc57600080fd5b6020830191508360208260051b8501011115610ee757600080fd5b9250929050565b60008060008060008060608789031215610f0757600080fd5b863567ffffffffffffffff80821115610f1f57600080fd5b610f2b8a838b01610ea2565b90985096506020890135915080821115610f4457600080fd5b610f508a838b01610ea2565b90965094506040890135915080821115610f6957600080fd5b50610f7689828a01610ea2565b979a9699509497509295939492505050565b60008060408385031215610f9b57600080fd5b823591506020830135610fad81610e3d565b809150509250929050565b600060208284031215610fca57600080fd5b81356108c881610e3d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806040838503121561101757600080fd5b82359150602083013567ffffffffffffffff8082111561103657600080fd5b818501915085601f83011261104a57600080fd5b81358181111561105c5761105c610fd5565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156110a2576110a2610fd5565b816040528281528860208487010111156110bb57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080604083850312156110f057600080fd5b50508035926020909101359150565b6000806000806060858703121561111557600080fd5b61111e85610e24565b935060208501359250604085013567ffffffffffffffff8082111561114257600080fd5b818701915087601f83011261115657600080fd5b81358181111561116557600080fd5b88602082850101111561117757600080fd5b95989497505060200194505050565b60008060006060848603121561119b57600080fd5b83356111a681610e3d565b925060208401356fffffffffffffffffffffffffffffffff811681146111cb57600080fd5b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561121d57600080fd5b6108c882610e24565b82815260006020604081840152835180604085015260005b8181101561125a5785810183015185820160600152820161123e565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b6000602082840312156112ac57600080fd5b81516108c881610e3d565b83815260406020820152816040820152818360608301376000818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019291505056fea2646970667358221220e64a890ade8013c020781142a93a08a84ebdb18e93a8a3f8938af21ead45844764736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000525a6489a1df5ff1ae077faf628e43b7f52298ef000000000000000000000000c8a4d2fd77c155fd52e65ab07f337abf84495ead000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c18360000000000000000000000000000000000000000000000000000000000000092
-----Decoded View---------------
Arg [0] : socket_ (address): 0x525a6489a1df5fF1ae077fAf628E43b7F52298eF
Arg [1] : signatureVerifier_ (address): 0xc8a4D2fd77c155fd52e65Ab07F337aBF84495Ead
Arg [2] : signer_ (address): 0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836
Arg [3] : siblingSlug_ (uint32): 146
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000525a6489a1df5ff1ae077faf628e43b7f52298ef
Arg [1] : 000000000000000000000000c8a4d2fd77c155fd52e65ab07f337abf84495ead
Arg [2] : 000000000000000000000000b0bbff6311b7f245761a7846d3ce7b1b100c1836
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000092
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.