Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy | 483334 | 5 days ago | IN | 0 S | 0.00011699 |
Latest 2 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
483334 | 5 days ago | Contract Creation | 0 S | |||
480692 | 5 days ago | Contract Creation | 0 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
StaticAggregationHookFactory
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ // ============ Internal Imports ============ import {StaticAggregationHook} from "./StaticAggregationHook.sol"; import {StaticAddressSetFactory} from "../../libs/StaticAddressSetFactory.sol"; contract StaticAggregationHookFactory is StaticAddressSetFactory { function _deployImplementation() internal virtual override returns (address) { return address(new StaticAggregationHook()); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ import {AbstractPostDispatchHook} from "../libs/AbstractPostDispatchHook.sol"; import {IPostDispatchHook} from "../../interfaces/hooks/IPostDispatchHook.sol"; import {MetaProxy} from "../../libs/MetaProxy.sol"; contract StaticAggregationHook is AbstractPostDispatchHook { // ============ External functions ============ /// @inheritdoc IPostDispatchHook function hookType() external pure override returns (uint8) { return uint8(IPostDispatchHook.Types.AGGREGATION); } /// @inheritdoc AbstractPostDispatchHook function _postDispatch( bytes calldata metadata, bytes calldata message ) internal override { address[] memory _hooks = hooks(message); uint256 count = _hooks.length; for (uint256 i = 0; i < count; i++) { uint256 quote = IPostDispatchHook(_hooks[i]).quoteDispatch( metadata, message ); IPostDispatchHook(_hooks[i]).postDispatch{value: quote}( metadata, message ); } } /// @inheritdoc AbstractPostDispatchHook function _quoteDispatch( bytes calldata metadata, bytes calldata message ) internal view override returns (uint256) { address[] memory _hooks = hooks(message); uint256 count = _hooks.length; uint256 total = 0; for (uint256 i = 0; i < count; i++) { total += IPostDispatchHook(_hooks[i]).quoteDispatch( metadata, message ); } return total; } function hooks(bytes calldata) public pure returns (address[] memory) { return abi.decode(MetaProxy.metadata(), (address[])); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; // ============ External Imports ============ import {Address} from "@openzeppelin/contracts/utils/Address.sol"; import {Create2} from "@openzeppelin/contracts/utils/Create2.sol"; // ============ Internal Imports ============ import {MetaProxy} from "./MetaProxy.sol"; import {PackageVersioned} from "../PackageVersioned.sol"; import {IThresholdAddressFactory} from "../interfaces/IThresholdAddressFactory.sol"; abstract contract StaticThresholdAddressSetFactory is PackageVersioned, IThresholdAddressFactory { // ============ Immutables ============ address public immutable implementation; // ============ Constructor ============ constructor() { implementation = _deployImplementation(); } function _deployImplementation() internal virtual returns (address); /** * @notice Deploys a StaticThresholdAddressSet contract address for the given * values * @dev Consider sorting addresses to ensure contract reuse * @param _values An array of addresses * @param _threshold The threshold value to use * @return set The contract address representing this StaticThresholdAddressSet */ function deploy( address[] calldata _values, uint8 _threshold ) public returns (address) { require( 0 < _threshold && _threshold <= _values.length, "Invalid threshold" ); (bytes32 _salt, bytes memory _bytecode) = _saltAndBytecode( _values, _threshold ); address _set = _getAddress(_salt, _bytecode); if (!Address.isContract(_set)) { _set = Create2.deploy(0, _salt, _bytecode); } return _set; } /** * @notice Returns the StaticThresholdAddressSet contract address for the given * values * @dev Consider sorting addresses to ensure contract reuse * @param _values An array of addresses * @param _threshold The threshold value to use * @return set The contract address representing this StaticThresholdAddressSet */ function getAddress( address[] calldata _values, uint8 _threshold ) external view returns (address) { (bytes32 _salt, bytes memory _bytecode) = _saltAndBytecode( _values, _threshold ); return _getAddress(_salt, _bytecode); } /** * @notice Returns the StaticThresholdAddressSet contract address for the given * values * @param _salt The salt used in Create2 * @param _bytecode The metaproxy bytecode used in Create2 * @return set The contract address representing this StaticThresholdAddressSet */ function _getAddress( bytes32 _salt, bytes memory _bytecode ) internal view returns (address) { bytes32 _bytecodeHash = keccak256(_bytecode); return Create2.computeAddress(_salt, _bytecodeHash); } /** * @notice Returns the create2 salt and bytecode for the given values * @param _values An array of addresses * @param _threshold The threshold value to use * @return _salt The salt used in Create2 * @return _bytecode The metaproxy bytecode used in Create2 */ function _saltAndBytecode( address[] calldata _values, uint8 _threshold ) internal view returns (bytes32, bytes memory) { bytes memory _metadata = abi.encode(_values, _threshold); bytes memory _bytecode = MetaProxy.bytecode(implementation, _metadata); bytes32 _salt = keccak256(_metadata); return (_salt, _bytecode); } } abstract contract StaticAddressSetFactory is StaticThresholdAddressSetFactory { /** * @notice Deploys a StaticAddressSet contract address for the given * values * @dev Consider sorting addresses to ensure contract reuse * @param _values An array of addresses * @return set The contract address representing this StaticAddressSet */ function deploy(address[] calldata _values) external returns (address) { return super.deploy(_values, uint8(_values.length)); } /** * @notice Returns the StaticAddressSet contract address for the given * values * @dev Consider sorting addresses to ensure contract reuse * @param _values An array of addresses * @return set The contract address representing this StaticAddressSet */ function getAddress( address[] calldata _values ) external view returns (address) { (bytes32 _salt, bytes memory _bytecode) = _saltAndBytecode( _values, uint8(_values.length) ); return super._getAddress(_salt, _bytecode); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ // ============ Internal Imports ============ import {StandardHookMetadata} from "./StandardHookMetadata.sol"; import {IPostDispatchHook} from "../../interfaces/hooks/IPostDispatchHook.sol"; import {PackageVersioned} from "../../PackageVersioned.sol"; /** * @title AbstractPostDispatch * @notice Abstract post dispatch hook supporting the current global hook metadata variant. */ abstract contract AbstractPostDispatchHook is IPostDispatchHook, PackageVersioned { using StandardHookMetadata for bytes; // ============ External functions ============ /// @inheritdoc IPostDispatchHook function supportsMetadata( bytes calldata metadata ) public pure virtual override returns (bool) { return metadata.length == 0 || metadata.variant() == StandardHookMetadata.VARIANT; } /// @inheritdoc IPostDispatchHook function postDispatch( bytes calldata metadata, bytes calldata message ) external payable override { require( supportsMetadata(metadata), "AbstractPostDispatchHook: invalid metadata variant" ); _postDispatch(metadata, message); } /// @inheritdoc IPostDispatchHook function quoteDispatch( bytes calldata metadata, bytes calldata message ) public view override returns (uint256) { require( supportsMetadata(metadata), "AbstractPostDispatchHook: invalid metadata variant" ); return _quoteDispatch(metadata, message); } // ============ Internal functions ============ /** * @notice Post dispatch hook implementation. * @param metadata The metadata of the message being dispatched. * @param message The message being dispatched. */ function _postDispatch( bytes calldata metadata, bytes calldata message ) internal virtual; /** * @notice Quote dispatch hook implementation. * @param metadata The metadata of the message being dispatched. * @param message The message being dispatched. * @return The quote for the dispatch. */ function _quoteDispatch( bytes calldata metadata, bytes calldata message ) internal view virtual returns (uint256); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ interface IPostDispatchHook { enum Types { UNUSED, ROUTING, AGGREGATION, MERKLE_TREE, INTERCHAIN_GAS_PAYMASTER, FALLBACK_ROUTING, ID_AUTH_ISM, PAUSABLE, PROTOCOL_FEE, LAYER_ZERO_V1, RATE_LIMITED, ARB_L2_TO_L1, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of hook */ function hookType() external view returns (uint8); /** * @notice Returns whether the hook supports metadata * @param metadata metadata * @return Whether the hook supports metadata */ function supportsMetadata( bytes calldata metadata ) external view returns (bool); /** * @notice Post action after a message is dispatched via the Mailbox * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call */ function postDispatch( bytes calldata metadata, bytes calldata message ) external payable; /** * @notice Compute the payment required by the postDispatch call * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call * @return Quoted payment for the postDispatch call */ function quoteDispatch( bytes calldata metadata, bytes calldata message ) external view returns (uint256); }
// SPDX-License-Identifier: CC0-1.0 pragma solidity >=0.7.6; /// @dev Adapted from https://eips.ethereum.org/EIPS/eip-3448 library MetaProxy { bytes32 private constant PREFIX = hex"600b380380600b3d393df3363d3d373d3d3d3d60368038038091363936013d73"; bytes13 private constant SUFFIX = hex"5af43d3d93803e603457fd5bf3"; function bytecode( address _implementation, bytes memory _metadata ) internal pure returns (bytes memory) { return abi.encodePacked( PREFIX, bytes20(_implementation), SUFFIX, _metadata, _metadata.length ); } function metadata() internal pure returns (bytes memory) { bytes memory data; assembly { let posOfMetadataSize := sub(calldatasize(), 32) let size := calldataload(posOfMetadataSize) let dataPtr := sub(posOfMetadataSize, size) data := mload(64) // increment free memory pointer by metadata size + 32 bytes (length) mstore(64, add(data, add(size, 32))) mstore(data, size) let memPtr := add(data, 32) calldatacopy(memPtr, dataPtr, size) } return data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Create2.sol) pragma solidity ^0.8.0; /** * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * `CREATE2` can be used to compute in advance the address where a smart * contract will be deployed, which allows for interesting new mechanisms known * as 'counterfactual interactions'. * * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more * information. */ library Create2 { /** * @dev Deploys a contract using `CREATE2`. The address where the contract * will be deployed can be known in advance via {computeAddress}. * * The bytecode for a contract can be obtained from Solidity with * `type(contractName).creationCode`. * * Requirements: * * - `bytecode` must not be empty. * - `salt` must have not been used for `bytecode` already. * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) { require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); /// @solidity memory-safe-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the * `bytecodeHash` or `salt` will result in a new destination address. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { return computeAddress(salt, bytecodeHash, address(this)); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | // |-------------------|---------------------------------------------------------------------------| // | bytecodeHash | CCCCCCCCCCCCC...CC | // | salt | BBBBBBBBBBBBB...BB | // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | // | 0xFF | FF | // |-------------------|---------------------------------------------------------------------------| // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | mstore(add(ptr, 0x40), bytecodeHash) mstore(add(ptr, 0x20), salt) mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff mstore8(start, 0xff) addr := keccak256(start, 85) } } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.11; /** * @title PackageVersioned * @notice Package version getter for contracts **/ abstract contract PackageVersioned { // GENERATED CODE - DO NOT EDIT string public constant PACKAGE_VERSION = "5.8.3"; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; interface IThresholdAddressFactory { function deploy( address[] calldata _values, uint8 _threshold ) external returns (address); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.8.0; /*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@*/ /** * Format of metadata: * * [0:2] variant * [2:34] msg.value * [34:66] Gas limit for message (IGP) * [66:86] Refund address for message (IGP) * [86:] Custom metadata */ library StandardHookMetadata { struct Metadata { uint16 variant; uint256 msgValue; uint256 gasLimit; address refundAddress; } uint8 private constant VARIANT_OFFSET = 0; uint8 private constant MSG_VALUE_OFFSET = 2; uint8 private constant GAS_LIMIT_OFFSET = 34; uint8 private constant REFUND_ADDRESS_OFFSET = 66; uint256 private constant MIN_METADATA_LENGTH = 86; uint16 public constant VARIANT = 1; /** * @notice Returns the variant of the metadata. * @param _metadata ABI encoded standard hook metadata. * @return variant of the metadata as uint8. */ function variant(bytes calldata _metadata) internal pure returns (uint16) { if (_metadata.length < VARIANT_OFFSET + 2) return 0; return uint16(bytes2(_metadata[VARIANT_OFFSET:VARIANT_OFFSET + 2])); } /** * @notice Returns the specified value for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback value. * @return Value for the message as uint256. */ function msgValue( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < MSG_VALUE_OFFSET + 32) return _default; return uint256(bytes32(_metadata[MSG_VALUE_OFFSET:MSG_VALUE_OFFSET + 32])); } /** * @notice Returns the specified gas limit for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback gas limit. * @return Gas limit for the message as uint256. */ function gasLimit( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < GAS_LIMIT_OFFSET + 32) return _default; return uint256(bytes32(_metadata[GAS_LIMIT_OFFSET:GAS_LIMIT_OFFSET + 32])); } /** * @notice Returns the specified refund address for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback refund address. * @return Refund address for the message as address. */ function refundAddress( bytes calldata _metadata, address _default ) internal pure returns (address) { if (_metadata.length < REFUND_ADDRESS_OFFSET + 20) return _default; return address( bytes20( _metadata[REFUND_ADDRESS_OFFSET:REFUND_ADDRESS_OFFSET + 20] ) ); } /** * @notice Returns any custom metadata. * @param _metadata ABI encoded standard hook metadata. * @return Custom metadata. */ function getCustomMetadata( bytes calldata _metadata ) internal pure returns (bytes calldata) { if (_metadata.length < MIN_METADATA_LENGTH) return _metadata[0:0]; return _metadata[MIN_METADATA_LENGTH:]; } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @param _gasLimit Gas limit for the message. * @param _refundAddress Refund address for the message. * @param _customMetadata Additional metadata to include in the standard hook metadata. * @return ABI encoded standard hook metadata. */ function formatMetadata( uint256 _msgValue, uint256 _gasLimit, address _refundAddress, bytes memory _customMetadata ) internal pure returns (bytes memory) { return abi.encodePacked( VARIANT, _msgValue, _gasLimit, _refundAddress, _customMetadata ); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @return ABI encoded standard hook metadata. */ function overrideMsgValue( uint256 _msgValue ) internal view returns (bytes memory) { return formatMetadata(_msgValue, uint256(0), msg.sender, ""); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _gasLimit Gas limit for the message. * @return ABI encoded standard hook metadata. */ function overrideGasLimit( uint256 _gasLimit ) internal view returns (bytes memory) { return formatMetadata(uint256(0), _gasLimit, msg.sender, ""); } /** * @notice Formats the specified refund address into standard hook metadata. * @param _refundAddress Refund address for the message. * @return ABI encoded standard hook metadata. */ function overrideRefundAddress( address _refundAddress ) internal pure returns (bytes memory) { return formatMetadata(uint256(0), uint256(0), _refundAddress, ""); } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"PACKAGE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_values","type":"address[]"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_values","type":"address[]"},{"internalType":"uint8","name":"_threshold","type":"uint8"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_values","type":"address[]"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_values","type":"address[]"},{"internalType":"uint8","name":"_threshold","type":"uint8"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5061001961002a565b6001600160a01b0316608052610067565b60006040516100389061005a565b604051809103906000f080158015610054573d6000803e3d6000fd5b50905090565b610b008061083283390190565b6080516107aa6100886000396000818160b901526102c801526107aa6000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063ce82905811610050578063ce82905814610124578063d4277ebc14610137578063ed547bf71461014a57600080fd5b80630570b1fa146100775780635c60da1b146100b457806393c44847146100db575b600080fd5b61008a610085366004610574565b61015d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a7f000000000000000000000000000000000000000000000000000000000000000081565b6101176040518060400160405280600581526020017f352e382e3300000000000000000000000000000000000000000000000000000081525081565b6040516100ab91906105da565b61008a610132366004610574565b610171565b61008a61014536600461062b565b610197565b61008a61015836600461062b565b6101bf565b600061016a8383806101bf565b9392505050565b60008080610180858580610295565b9150915061018e8282610305565b95945050505050565b60008060006101a7868686610295565b915091506101b58282610305565b9695505050505050565b60008160ff1660001080156101d7575060ff82168310155b610242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207468726573686f6c6400000000000000000000000000000060448201526064015b60405180910390fd5b600080610250868686610295565b9150915060006102608383610305565b905073ffffffffffffffffffffffffffffffffffffffff81163b6101b55761028a60008484610321565b979650505050505050565b6000606060008585856040516020016102b093929190610688565b604051602081830303815290604052905060006102ed7f000000000000000000000000000000000000000000000000000000000000000083610480565b82516020909301929092209791965090945050505050565b8051602082012060009061031984826104f6565b949350505050565b60008347101561038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610239565b81516000036103f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610239565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661016a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610239565b60607f600b380380600b3d393df3363d3d373d3d3d3d60368038038091363936013d738360601b7f5af43d3d93803e603457fd5bf3000000000000000000000000000000000000008485516040516020016104df9594939291906106f5565b604051602081830303815290604052905092915050565b600061016a8383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60008083601f84011261053a57600080fd5b50813567ffffffffffffffff81111561055257600080fd5b6020830191508360208260051b850101111561056d57600080fd5b9250929050565b6000806020838503121561058757600080fd5b823567ffffffffffffffff81111561059e57600080fd5b6105aa85828601610528565b90969095509350505050565b60005b838110156105d15781810151838201526020016105b9565b50506000910152565b60208152600082518060208401526105f98160408501602087016105b6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006040848603121561064057600080fd5b833567ffffffffffffffff81111561065757600080fd5b61066386828701610528565b909450925050602084013560ff8116811461067d57600080fd5b809150509250925092565b604080825281018390526000846060830182805b878110156106dd57833573ffffffffffffffffffffffffffffffffffffffff81168082146106c8578384fd5b8452506020938401939092019160010161069c565b5050809250505060ff83166020830152949350505050565b8581527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851660208201527fffffffffffffffffffffffffff00000000000000000000000000000000000000841660348201526000835161075d8160418501602088016105b6565b60419201918201929092526061019594505050505056fea2646970667358221220c4d26282ce3b2f543bbc58ff04503288e6ea8ef6a2d9d86081383fdcd99a276f64736f6c63430008130033608060405234801561001057600080fd5b50610ae0806100206000396000f3fe6080604052600436106100655760003560e01c8063aaccd23011610043578063aaccd2301461010b578063e445e7dd14610139578063e5320bb91461015557600080fd5b8063086011b91461006a57806337b02c281461007f57806393c44847146100b5575b600080fd5b61007d610078366004610633565b610185565b005b34801561008b57600080fd5b5061009f61009a36600461069f565b610232565b6040516100ac91906106e1565b60405180910390f35b3480156100c157600080fd5b506100fe6040518060400160405280600581526020017f352e382e3300000000000000000000000000000000000000000000000000000081525081565b6040516100ac919061073b565b34801561011757600080fd5b5061012b610126366004610633565b610258565b6040519081526020016100ac565b34801561014557600080fd5b50604051600281526020016100ac565b34801561016157600080fd5b5061017561017036600461069f565b610305565b60405190151581526020016100ac565b61018f8484610305565b610220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4162737472616374506f73744469737061746368486f6f6b3a20696e76616c6960448201527f64206d657461646174612076617269616e74000000000000000000000000000060648201526084015b60405180910390fd5b61022c84848484610327565b50505050565b606061023c610488565b80602001905181019061024f91906107ff565b90505b92915050565b60006102648585610305565b6102f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4162737472616374506f73744469737061746368486f6f6b3a20696e76616c6960448201527f64206d657461646174612076617269616e7400000000000000000000000000006064820152608401610217565b6102fc858585856104b8565b95945050505050565b600081158061024f5750600161031b8484610599565b61ffff16149392505050565b60006103338383610232565b805190915060005b8181101561047f576000838281518110610357576103576108e2565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663aaccd230898989896040518563ffffffff1660e01b815260040161039d949392919061095a565b602060405180830381865afa1580156103ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103de919061098c565b90508382815181106103f2576103f26108e2565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663086011b9828a8a8a8a6040518663ffffffff1660e01b8152600401610439949392919061095a565b6000604051808303818588803b15801561045257600080fd5b505af1158015610466573d6000803e3d6000fd5b5050505050508080610477906109d4565b91505061033b565b50505050505050565b60608060203603803580820391506040519250602081018301604052808352602083018183823750919392505050565b6000806104c58484610232565b80519091506000805b8281101561058d578381815181106104e8576104e86108e2565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1663aaccd2308a8a8a8a6040518563ffffffff1660e01b815260040161052e949392919061095a565b602060405180830381865afa15801561054b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056f919061098c565b6105799083610a0c565b915080610585816109d4565b9150506104ce565b50979650505050505050565b60006105a6816002610a1f565b60ff168210156105b857506000610252565b826000836105c7826002610a1f565b60ff16926105d793929190610a38565b6105e091610a62565b60f01c9392505050565b60008083601f8401126105fc57600080fd5b50813567ffffffffffffffff81111561061457600080fd5b60208301915083602082850101111561062c57600080fd5b9250929050565b6000806000806040858703121561064957600080fd5b843567ffffffffffffffff8082111561066157600080fd5b61066d888389016105ea565b9096509450602087013591508082111561068657600080fd5b50610693878288016105ea565b95989497509550505050565b600080602083850312156106b257600080fd5b823567ffffffffffffffff8111156106c957600080fd5b6106d5858286016105ea565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561072f57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016106fd565b50909695505050505050565b600060208083528351808285015260005b818110156107685785810183015185820160400152820161074c565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b805173ffffffffffffffffffffffffffffffffffffffff811681146107fa57600080fd5b919050565b6000602080838503121561081257600080fd5b825167ffffffffffffffff8082111561082a57600080fd5b818501915085601f83011261083e57600080fd5b815181811115610850576108506107a7565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715610893576108936107a7565b6040529182528482019250838101850191888311156108b157600080fd5b938501935b828510156108d6576108c7856107d6565b845293850193928501926108b6565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60408152600061096e604083018688610911565b8281036020840152610981818587610911565b979650505050505050565b60006020828403121561099e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a0557610a056109a5565b5060010190565b80820180821115610252576102526109a5565b60ff8181168382160190811115610252576102526109a5565b60008085851115610a4857600080fd5b83861115610a5557600080fd5b5050820193919092039150565b7fffff0000000000000000000000000000000000000000000000000000000000008135818116916002851015610aa25780818660020360031b1b83161692505b50509291505056fea2646970667358221220219d4036bf2e213d8f86f8632b35b338f2251b1ba8c44370fc2c2bd8d9fb94bd64736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063ce82905811610050578063ce82905814610124578063d4277ebc14610137578063ed547bf71461014a57600080fd5b80630570b1fa146100775780635c60da1b146100b457806393c44847146100db575b600080fd5b61008a610085366004610574565b61015d565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61008a7f00000000000000000000000019930232e9afc4f4f09d09fe2375680fac2100d081565b6101176040518060400160405280600581526020017f352e382e3300000000000000000000000000000000000000000000000000000081525081565b6040516100ab91906105da565b61008a610132366004610574565b610171565b61008a61014536600461062b565b610197565b61008a61015836600461062b565b6101bf565b600061016a8383806101bf565b9392505050565b60008080610180858580610295565b9150915061018e8282610305565b95945050505050565b60008060006101a7868686610295565b915091506101b58282610305565b9695505050505050565b60008160ff1660001080156101d7575060ff82168310155b610242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207468726573686f6c6400000000000000000000000000000060448201526064015b60405180910390fd5b600080610250868686610295565b9150915060006102608383610305565b905073ffffffffffffffffffffffffffffffffffffffff81163b6101b55761028a60008484610321565b979650505050505050565b6000606060008585856040516020016102b093929190610688565b604051602081830303815290604052905060006102ed7f00000000000000000000000019930232e9afc4f4f09d09fe2375680fac2100d083610480565b82516020909301929092209791965090945050505050565b8051602082012060009061031984826104f6565b949350505050565b60008347101561038d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610239565b81516000036103f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610239565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661016a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610239565b60607f600b380380600b3d393df3363d3d373d3d3d3d60368038038091363936013d738360601b7f5af43d3d93803e603457fd5bf3000000000000000000000000000000000000008485516040516020016104df9594939291906106f5565b604051602081830303815290604052905092915050565b600061016a8383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b60008083601f84011261053a57600080fd5b50813567ffffffffffffffff81111561055257600080fd5b6020830191508360208260051b850101111561056d57600080fd5b9250929050565b6000806020838503121561058757600080fd5b823567ffffffffffffffff81111561059e57600080fd5b6105aa85828601610528565b90969095509350505050565b60005b838110156105d15781810151838201526020016105b9565b50506000910152565b60208152600082518060208401526105f98160408501602087016105b6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060006040848603121561064057600080fd5b833567ffffffffffffffff81111561065757600080fd5b61066386828701610528565b909450925050602084013560ff8116811461067d57600080fd5b809150509250925092565b604080825281018390526000846060830182805b878110156106dd57833573ffffffffffffffffffffffffffffffffffffffff81168082146106c8578384fd5b8452506020938401939092019160010161069c565b5050809250505060ff83166020830152949350505050565b8581527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000851660208201527fffffffffffffffffffffffffff00000000000000000000000000000000000000841660348201526000835161075d8160418501602088016105b6565b60419201918201929092526061019594505050505056fea2646970667358221220c4d26282ce3b2f543bbc58ff04503288e6ea8ef6a2d9d86081383fdcd99a276f64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
GLMR | 100.00% | $0.239876 | 0.000000000000003431 | <$0.000001 |
[ 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.