More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xfa45336cb5bc58c9ec8306e35a79ddd5c83c443757b8339cac8c606e5fbf0ff0 | Deposit | (pending) | 29 mins ago | IN | 0.01 ETH | (Pending) | |||
Deposit | 21246319 | 17 mins ago | IN | 0.01 ETH | 0.00122155 | ||||
Deposit | 21246162 | 49 mins ago | IN | 5.3 ETH | 0.00135232 | ||||
Deposit | 21245977 | 1 hr ago | IN | 0.01 ETH | 0.00156734 | ||||
Deposit | 21245824 | 1 hr ago | IN | 0.26630309 ETH | 0.00141282 | ||||
Deposit | 21245805 | 2 hrs ago | IN | 0.52 ETH | 0.00133142 | ||||
Deposit | 21245629 | 2 hrs ago | IN | 0.04439885 ETH | 0.0009792 | ||||
Deposit | 21245600 | 2 hrs ago | IN | 0.004 ETH | 0.00090996 | ||||
Deposit | 21245577 | 2 hrs ago | IN | 0.002 ETH | 0.00076393 | ||||
Deposit | 21245464 | 3 hrs ago | IN | 0.155 ETH | 0.00086199 | ||||
Deposit | 21245339 | 3 hrs ago | IN | 27.09559515 ETH | 0.00103159 | ||||
Deposit | 21245327 | 3 hrs ago | IN | 22.043 ETH | 0.00112458 | ||||
Deposit | 21245326 | 3 hrs ago | IN | 2.99587468 ETH | 0.00106279 | ||||
Deposit | 21245231 | 3 hrs ago | IN | 16.292 ETH | 0.00118248 | ||||
Deposit | 21244933 | 4 hrs ago | IN | 94 ETH | 0.00095647 | ||||
Deposit | 21244921 | 4 hrs ago | IN | 0.05 ETH | 0.00094683 | ||||
Deposit | 21244870 | 5 hrs ago | IN | 30.00010311 ETH | 0.0009324 | ||||
Deposit | 21244857 | 5 hrs ago | IN | 29.13482333 ETH | 0.00090656 | ||||
Deposit | 21244813 | 5 hrs ago | IN | 5.61710743 ETH | 0.00139139 | ||||
Deposit | 21244754 | 5 hrs ago | IN | 10 ETH | 0.00095497 | ||||
Deposit | 21244539 | 6 hrs ago | IN | 1.5 ETH | 0.00112015 | ||||
Deposit | 21244434 | 6 hrs ago | IN | 2 ETH | 0.00131523 | ||||
Deposit | 21244410 | 6 hrs ago | IN | 0.02594905 ETH | 0.0013971 | ||||
Deposit | 21244407 | 6 hrs ago | IN | 0.02 ETH | 0.00146728 | ||||
Deposit | 21244321 | 6 hrs ago | IN | 0.03828407 ETH | 0.00124311 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21246319 | 17 mins ago | 0.01 ETH | ||||
21246162 | 49 mins ago | 5.3 ETH | ||||
21245977 | 1 hr ago | 0.01 ETH | ||||
21245824 | 1 hr ago | 0.26630309 ETH | ||||
21245805 | 2 hrs ago | 0.52 ETH | ||||
21245629 | 2 hrs ago | 0.04439885 ETH | ||||
21245600 | 2 hrs ago | 0.004 ETH | ||||
21245577 | 2 hrs ago | 0.002 ETH | ||||
21245464 | 3 hrs ago | 0.155 ETH | ||||
21245339 | 3 hrs ago | 27.09559515 ETH | ||||
21245327 | 3 hrs ago | 22.043 ETH | ||||
21245326 | 3 hrs ago | 2.99587468 ETH | ||||
21245231 | 3 hrs ago | 16.292 ETH | ||||
21244933 | 4 hrs ago | 94 ETH | ||||
21244921 | 4 hrs ago | 0.05 ETH | ||||
21244870 | 5 hrs ago | 30.00010311 ETH | ||||
21244857 | 5 hrs ago | 29.13482333 ETH | ||||
21244813 | 5 hrs ago | 5.61710743 ETH | ||||
21244754 | 5 hrs ago | 10 ETH | ||||
21244539 | 6 hrs ago | 1.5 ETH | ||||
21244434 | 6 hrs ago | 2 ETH | ||||
21244410 | 6 hrs ago | 0.02594905 ETH | ||||
21244407 | 6 hrs ago | 0.02 ETH | ||||
21244321 | 6 hrs ago | 0.03828407 ETH | ||||
21244314 | 7 hrs ago | 0.42887514 ETH |
Loading...
Loading
Contract Name:
SpokePoolVerifier
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Address.sol"; import "./interfaces/SpokePoolInterface.sol"; /** * @notice SpokePoolVerifier is a contract that verifies that the SpokePool exists on this chain before sending ETH to it. * @dev This contract must be deployed via Create2 to the same address on all chains. That way, an errant transaction sent * to the wrong chain will be blocked by this contract rather than hitting a dead address. This means that this contract * will not work to protect chains, like zkSync, where Create2 address derivations don't match other chains. * Source: https://era.zksync.io/docs/reference/architecture/differences-with-ethereum.html#create-create2 */ contract SpokePoolVerifier { using Address for address; /** * @notice Passthrough function to `depositV3()` on the SpokePool contract. * @dev Protects the caller from losing their ETH (or other native token) by reverting if the SpokePool address * they intended to call does not exist on this chain. Because this contract can be deployed at the same address * everywhere callers should be protected even if the transaction is submitted to an unintended network. * This contract should only be used for native token deposits, as this problem only exists for native tokens. * @param spokePool Address of the SpokePool contract that the user is intending to call. * @param recipient Address to receive funds at on destination chain. * @param originToken Token to lock into this contract to initiate deposit. * @param amount Amount of tokens to deposit. Will be amount of tokens to receive less fees. * @param destinationChainId Denotes network where user will receive funds from SpokePool by a relayer. * @param relayerFeePct % of deposit amount taken out to incentivize a fast relayer. * @param quoteTimestamp Timestamp used by relayers to compute this deposit's realizedLPFeePct which is paid * to LP pool on HubPool. * @param message Arbitrary data that can be used to pass additional information to the recipient along with the tokens. * Note: this is intended to be used to pass along instructions for how a contract should use or allocate the tokens. * @param maxCount used to protect the depositor from frontrunning to guarantee their quote remains valid. * Note: this is intended to be used to pass along instructions for how a contract should use or allocate the tokens. */ function deposit( SpokePoolInterface spokePool, address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp, bytes memory message, uint256 maxCount ) external payable { require(msg.value == amount, "msg.value != amount"); require(address(spokePool).isContract(), "spokePool is not a contract"); // Set msg.sender as the depositor so that msg.sender can speed up the deposit. spokePool.depositFor{ value: msg.value }( msg.sender, recipient, originToken, amount, destinationChainId, relayerFeePct, quoteTimestamp, message, maxCount ); } }
// 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: BUSL-1.1 pragma solidity ^0.8.0; /** * @notice Contains common data structures and functions used by all SpokePool implementations. */ interface SpokePoolInterface { // This leaf is meant to be decoded in the SpokePool to pay out successful relayers. struct RelayerRefundLeaf { // This is the amount to return to the HubPool. This occurs when there is a PoolRebalanceLeaf netSendAmount that // is negative. This is just the negative of this value. uint256 amountToReturn; // Used to verify that this is being executed on the correct destination chainId. uint256 chainId; // This array designates how much each of those addresses should be refunded. uint256[] refundAmounts; // Used as the index in the bitmap to track whether this leaf has been executed or not. uint32 leafId; // The associated L2TokenAddress that these claims apply to. address l2TokenAddress; // Must be same length as refundAmounts and designates each address that must be refunded. address[] refundAddresses; } // Stores collection of merkle roots that can be published to this contract from the HubPool, which are referenced // by "data workers" via inclusion proofs to execute leaves in the roots. struct RootBundle { // Merkle root of slow relays that were not fully filled and whose recipient is still owed funds from the LP pool. bytes32 slowRelayRoot; // Merkle root of relayer refunds for successful relays. bytes32 relayerRefundRoot; // This is a 2D bitmap tracking which leaves in the relayer refund root have been claimed, with max size of // 256x(2^248) leaves per root. mapping(uint256 => uint256) claimedBitmap; } function setCrossDomainAdmin(address newCrossDomainAdmin) external; function setHubPool(address newHubPool) external; function setEnableRoute( address originToken, uint256 destinationChainId, bool enable ) external; function pauseDeposits(bool pause) external; function pauseFills(bool pause) external; function relayRootBundle(bytes32 relayerRefundRoot, bytes32 slowRelayRoot) external; function emergencyDeleteRootBundle(uint256 rootBundleId) external; function deposit( address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp, bytes memory message, uint256 maxCount ) external payable; function depositFor( address depositor, address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp, bytes memory message, uint256 maxCount ) external payable; function executeRelayerRefundLeaf( uint32 rootBundleId, SpokePoolInterface.RelayerRefundLeaf memory relayerRefundLeaf, bytes32[] memory proof ) external payable; function chainId() external view returns (uint256); error NotEOA(); error InvalidDepositorSignature(); error InvalidRelayerFeePct(); error MaxTransferSizeExceeded(); error InvalidCrossDomainAdmin(); error InvalidHubPool(); error DepositsArePaused(); error FillsArePaused(); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "viaIR": true, "debug": { "revertStrings": "strip" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract SpokePoolInterface","name":"spokePool","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"originToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"destinationChainId","type":"uint256"},{"internalType":"int64","name":"relayerFeePct","type":"int64"},{"internalType":"uint32","name":"quoteTimestamp","type":"uint32"},{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608080604052346100165761034b908161001c8239f35b600080fdfe600436101561000d57600080fd5b6000803560e01c63e0db3fcf1461002357600080fd5b610120807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103115773ffffffffffffffffffffffffffffffffffffffff600435818116810361030d576024359282841684036103095760443583811681036103055760a4358060070b81036103015760c4359063ffffffff8216820361029b5760e43567ffffffffffffffff81116102fd57366023820112156102fd57806004013567ffffffffffffffff81116102d0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f84011601166080016080811067ffffffffffffffff8211176102a357908a929160405280608052366024828401011161029f57602091819060240160a0376080010152606435340361029b578585163b1561029b578585163b1561029b57859694929163ffffffff91878a9896946040519a8b997f541f4f14000000000000000000000000000000000000000000000000000000008b523360048c01521660248a01521660448801526064356064880152608435608488015260070b60a48701521660c485015260e484015260805180610124850152845b8181106102805750908391827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6101449389858286010152610104803590850152011681010301923491165af1801561027557610233575080f35b67ffffffffffffffff81116102485760405280f35b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6040513d84823e3d90fd5b60a081015187820161014401528795508694506020016101d6565b8780fd5b8280fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8880fd5b8680fd5b8580fd5b8480fd5b8380fd5b5080fdfea26469706673582212204f81f550f00970671d0755020f959a6599fd76306000e67b424172e1089b949a64736f6c63430008130033
Deployed Bytecode
0x600436101561000d57600080fd5b6000803560e01c63e0db3fcf1461002357600080fd5b610120807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103115773ffffffffffffffffffffffffffffffffffffffff600435818116810361030d576024359282841684036103095760443583811681036103055760a4358060070b81036103015760c4359063ffffffff8216820361029b5760e43567ffffffffffffffff81116102fd57366023820112156102fd57806004013567ffffffffffffffff81116102d0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f84011601166080016080811067ffffffffffffffff8211176102a357908a929160405280608052366024828401011161029f57602091819060240160a0376080010152606435340361029b578585163b1561029b578585163b1561029b57859694929163ffffffff91878a9896946040519a8b997f541f4f14000000000000000000000000000000000000000000000000000000008b523360048c01521660248a01521660448801526064356064880152608435608488015260070b60a48701521660c485015260e484015260805180610124850152845b8181106102805750908391827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6101449389858286010152610104803590850152011681010301923491165af1801561027557610233575080f35b67ffffffffffffffff81116102485760405280f35b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6040513d84823e3d90fd5b60a081015187820161014401528795508694506020016101d6565b8780fd5b8280fd5b60248b7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8880fd5b8680fd5b8580fd5b8480fd5b8380fd5b5080fdfea26469706673582212204f81f550f00970671d0755020f959a6599fd76306000e67b424172e1089b949a64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.