Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 676 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer And Mul... | 525971 | 9 mins ago | IN | 0 ETH | 0.00000967 | ||||
Transfer And Mul... | 525025 | 25 mins ago | IN | 0 ETH | 0.00001231 | ||||
Transfer And Mul... | 524148 | 39 mins ago | IN | 0 ETH | 0.00001634 | ||||
Transfer And Mul... | 524073 | 41 mins ago | IN | 0 ETH | 0.00000589 | ||||
Transfer And Mul... | 523122 | 57 mins ago | IN | 0 ETH | 0.00001059 | ||||
Transfer And Mul... | 522525 | 1 hr ago | IN | 0 ETH | 0.0000054 | ||||
Transfer And Mul... | 522473 | 1 hr ago | IN | 0 ETH | 0.00000589 | ||||
Transfer And Mul... | 521092 | 1 hr ago | IN | 0 ETH | 0.00000613 | ||||
Transfer And Mul... | 520932 | 1 hr ago | IN | 0 ETH | 0.00001146 | ||||
Transfer And Mul... | 520779 | 1 hr ago | IN | 0 ETH | 0.00000589 | ||||
Transfer And Mul... | 519603 | 1 hr ago | IN | 0 ETH | 0.00001052 | ||||
Transfer And Mul... | 519487 | 1 hr ago | IN | 0 ETH | 0.00000993 | ||||
Transfer And Mul... | 519389 | 2 hrs ago | IN | 0 ETH | 0.00001052 | ||||
Transfer And Mul... | 519283 | 2 hrs ago | IN | 0 ETH | 0.00001022 | ||||
Transfer And Mul... | 519210 | 2 hrs ago | IN | 0 ETH | 0.00001125 | ||||
Transfer And Mul... | 518592 | 2 hrs ago | IN | 0 ETH | 0.0000097 | ||||
Transfer And Mul... | 518440 | 2 hrs ago | IN | 0 ETH | 0.00001235 | ||||
Transfer And Mul... | 517239 | 2 hrs ago | IN | 0 ETH | 0.00000717 | ||||
Transfer And Mul... | 516928 | 2 hrs ago | IN | 0 ETH | 0.00000945 | ||||
Transfer And Mul... | 516896 | 2 hrs ago | IN | 0 ETH | 0.00001174 | ||||
Transfer And Mul... | 516895 | 2 hrs ago | IN | 0 ETH | 0.00000946 | ||||
Transfer And Mul... | 516809 | 2 hrs ago | IN | 0 ETH | 0.0000054 | ||||
Transfer And Mul... | 516287 | 2 hrs ago | IN | 0 ETH | 0.00000962 | ||||
Transfer And Mul... | 516219 | 2 hrs ago | IN | 0 ETH | 0.00000896 | ||||
Transfer And Mul... | 516136 | 2 hrs ago | IN | 0 ETH | 0.00000609 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
526515 | 6 secs ago | 0.00005186 ETH | ||||
526515 | 6 secs ago | 0.00005186 ETH | ||||
526515 | 6 secs ago | 0.00005186 ETH | ||||
526479 | 44 secs ago | 0.00000636 ETH | ||||
526479 | 44 secs ago | 0.00000636 ETH | ||||
526479 | 44 secs ago | 0.00000636 ETH | ||||
526477 | 46 secs ago | 0.00020899 ETH | ||||
526477 | 46 secs ago | 0.00020899 ETH | ||||
526477 | 46 secs ago | 0.00020899 ETH | ||||
526460 | 1 min ago | 0.00000625 ETH | ||||
526460 | 1 min ago | 0.00000625 ETH | ||||
526460 | 1 min ago | 0.00000625 ETH | ||||
526455 | 1 min ago | 0.00005964 ETH | ||||
526455 | 1 min ago | 0.00005964 ETH | ||||
526455 | 1 min ago | 0.00005964 ETH | ||||
526434 | 1 min ago | 0.00002123 ETH | ||||
526434 | 1 min ago | 0.00002123 ETH | ||||
526434 | 1 min ago | 0.00002123 ETH | ||||
526428 | 1 min ago | 0.00000299 ETH | ||||
526428 | 1 min ago | 0.00000299 ETH | ||||
526428 | 1 min ago | 0.00000299 ETH | ||||
526424 | 1 min ago | 0.00020251 ETH | ||||
526424 | 1 min ago | 0.00020251 ETH | ||||
526424 | 1 min ago | 0.00020251 ETH | ||||
526420 | 1 min ago | 0.00000048 ETH |
Loading...
Loading
This contract contains unverified libraries: SignatureChecker
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 Source Code Verified (Exact Match)
Contract Name:
ApprovalProxy
Compiler Version
v0.8.24+commit.e11b9ed9
ZkSolc Version
v1.5.3
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {Ownable} from "solady/src/auth/Ownable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC20Router} from "./interfaces/IERC20Router.sol"; contract ApprovalProxy is Ownable { using SafeERC20 for IERC20; error ArrayLengthsMismatch(); error ERC20TransferFromFailed(); error NativeTransferFailed(); event RouterUpdated(address newRouter); address public router; receive() external payable {} constructor(address _owner, address _router) { _initializeOwner(_owner); router = _router; } /// @notice Withdraw function in case funds get stuck in contract function withdraw() external onlyOwner { _send(msg.sender, address(this).balance); } /// @notice Set the router address /// @param _router The address of the router contract function setRouter(address _router) external onlyOwner { router = _router; emit RouterUpdated(_router); } /// @notice Transfer tokens to ERC20Router and perform multicall in a single tx /// @dev This contract must be approved to transfer msg.sender's tokens to the ERC20Router /// @param tokens An array of token addresses to transfer /// @param amounts An array of token amounts to transfer /// @param targets An array of target addresses to pass to the multicall /// @param datas An array of calldata to pass to the multicall /// @param values An array of msg values to pass to the multicall /// @param refundTo The address to refund any leftover ETH to function transferAndMulticall( address[] calldata tokens, uint256[] calldata amounts, address[] calldata targets, bytes[] calldata datas, uint256[] calldata values, address refundTo ) external payable returns (bytes memory) { // Revert if array lengths do not match if ((tokens.length != amounts.length)) { revert ArrayLengthsMismatch(); } // Revert if array lengths do not match (split from above for readability) if (targets.length != datas.length || datas.length != values.length) { revert ArrayLengthsMismatch(); } // Transfer the tokens to the router for (uint256 i = 0; i < tokens.length; i++) { IERC20(tokens[i]).safeTransferFrom(msg.sender, router, amounts[i]); } // Call delegatecallMulticall on the router. The router will perform a // delegatecall to the Multicaller. // @dev msg.sender for the calls to targets will be the router bytes memory data = IERC20Router(router).delegatecallMulticall{value: msg.value}( targets, datas, values, refundTo ); return data; } function _send(address to, uint256 value) internal { bool success; assembly { // Save gas by avoiding copying the return data to memory. // Provide at most 100k gas to the internal call, which is // more than enough to cover common use-cases of logic for // receiving native tokens (eg. SCW payable fallbacks). success := call(100000, to, value, 0, 0, 0, 0) } if (!success) { revert NativeTransferFailed(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; import {ISignatureTransfer} from "permit2-relay/src/interfaces/ISignatureTransfer.sol"; interface IERC20Router { function permitMulticall( address user, ISignatureTransfer.PermitBatchTransferFrom memory permit, address[] calldata targets, bytes[] calldata datas, uint256[] calldata values, address refundTo, bytes memory permitSignature ) external payable returns (bytes memory); function delegatecallMulticall( address[] calldata targets, bytes[] calldata datas, uint256[] calldata values, address refundTo ) external payable returns (bytes memory); function cleanupERC20(address token, address refundTo) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) /// /// @dev Note: /// This implementation does NOT auto-initialize the owner to `msg.sender`. /// You MUST call the `_initializeOwner` in the constructor / initializer. /// /// While the ownable portion follows /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility, /// the nomenclature for the 2-step ownership handover may be unique to this codebase. abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /// @dev Cannot double-initialize. error AlreadyInitialized(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. bytes32 internal constant _OWNER_SLOT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Override to return true to make `_initializeOwner` prevent double-initialization. function _guardInitializeOwner() internal pure virtual returns (bool guard) {} /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT if sload(ownerSlot) { mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`. revert(0x1c, 0x04) } // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } else { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(_OWNER_SLOT, newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { if (_guardInitializeOwner()) { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner)))) } } else { /// @solidity memory-safe-assembly assembly { let ownerSlot := _OWNER_SLOT // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(_OWNER_SLOT))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(_OWNER_SLOT) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IEIP712} from "./IEIP712.sol"; /// @title SignatureTransfer /// @notice Handles ERC20 token transfers through signature based actions /// @dev Requires user's token approval on the Permit2 contract interface ISignatureTransfer is IEIP712 { /// @notice Thrown when the requested amount for a transfer is larger than the permissioned amount /// @param maxAmount The maximum amount a spender can request to transfer error InvalidAmount(uint256 maxAmount); /// @notice Thrown when the number of tokens permissioned to a spender does not match the number of tokens being transferred /// @dev If the spender does not need to transfer the number of tokens permitted, the spender can request amount 0 to be transferred error LengthMismatch(); /// @notice Emits an event when the owner successfully invalidates an unordered nonce. event UnorderedNonceInvalidation(address indexed owner, uint256 word, uint256 mask); /// @notice The token and amount details for a transfer signed in the permit transfer signature struct TokenPermissions { // ERC20 token address address token; // the maximum amount that can be spent uint256 amount; } /// @notice The signed permit message for a single token transfer struct PermitTransferFrom { TokenPermissions permitted; // a unique value for every token owner's signature to prevent signature replays uint256 nonce; // deadline on the permit signature uint256 deadline; } /// @notice Specifies the recipient address and amount for batched transfers. /// @dev Recipients and amounts correspond to the index of the signed token permissions array. /// @dev Reverts if the requested amount is greater than the permitted signed amount. struct SignatureTransferDetails { // recipient address address to; // spender requested amount uint256 requestedAmount; } /// @notice Used to reconstruct the signed permit message for multiple token transfers /// @dev Do not need to pass in spender address as it is required that it is msg.sender /// @dev Note that a user still signs over a spender address struct PermitBatchTransferFrom { // the tokens and corresponding amounts permitted for a transfer TokenPermissions[] permitted; // a unique value for every token owner's signature to prevent signature replays uint256 nonce; // deadline on the permit signature uint256 deadline; } /// @notice A map from token owner address and a caller specified word index to a bitmap. Used to set bits in the bitmap to prevent against signature replay protection /// @dev Uses unordered nonces so that permit messages do not need to be spent in a certain order /// @dev The mapping is indexed first by the token owner, then by an index specified in the nonce /// @dev It returns a uint256 bitmap /// @dev The index, or wordPosition is capped at type(uint248).max function nonceBitmap(address, uint256) external view returns (uint256); /// @notice Transfers a token using a signed permit message /// @dev Reverts if the requested amount is greater than the permitted signed amount /// @param permit The permit data signed over by the owner /// @param owner The owner of the tokens to transfer /// @param transferDetails The spender's requested transfer details for the permitted token /// @param signature The signature to verify function permitTransferFrom( PermitTransferFrom memory permit, SignatureTransferDetails calldata transferDetails, address owner, bytes calldata signature ) external; /// @notice Transfers a token using a signed permit message /// @notice Includes extra data provided by the caller to verify signature over /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition /// @dev Reverts if the requested amount is greater than the permitted signed amount /// @param permit The permit data signed over by the owner /// @param owner The owner of the tokens to transfer /// @param transferDetails The spender's requested transfer details for the permitted token /// @param witness Extra data to include when checking the user signature /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash /// @param signature The signature to verify function permitWitnessTransferFrom( PermitTransferFrom memory permit, SignatureTransferDetails calldata transferDetails, address owner, bytes32 witness, string calldata witnessTypeString, bytes calldata signature ) external; /// @notice Transfers multiple tokens using a signed permit message /// @param permit The permit data signed over by the owner /// @param owner The owner of the tokens to transfer /// @param transferDetails Specifies the recipient and requested amount for the token transfer /// @param signature The signature to verify function permitTransferFrom( PermitBatchTransferFrom memory permit, SignatureTransferDetails[] calldata transferDetails, address owner, bytes calldata signature ) external; /// @notice Transfers multiple tokens using a signed permit message /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition /// @notice Includes extra data provided by the caller to verify signature over /// @param permit The permit data signed over by the owner /// @param owner The owner of the tokens to transfer /// @param transferDetails Specifies the recipient and requested amount for the token transfer /// @param witness Extra data to include when checking the user signature /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash /// @param signature The signature to verify function permitWitnessTransferFrom( PermitBatchTransferFrom memory permit, SignatureTransferDetails[] calldata transferDetails, address owner, bytes32 witness, string calldata witnessTypeString, bytes calldata signature ) external; /// @notice Invalidates the bits specified in mask for the bitmap at the word position /// @dev The wordPos is maxed at type(uint248).max /// @param wordPos A number to index the nonceBitmap at /// @param mask A bitmap masked against msg.sender's current bitmap at the word position function invalidateUnorderedNonces(uint256 wordPos, uint256 mask) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC1363} from "../../../interfaces/IERC1363.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IEIP712 { function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Address.sol) pragma solidity ^0.8.20; import {Errors} from "./Errors.sol"; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) 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 assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; import {IERC20} from "./IERC20.sol"; import {IERC165} from "./IERC165.sol"; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/Errors.sol) pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; import {IERC165} from "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "viaIR": true, "evmVersion": "cancun", "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": true, "libraries": { "contracts/usdc/util/SignatureChecker.sol": { "SignatureChecker": "0xbBB5d95A805b48E24f369127ECcDDF81e87f1A0F" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"ArrayLengthsMismatch","type":"error"},{"inputs":[],"name":"ERC20TransferFromFailed","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouter","type":"address"}],"name":"RouterUpdated","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"datas","type":"bytes[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"address","name":"refundTo","type":"address"}],"name":"transferAndMulticall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
3cda335100000000000000000000000000000000000000000000000000000000000000010100013b7ff253f6f08fd1c4c310b5cadfc4774cf7813cd809b2a50265818b8000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e0000000000000000000000007df4e182da01eba2ff902b3f13b7a7b12bb87dea
Deployed Bytecode
0x0004000000000002000d00000000000200000000030100190000006004300270000001000340019700030000003103550002000000010355000001000040019d0000000100200190000000480000c13d0000008002000039000000400020043f000000040030008c000000870000413d000000000201043b000000e002200270000001090020009c0000008b0000a13d0000010a0020009c000000a80000213d0000010e0020009c000001fb0000613d0000010f0020009c000001be0000613d000001100020009c0000020a0000c13d000000240030008c0000020a0000413d0000000401100370000000000301043b000001030030009c0000020a0000213d0000010401000041000000000101041a0000000002000411000000000012004b000002170000c13d00000117010000410000000c0010043f000000000030043f0000000001000414000001000010009c0000010001008041000000c0011002100000011b011001c70000801002000039000d00000003001d03fd03f80000040f00000001002001900000020a0000613d000000000101043b000b00000001001d000000000101041a000c00000001001d0000011c0100004100000000001004430000000001000414000001000010009c0000010001008041000000c0011002100000011d011001c70000800b0200003903fd03f80000040f0000000100200190000002b00000613d000000000101043b0000000c0010006c0000022c0000a13d0000011e01000041000000000010043f0000011a01000041000003ff000104300000000002000416000000000002004b0000020a0000c13d0000001f0230003900000101022001970000008002200039000000400020043f0000001f0430018f00000102053001980000008002500039000000590000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000550000c13d000000000004004b000000660000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c0000020a0000413d000000800600043d000001030060009c0000020a0000213d000000a00200043d000001030020009c0000020a0000213d0000010401000041000000000061041b0000000001000414000001000010009c0000010001008041000000c00110021000000105011001c7000d00000002001d0000800d0200003900000003030000390000010604000041000000000500001903fd03f30000040f00000001002001900000000d020000290000020a0000613d000000000100041a0000010701100197000000000121019f000000000010041b0000002001000039000001000010044300000120000004430000010801000041000003fe0001042e000000000003004b0000020a0000c13d0000000001000019000003fe0001042e000001110020009c000000bf0000a13d000001120020009c000001df0000613d000001130020009c000001090000613d000001140020009c0000020a0000c13d0000010401000041000000000501041a0000000001000411000000000051004b000002170000c13d0000000001000414000001000010009c0000010001008041000000c00110021000000105011001c70000800d0200003900000003030000390000010604000041000000000600001903fd03f30000040f00000001002001900000020a0000613d0000010401000041000000000001041b0000000001000019000003fe0001042e0000010b0020009c000002040000613d0000010c0020009c000001da0000613d0000010d0020009c0000020a0000c13d000000240030008c0000020a0000413d0000000002000416000000000002004b0000020a0000c13d0000000401100370000000000101043b000001030010009c0000020a0000213d00000117020000410000000c0020043f000000000010043f03fd03e60000040f000000000101041a000000800010043f0000011801000041000003fe0001042e000001150020009c000000e20000613d000001160020009c0000020a0000c13d0000000001000416000000000001004b0000020a0000c13d0000010401000041000000000201041a0000000001000411000000000021004b000002170000c13d000d00000002001d00000131010000410000000000100443000000000100041000000004001004430000000001000414000001000010009c0000010001008041000000c00110021000000125011001c70000800a0200003903fd03f80000040f0000000100200190000002b00000613d000000000301043b0000000d04000029000000040040008c000000890000613d000000000003004b0000021b0000c13d000001330100004100000000020400190000021e0000013d00000117010000410000000c0010043f0000000001000411000000000010043f0000011c0100004100000000001004430000000001000414000001000010009c0000010001008041000000c0011002100000011d011001c70000800b0200003903fd03f80000040f0000000100200190000002b00000613d000000000101043b000d00000001001d0000000001000414000001000010009c0000010001008041000000c0011002100000011b011001c7000080100200003903fd03f80000040f00000001002001900000020a0000613d000000000101043b0000000d02000029000001360220009a000000000021041b0000000001000414000001000010009c0000010001008041000000c00110021000000105011001c70000800d0200003900000002030000390000013704000041000001f60000013d000000c40030008c0000020a0000413d0000000402100370000000000202043b000001210020009c0000020a0000213d0000002304200039000000000034004b0000020a0000813d0000000404200039000000000441034f000000000804043b000001210080009c0000020a0000213d000a00240020003d00000005028002100000000a02200029000000000032004b0000020a0000213d0000002402100370000000000402043b000001210040009c0000020a0000213d0000002302400039000000000032004b0000020a0000813d0000000402400039000000000221034f000000000202043b000001210020009c0000020a0000213d000900240040003d00000005042002100000000904400029000000000034004b0000020a0000213d0000004404100370000000000404043b000001210040009c0000020a0000213d0000002305400039000000000035004b0000020a0000813d0000000405400039000000000551034f000000000505043b000d00000005001d000001210050009c0000020a0000213d00000024094000390000000d0400002900040005004002180000000404900029000000000034004b0000020a0000213d0000006404100370000000000404043b000500000004001d000001210040009c0000020a0000213d00000005040000290000002304400039000000000034004b0000020a0000813d00000005040000290000000404400039000000000441034f000000000404043b000001210040009c0000020a0000213d0000000505000029000600240050003d00000005054002100000000605500029000000000035004b0000020a0000213d0000008405100370000000000605043b000001210060009c0000020a0000213d0000002305600039000000000035004b0000020a0000813d000300040060003d0000000305100360000000000505043b000001210050009c0000020a0000213d000000050750021000000000067600190000002406600039000000000036004b0000020a0000213d000000a401100370000000000101043b000200000001001d000001030010009c0000020a0000213d000100000009001d000700000008001d000000000028004b000002320000c13d0000000d0040006b000002320000c13d000000000054004b000002320000c13d000000070000006b000800800000003d000002360000c13d000000000100041a000900000001001d00000128010000410000000803000029000000000013043500000084013000390000000d02000029000000000021043500000004043000390000008001000039000a00000004001d0000000000140435000000a403300039000000000002004b000001910000613d000000020400036700000000010000190000000105000029000000000254034f000000000202043b000001030020009c0000020a0000213d0000000003230436000000200550003900000001011000390000000d0010006c000001880000413d0000000a0130006a0000000802000029000000240220003900000000001204350000000d0200002900000000002304350000000401300029000000200c100039000000000002004b000002b10000c13d0000000a01c0006a0000000802000029000000440220003900000000001204350000000d0100002900000000021c04360000012a0010009c0000020a0000213d00000004030000290000001f0130018f000000000003004b000001b00000613d00000004032000290000000304000029000000200440003900000002044003670000000005020019000000004604043c0000000005650436000000000035004b000001ac0000c13d00000009030000290000010304300197000000000001004b000000020100002900000103011001970000000803000029000000640330003900000000001304350000000001000414000000040040008c0000030e0000c13d00000003010003670000000103000031000003390000013d000000240030008c0000020a0000413d0000000002000416000000000002004b0000020a0000c13d0000000401100370000000000101043b000001030010009c0000020a0000213d0000010402000041000000000202041a0000000003000411000000000023004b000002170000c13d000000000200041a0000010702200197000000000212019f000000000020041b000000800010043f0000000001000414000001000010009c0000010001008041000000c0011002100000011f011001c70000800d0200003900000001030000390000012004000041000001f70000013d0000000001000416000000000001004b0000020a0000c13d000000000100041a000002000000013d00000117010000410000000c0010043f0000000001000411000000000010043f0000000001000414000001000010009c0000010001008041000000c0011002100000011b011001c7000080100200003903fd03f80000040f00000001002001900000020a0000613d000000000101043b000000000001041b0000000001000414000001000010009c0000010001008041000000c00110021000000105011001c70000800d0200003900000002030000390000012f04000041000000000500041103fd03f30000040f0000000100200190000000890000c13d0000020a0000013d0000000001000416000000000001004b0000020a0000c13d0000010401000041000000000101041a0000010301100197000000800010043f0000011801000041000003fe0001042e000000240030008c0000020a0000413d0000000401100370000000000101043b000001030010009c0000020c0000a13d0000000001000019000003ff000104300000010402000041000000000202041a0000000003000411000000000023004b000002170000c13d000000000001004b0000022f0000c13d0000011901000041000000000010043f0000011a01000041000003ff000104300000013001000041000000000010043f0000011a01000041000003ff0001043000008009020000390000013201000041000000000500001903fd03f30000040f00030000000103550000006001100270000101000010019d0000000100200190000000890000c13d000000400100043d00000134020000410000000000210435000001000010009c0000010001008041000000400110021000000135011001c7000003ff000104300000000b01000029000000000001041b0000000d0100002903fd03cf0000040f0000000001000019000003fe0001042e0000012d01000041000000800010043f0000012e01000041000003ff000104300000000001000411000801030010019b0000000006000019000000070500002900000005016002100000000a031000290000000204000367000000000334034f000000000203043b000001030020009c0000020a0000213d0000000901100029000000000114034f000000000101043b000000400700043d0000006403700039000000000400041a000000000013043500000103014001970000004403700039000000000013043500000020017000390000012203000041000000000031043500000024037000390000000804000029000000000043043500000064030000390000000000370435000001230070009c0000037d0000813d000000a003700039000000400030043f00000000030704330000000004000414000000040020008c0000025f0000c13d0000000001010433000000000010043f00000001030000310000028f0000013d000c00000006001d000001000010009c00000100010080410000004001100210000001000030009c00000100030080410000006003300210000000000113019f000001000040009c0000010004008041000000c003400210000000000131019f000b00000002001d03fd03f30000040f000000000301001900000060033002700000010003300197000000200030008c0000002005000039000000000503401900000020045001900000027b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002770000c13d0000001f05500190000002880000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000000705000029000003220000613d0000000c060000290000000b02000029000000000003004b000002960000613d000000000100043d000000010010008c00000000010000390000000101006039000002a80000013d000c00000006001d00000124010000410000000000100443000b00000002001d00000004002004430000000001000414000001000010009c0000010001008041000000c00110021000000125011001c7000080020200003903fd03f80000040f0000000100200190000002b00000613d000000000101043b00000007050000290000000c060000290000000b02000029000000000001004b000003040000613d0000000106600039000000000056004b0000023a0000413d000000400100043d000800000001001d000001760000013d000000000001042f0000000501000029000b00000000003500000000011000790000000205000367000000430110008a000c00000001001d00000129071001970000000009000019000000000a030019000000060b000029000002c50000013d0000001f01d00039000001380110019700000000024d00190000000000020435000000000c410019000000200bb0003900000001099000390000000d0090006c0000019b0000813d00000000013c0049000000200110008a000000200aa0003900000000001a04350000000001b5034f000000000101043b0000012902100197000000000472013f000000000072004b000000000200001900000129020020410000000c0010006c000000000d000019000001290d004041000001290040009c00000000020dc019000000000002004b0000020a0000613d0000000601100029000000000215034f000000000d02043b0000012100d0009c0000020a0000213d00000020011000390000000b02d00069000000000021004b000000000400001900000129040020410000012902200197000001290e100197000000000f2e013f00000000002e004b000000000200001900000129020040410000012900f0009c000000000204c019000000000002004b0000020a0000c13d000000000215034f0000000004dc04360000013801d00198000000000e140019000002f60000613d000000000f02034f000000000c04001900000000f60f043c000000000c6c04360000000000ec004b000002f20000c13d0000001f0cd00190000002bc0000613d000000000112034f0000000302c0021000000000060e043300000000062601cf000000000626022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000161019f00000000001e0435000002bc0000013d000000400100043d0000012603000041000000000031043500000004031000390000000000230435000001000010009c0000010001008041000000400110021000000127011001c7000003ff000104300000000003000416000000080600002900000004056000690000000002250019000001000020009c00000100020080410000006002200210000001000060009c000001000500004100000000050640190000004005500210000000000252019f000001000010009c0000010001008041000000c001100210000000000121019f000000000003004b0000032e0000c13d0000000002040019000003310000013d0000001f0530018f0000010206300198000000400200043d00000000046200190000038e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003290000c13d0000038e0000013d00000105011001c70000800902000039000000000500001903fd03f30000040f000300000001035500000000030100190000006003300270000101000030019d00000100033001970000000100200190000003830000613d00000138053001980000001f0630018f0000000804500029000003430000613d000000000701034f0000000808000029000000007907043c0000000008980436000000000048004b0000033f0000c13d000000000006004b000003500000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f0130003900000138041001970000000801400029000000000041004b00000000040000390000000104004039000001210010009c0000037d0000213d00000001004001900000037d0000c13d000000400010043f0000012b0030009c0000020a0000213d000000200030008c0000020a0000413d00000008040000290000000004040433000001210040009c0000020a0000213d000000080630002900000008034000290000001f04300039000000000064004b0000000005000019000001290500804100000129044001970000012907600197000000000874013f000000000074004b00000000040000190000012904004041000001290080009c000000000405c019000000000004004b0000020a0000c13d0000000054030434000001210040009c0000037d0000213d0000001f0340003900000138033001970000003f0330003900000138033001970000000003130019000001210030009c000003a10000a13d0000012c01000041000000000010043f0000004101000039000000040010043f0000012701000041000003ff000104300000001f0530018f0000010206300198000000400200043d00000000046200190000038e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000038a0000c13d000000000005004b0000039b0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001000020009c00000100020080410000004002200210000000000112019f000003ff00010430000000400030043f00000000034104360000000007540019000000000067004b0000020a0000213d000000000004004b000003b00000613d000000000600001900000000073600190000000008560019000000000808043300000000008704350000002006600039000000000046004b000003a90000413d000000000434001900000000000404350000002005000039000000400400043d0000000005540436000000000101043300000000001504350000004005400039000000000001004b000003c20000613d000000000600001900000000075600190000000008360019000000000808043300000000008704350000002006600039000000000016004b000003bb0000413d0000001f031000390000013802300197000000000151001900000000000104350000004001200039000001000010009c00000100010080410000006001100210000001000040009c00000100040080410000004002400210000000000121019f000003fe0001042e00010000000000020000010402000041000000000502041a00000000020004140000010306100197000001000020009c0000010002008041000000c00120021000000105011001c70000800d0200003900000003030000390000010604000041000100000006001d03fd03f30000040f0000000100200190000003e30000613d00000104010000410000000102000029000000000021041b000000000001042d0000000001000019000003ff00010430000000000001042f0000000001000414000001000010009c0000010001008041000000c0011002100000011b011001c7000080100200003903fd03f80000040f0000000100200190000003f10000613d000000000101043b000000000001042d0000000001000019000003ff00010430000003f6002104210000000102000039000000000001042d0000000002000019000000000001042d000003fb002104230000000102000039000000000001042d0000000002000019000000000001042d000003fd00000432000003fe0001042e000003ff0001043000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f887ea4000000000000000000000000000000000000000000000000000000000fee81cf4000000000000000000000000000000000000000000000000000000008da5cb5b00000000000000000000000000000000000000000000000000000000c0d7865500000000000000000000000000000000000000000000000000000000f04e283e0000000000000000000000000000000000000000000000000000000054d1f13c0000000000000000000000000000000000000000000000000000000054d1f13d000000000000000000000000000000000000000000000000000000005caab55a00000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000003ccfd60b00000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e881802000000000000000000000000000000000000200000008000000000000000007aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc80000000000000000000000000000000000000000000000000ffffffffffffffff23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff601806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000005274afe70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000006e305f8000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e487b71000000000000000000000000000000000000000000000000000000003b800a46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c920000000000000000000000000000000000000000000000000000000082b429009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3902000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000f4b3b1bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000001bb2998db1c6bfba3b0f3e937a4bc413feb1580ff392b2e0c4945af036904a18
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e0000000000000000000000007df4e182da01eba2ff902b3f13b7a7b12bb87dea
-----Decoded View---------------
Arg [0] : _owner (address): 0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e
Arg [1] : _router (address): 0x7dF4E182Da01EbA2FF902b3F13b7a7b12bB87dEa
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e
Arg [1] : 0000000000000000000000007df4e182da01eba2ff902b3f13b7a7b12bb87dea
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.