Source Code
Latest 25 from a total of 1,032,934 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer And Mul... | 23557641 | 80 days ago | IN | 0.00000272 ETH | 0.00001311 | ||||
| Transfer And Mul... | 23557641 | 80 days ago | IN | 0.00000305 ETH | 0.00000848 | ||||
| Transfer And Mul... | 13524673 | 203 days ago | IN | 0.00001346 ETH | 0.00000735 | ||||
| Transfer And Mul... | 13470982 | 203 days ago | IN | 0.00001191 ETH | 0.00000846 | ||||
| Transfer And Mul... | 13460110 | 204 days ago | IN | 0.00000331 ETH | 0.00000874 | ||||
| Transfer And Mul... | 13456908 | 204 days ago | IN | 0.0000121 ETH | 0.00000715 | ||||
| Transfer And Mul... | 13456894 | 204 days ago | IN | 0.0000121 ETH | 0.00000916 | ||||
| Transfer And Mul... | 13456424 | 204 days ago | IN | 0.00002363 ETH | 0.00001347 | ||||
| Transfer And Mul... | 13456406 | 204 days ago | IN | 0.00002095 ETH | 0.00001122 | ||||
| Transfer And Mul... | 13456393 | 204 days ago | IN | 0.00001015 ETH | 0.00001934 | ||||
| Transfer And Mul... | 13456386 | 204 days ago | IN | 0 ETH | 0.00000912 | ||||
| Transfer And Mul... | 13456386 | 204 days ago | IN | 0.00000294 ETH | 0.00001289 | ||||
| Transfer And Mul... | 13456383 | 204 days ago | IN | 0.00000658 ETH | 0.0000116 | ||||
| Transfer And Mul... | 13456383 | 204 days ago | IN | 0.00001247 ETH | 0.00007053 | ||||
| Transfer And Mul... | 13456381 | 204 days ago | IN | 0.00000659 ETH | 0.0000272 | ||||
| Transfer And Mul... | 13456346 | 204 days ago | IN | 0.00000004 ETH | 0.00000922 | ||||
| Transfer And Mul... | 13456337 | 204 days ago | IN | 0.00000028 ETH | 0.0000095 | ||||
| Transfer And Mul... | 13456320 | 204 days ago | IN | 0 ETH | 0.00000984 | ||||
| Transfer And Mul... | 13456313 | 204 days ago | IN | 0.00009382 ETH | 0.00001119 | ||||
| Transfer And Mul... | 13456311 | 204 days ago | IN | 0.00124463 ETH | 0.00001259 | ||||
| Transfer And Mul... | 13456306 | 204 days ago | IN | 0.00000988 ETH | 0.00000919 | ||||
| Transfer And Mul... | 13456298 | 204 days ago | IN | 0.00021473 ETH | 0.00001189 | ||||
| Transfer And Mul... | 13456288 | 204 days ago | IN | 0.00001912 ETH | 0.00006404 | ||||
| Transfer And Mul... | 13456286 | 204 days ago | IN | 0.00000353 ETH | 0.00001123 | ||||
| Transfer And Mul... | 13456286 | 204 days ago | IN | 0.00001938 ETH | 0.00001194 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 23557641 | 80 days ago | 0.00000272 ETH | ||||
| 23557641 | 80 days ago | 0.00000272 ETH | ||||
| 23557641 | 80 days ago | 0.00000305 ETH | ||||
| 23557641 | 80 days ago | 0.00000305 ETH | ||||
| 13524673 | 203 days ago | 0.00001346 ETH | ||||
| 13524673 | 203 days ago | 0.00001346 ETH | ||||
| 13470982 | 203 days ago | 0.00001191 ETH | ||||
| 13470982 | 203 days ago | 0.00001191 ETH | ||||
| 13460110 | 204 days ago | 0.00000331 ETH | ||||
| 13460110 | 204 days ago | 0.00000331 ETH | ||||
| 13456908 | 204 days ago | 0.0000121 ETH | ||||
| 13456908 | 204 days ago | 0.0000121 ETH | ||||
| 13456894 | 204 days ago | 0.0000121 ETH | ||||
| 13456894 | 204 days ago | 0.0000121 ETH | ||||
| 13456424 | 204 days ago | 0.00002363 ETH | ||||
| 13456424 | 204 days ago | 0.00002363 ETH | ||||
| 13456406 | 204 days ago | 0.00002095 ETH | ||||
| 13456406 | 204 days ago | 0.00002095 ETH | ||||
| 13456400 | 204 days ago | 0.00000531 ETH | ||||
| 13456400 | 204 days ago | 0.00000531 ETH | ||||
| 13456393 | 204 days ago | 0.00001015 ETH | ||||
| 13456393 | 204 days ago | 0.00001015 ETH | ||||
| 13456386 | 204 days ago | 0.00000294 ETH | ||||
| 13456386 | 204 days ago | 0.00000294 ETH | ||||
| 13456383 | 204 days ago | 0.00000658 ETH |
Cross-Chain Transactions
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 Name:
ApprovalProxy
Compiler Version
v0.8.25+commit.b61c2a91
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.
// @dev The router does not perform a delegatecall. It is called
// `delegatecallMulticall` to not break integrations with the
// previous router. Note that 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
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/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
// 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/IERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../utils/introspection/IERC165.sol";// 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.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
Contract ABI
API[{"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
3cda335100000000000000000000000000000000000000000000000000000000000000010100015dfac044ab182646e9b40429e6aafa3553927d6d8ba023f310ea0e1f0e00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e0000000000000000000000000649f2daa72a6524f0eb7f5f65e13cffc8082b10
Deployed Bytecode
0x0004000000000002000d00000000000200000000030100190000006004300270000001220340019700030000003103550002000000010355000001220040019d0000000100200190000000480000c13d0000008002000039000000400020043f000000040030008c000000870000413d000000000201043b000000e0022002700000012b0020009c0000008b0000a13d0000012c0020009c000000a80000213d000001300020009c000001fb0000613d000001310020009c000001be0000613d000001320020009c0000020a0000c13d000000240030008c0000020a0000413d0000000401100370000000000301043b000001250030009c0000020a0000213d0000012601000041000000000101041a0000000002000411000000000012004b000002170000c13d00000139010000410000000c0010043f000000000030043f0000000001000414000001220010009c0000012201008041000000c0011002100000013d011001c70000801002000039000d00000003001d0482047d0000040f00000001002001900000020a0000613d000000000101043b000b00000001001d000000000101041a000c00000001001d0000013e0100004100000000001004430000000001000414000001220010009c0000012201008041000000c0011002100000013f011001c70000800b020000390482047d0000040f0000000100200190000002b00000613d000000000101043b0000000c0010006c0000022c0000a13d0000014001000041000000000010043f0000013c0100004100000484000104300000000002000416000000000002004b0000020a0000c13d0000001f0230003900000123022001970000008002200039000000400020043f0000001f0430018f00000124053001980000008002500039000000590000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000026004b000000550000c13d000000000004004b000000660000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000400030008c0000020a0000413d000000800600043d000001250060009c0000020a0000213d000000a00200043d000001250020009c0000020a0000213d0000012601000041000000000061041b0000000001000414000001220010009c0000012201008041000000c00110021000000127011001c7000d00000002001d0000800d02000039000000030300003900000128040000410000000005000019048204780000040f00000001002001900000000d020000290000020a0000613d000000000100041a0000012901100197000000000121019f000000000010041b0000002001000039000001000010044300000120000004430000012a01000041000004830001042e000000000003004b0000020a0000c13d0000000001000019000004830001042e000001330020009c000000bf0000a13d000001340020009c000001df0000613d000001350020009c000001090000613d000001360020009c0000020a0000c13d0000012601000041000000000501041a0000000001000411000000000051004b000002170000c13d0000000001000414000001220010009c0000012201008041000000c00110021000000127011001c70000800d02000039000000030300003900000128040000410000000006000019048204780000040f00000001002001900000020a0000613d0000012601000041000000000001041b0000000001000019000004830001042e0000012d0020009c000002040000613d0000012e0020009c000001da0000613d0000012f0020009c0000020a0000c13d000000240030008c0000020a0000413d0000000002000416000000000002004b0000020a0000c13d0000000401100370000000000101043b000001250010009c0000020a0000213d00000139020000410000000c0020043f000000000010043f0482046b0000040f000000000101041a000000800010043f0000013a01000041000004830001042e000001370020009c000000e20000613d000001380020009c0000020a0000c13d0000000001000416000000000001004b0000020a0000c13d0000012601000041000000000201041a0000000001000411000000000021004b000002170000c13d000d00000002001d00000154010000410000000000100443000000000100041000000004001004430000000001000414000001220010009c0000012201008041000000c00110021000000147011001c70000800a020000390482047d0000040f0000000100200190000002b00000613d000000000301043b0000000d04000029000000040040008c000000890000613d000000000003004b0000021b0000c13d000001560100004100000000020400190000021e0000013d00000139010000410000000c0010043f0000000001000411000000000010043f0000013e0100004100000000001004430000000001000414000001220010009c0000012201008041000000c0011002100000013f011001c70000800b020000390482047d0000040f0000000100200190000002b00000613d000000000101043b000d00000001001d0000000001000414000001220010009c0000012201008041000000c0011002100000013d011001c700008010020000390482047d0000040f00000001002001900000020a0000613d000000000101043b0000000d02000029000001590220009a000000000021041b0000000001000414000001220010009c0000012201008041000000c00110021000000127011001c70000800d0200003900000002030000390000015a04000041000001f60000013d000000c40030008c0000020a0000413d0000000402100370000000000202043b000001430020009c0000020a0000213d0000002304200039000000000034004b0000020a0000813d0000000404200039000000000441034f000000000804043b000001430080009c0000020a0000213d000a00240020003d00000005028002100000000a02200029000000000032004b0000020a0000213d0000002402100370000000000402043b000001430040009c0000020a0000213d0000002302400039000000000032004b0000020a0000813d0000000402400039000000000221034f000000000202043b000001430020009c0000020a0000213d000900240040003d00000005042002100000000904400029000000000034004b0000020a0000213d0000004404100370000000000404043b000001430040009c0000020a0000213d0000002305400039000000000035004b0000020a0000813d0000000405400039000000000551034f000000000505043b000d00000005001d000001430050009c0000020a0000213d00000024094000390000000d0400002900040005004002180000000404900029000000000034004b0000020a0000213d0000006404100370000000000404043b000500000004001d000001430040009c0000020a0000213d00000005040000290000002304400039000000000034004b0000020a0000813d00000005040000290000000404400039000000000441034f000000000404043b000001430040009c0000020a0000213d0000000505000029000600240050003d00000005054002100000000605500029000000000035004b0000020a0000213d0000008405100370000000000605043b000001430060009c0000020a0000213d0000002305600039000000000035004b0000020a0000813d000300040060003d0000000305100360000000000505043b000001430050009c0000020a0000213d000000050750021000000000067600190000002406600039000000000036004b0000020a0000213d000000a401100370000000000101043b000200000001001d000001250010009c0000020a0000213d000100000009001d000700000008001d000000000028004b000002320000c13d0000000d0040006b000002320000c13d000000000054004b000002320000c13d000000070000006b000800800000003d000002360000c13d000000000100041a000900000001001d0000014a010000410000000803000029000000000013043500000084013000390000000d02000029000000000021043500000004043000390000008001000039000a00000004001d0000000000140435000000a403300039000000000002004b000001910000613d000000020400036700000000010000190000000105000029000000000254034f000000000202043b000001250020009c0000020a0000213d0000000003230436000000200550003900000001011000390000000d0010006c000001880000413d0000000a0130006a0000000802000029000000240220003900000000001204350000000d0200002900000000002304350000000401300029000000200c100039000000000002004b000002b10000c13d0000000a01c0006a0000000802000029000000440220003900000000001204350000000d0100002900000000021c04360000014c0010009c0000020a0000213d00000004030000290000001f0130018f000000000003004b000001b00000613d00000004032000290000000304000029000000200440003900000002044003670000000005020019000000004604043c0000000005650436000000000035004b000001ac0000c13d00000009030000290000012504300197000000000001004b000000020100002900000125011001970000000803000029000000640330003900000000001304350000000001000414000000040040008c0000030e0000c13d00000003010003670000000103000031000003390000013d000000240030008c0000020a0000413d0000000002000416000000000002004b0000020a0000c13d0000000401100370000000000101043b000001250010009c0000020a0000213d0000012602000041000000000202041a0000000003000411000000000023004b000002170000c13d000000000200041a0000012902200197000000000212019f000000000020041b000000800010043f0000000001000414000001220010009c0000012201008041000000c00110021000000141011001c70000800d0200003900000001030000390000014204000041000001f70000013d0000000001000416000000000001004b0000020a0000c13d000000000100041a000002000000013d00000139010000410000000c0010043f0000000001000411000000000010043f0000000001000414000001220010009c0000012201008041000000c0011002100000013d011001c700008010020000390482047d0000040f00000001002001900000020a0000613d000000000101043b000000000001041b0000000001000414000001220010009c0000012201008041000000c00110021000000127011001c70000800d02000039000000020300003900000152040000410000000005000411048204780000040f0000000100200190000000890000c13d0000020a0000013d0000000001000416000000000001004b0000020a0000c13d0000012601000041000000000101041a0000012501100197000000800010043f0000013a01000041000004830001042e000000240030008c0000020a0000413d0000000401100370000000000101043b000001250010009c0000020c0000a13d000000000100001900000484000104300000012602000041000000000202041a0000000003000411000000000023004b000002170000c13d000000000001004b0000022f0000c13d0000013b01000041000000000010043f0000013c0100004100000484000104300000015301000041000000000010043f0000013c010000410000048400010430000080090200003900000155010000410000000005000019048204780000040f00030000000103550000006001100270000101220010019d0000000100200190000000890000c13d000000400100043d00000157020000410000000000210435000001220010009c0000012201008041000000400110021000000158011001c700000484000104300000000b01000029000000000001041b0000000d01000029048204540000040f0000000001000019000004830001042e0000015001000041000000800010043f000001510100004100000484000104300000000001000411000801250010019b0000000006000019000000070500002900000005016002100000000a031000290000000204000367000000000334034f000000000203043b000001250020009c0000020a0000213d0000000901100029000000000114034f000000000101043b000000400700043d0000006403700039000000000400041a000000000013043500000125014001970000004403700039000000000013043500000020017000390000014403000041000000000031043500000024037000390000000804000029000000000043043500000064030000390000000000370435000001450070009c0000037f0000813d000000a003700039000000400030043f00000000030704330000000004000414000000040020008c0000025f0000c13d0000000001010433000000000010043f00000001030000310000028f0000013d000c00000006001d000001220010009c00000122010080410000004001100210000001220030009c00000122030080410000006003300210000000000113019f000001220040009c0000012204008041000000c003400210000000000131019f000b00000002001d048204780000040f000000000301001900000060033002700000012203300197000000200030008c0000002005000039000000000503401900000020045001900000027b0000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000002770000c13d0000001f05500190000002880000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f000300000001035500000001002001900000000705000029000003220000613d0000000c060000290000000b02000029000000000003004b000002960000613d000000000100043d000000010010008c00000000010000390000000101006039000002a80000013d000c00000006001d00000146010000410000000000100443000b00000002001d00000004002004430000000001000414000001220010009c0000012201008041000000c00110021000000147011001c700008002020000390482047d0000040f0000000100200190000002b00000613d000000000101043b00000007050000290000000c060000290000000b02000029000000000001004b000003040000613d0000000106600039000000000056004b0000023a0000413d000000400100043d000800000001001d000001760000013d000000000001042f0000000501000029000b00000000003500000000011000790000000205000367000000430110008a000c00000001001d0000014b071001970000000009000019000000000a030019000000060b000029000002c50000013d0000001f01d000390000015b0110019700000000024d00190000000000020435000000000c410019000000200bb0003900000001099000390000000d0090006c0000019b0000813d00000000013c0049000000200110008a000000200aa0003900000000001a04350000000001b5034f000000000101043b0000014b02100197000000000472013f000000000072004b00000000020000190000014b020020410000000c0010006c000000000d0000190000014b0d0040410000014b0040009c00000000020dc019000000000002004b0000020a0000613d0000000601100029000000000215034f000000000d02043b0000014300d0009c0000020a0000213d00000020011000390000000b02d00069000000000021004b00000000040000190000014b040020410000014b022001970000014b0e100197000000000f2e013f00000000002e004b00000000020000190000014b020040410000014b00f0009c000000000204c019000000000002004b0000020a0000c13d000000000215034f0000000004dc04360000015b01d00198000000000e140019000002f60000613d000000000f02034f000000000c04001900000000f60f043c000000000c6c04360000000000ec004b000002f20000c13d0000001f0cd00190000002bc0000613d000000000112034f0000000302c0021000000000060e043300000000062601cf000000000626022f000000000101043b0000010002200089000000000121022f00000000012101cf000000000161019f00000000001e0435000002bc0000013d000000400100043d0000014803000041000000000031043500000004031000390000000000230435000001220010009c0000012201008041000000400110021000000149011001c700000484000104300000000003000416000000080600002900000004056000690000000002250019000001220020009c00000122020080410000006002200210000001220060009c000001220500004100000000050640190000004005500210000000000252019f000001220010009c0000012201008041000000c001100210000000000121019f000000000003004b0000032e0000c13d0000000002040019000003310000013d0000001f0530018f0000012406300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000003290000c13d000003900000013d00000127011001c700008009020000390000000005000019048204780000040f000300000001035500000000030100190000006003300270000101220030019d00000122033001970000000100200190000003850000613d0000015b053001980000001f0630018f0000000804500029000003430000613d000000000701034f0000000808000029000000007907043c0000000008980436000000000048004b0000033f0000c13d000000000006004b000003500000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f013000390000015b041001970000000801400029000000000041004b00000000040000390000000104004039000001430010009c0000037f0000213d00000001004001900000037f0000c13d000000400010043f0000014d0030009c0000020a0000213d000000200030008c0000020a0000413d00000008040000290000000004040433000001430040009c0000020a0000213d00000008033000290000000804400029000d00000004001d0000001f04400039000000000034004b00000000060000190000014b060080410000014b044001970000000005030019000c014b0030019b0000000c0740014f0000000c0040006c00000000040000190000014b040040410000014b0070009c000000000406c019000000000004004b0000020a0000c13d0000000d030000290000000067030434000001430070009c0000037f0000213d00000005047002100000003f084000390000014e088001970000000008180019000001430080009c000003a30000a13d0000014f01000041000000000010043f0000004101000039000000040010043f000001490100004100000484000104300000001f0530018f0000012406300198000000400200043d0000000004620019000003900000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000038c0000c13d000000000005004b0000039d0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001220020009c00000122020080410000004002200210000000000112019f0000048400010430000000400080043f0000000000710435000b00000064001d0000000b0050006b0000020a0000213d0000000b0060006c000004050000813d0000000008010019000003bc0000013d0000000303d0021000000000040f043300000000043401cf000000000434022f000000000b0c04330000010003300089000000000b3b022f00000000033b01cf000000000343019f00000000003f04350000002008800039000000000397001900000000000304350000000000a804350000000b0060006c000004050000813d0000000064060434000001430040009c0000020a0000213d0000000d0c4000290000003f04c00039000000000054004b00000000070000190000014b070080410000014b044001970000000c0940014f0000000c0040006c00000000040000190000014b040040410000014b0090009c000000000407c019000000000004004b0000020a0000c13d0000002004c000390000000009040433000001430090009c0000037f0000213d0000001f049000390000015b044001970000003f044000390000015b04400197000000400a00043d00000000044a00190000000000a4004b00000000070000390000000107004039000001430040009c0000037f0000213d00000001007001900000037f0000c13d000000400040043f00000000079a0436000000400cc000390000000004c90019000000000054004b0000020a0000213d0000015b0e9001970000001f0d90018f00000000007c004b000003f80000813d00000000000e004b000003f40000613d0000000004dc0019000000000bd70019000000200fb0008a000000200440008a000000000bef00190000000003e40019000000000303043300000000003b0435000000200ee0008c000003ee0000c13d00000000000d004b000003b60000613d000000000f070019000003ac0000013d000000000fe7001900000000000e004b000004010000613d00000000040c0019000000000b0700190000000043040434000000000b3b04360000000000fb004b000003fd0000c13d00000000000d004b000003b60000613d000000000cec0019000003ac0000013d000000400300043d0000002004000039000000000543043600000000040104330000000000450435000000400530003900000005064002100000000007560019000000000004004b000004180000c13d0000000001370049000001220010009c00000122010080410000006001100210000001220030009c00000122030080410000004002300210000000000121019f000004830001042e00000000060000190000042c0000013d000000030aa00210000000000b0c0433000000000bab01cf000000000bab022f0000000009090433000001000aa000890000000009a9022f0000000009a901cf0000000009b9019f00000000009c04350000001f098000390000015b099001970000000008780019000000000008043500000000077900190000000106600039000000000046004b0000040f0000813d0000000008370049000000400880008a000000000585043600000020011000390000000008010433000000009808043400000000078704360000015b0b8001970000001f0a80018f000000000079004b000004470000813d00000000000b004b000004430000613d000000000da90019000000000ca70019000000200cc0008a000000200dd0008a000000000ebc0019000000000fbd0019000000000f0f04330000000000fe0435000000200bb0008c0000043d0000c13d00000000000a004b000004240000613d000000000c0700190000041a0000013d000000000cb7001900000000000b004b000004500000613d000000000d090019000000000e07001900000000df0d0434000000000efe04360000000000ce004b0000044c0000c13d00000000000a004b000004240000613d0000000009b900190000041a0000013d00010000000000020000012602000041000000000502041a00000000020004140000012506100197000001220020009c0000012202008041000000c00120021000000127011001c70000800d0200003900000003030000390000012804000041000100000006001d048204780000040f0000000100200190000004680000613d00000126010000410000000102000029000000000021041b000000000001042d00000000010000190000048400010430000000000001042f0000000001000414000001220010009c0000012201008041000000c0011002100000013d011001c700008010020000390482047d0000040f0000000100200190000004760000613d000000000101043b000000000001042d000000000100001900000484000104300000047b002104210000000102000039000000000001042d0000000002000019000000000001042d00000480002104230000000102000039000000000001042d0000000002000019000000000001042d0000048200000432000004830001042e000004840001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392702000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ffffffffffffffffffffffff00000000000000000000000000000000000000000000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008da5cb5a00000000000000000000000000000000000000000000000000000000f2fde38a00000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f887ea4000000000000000000000000000000000000000000000000000000000fee81cf4000000000000000000000000000000000000000000000000000000008da5cb5b00000000000000000000000000000000000000000000000000000000c0d7865500000000000000000000000000000000000000000000000000000000f04e283e0000000000000000000000000000000000000000000000000000000054d1f13c0000000000000000000000000000000000000000000000000000000054d1f13d000000000000000000000000000000000000000000000000000000005caab55a00000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000025692962000000000000000000000000000000000000000000000000000000003ccfd60b00000000000000000000000000000000000000000000000000000000389a75e10000000000000000000000000000000000000020000000800000000000000000000000000000000000000000000000000000000000000000000000007448fbae00000000000000000000000000000000000000040000001c000000000000000002000000000000000000000000000000000000200000000c0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000006f5e881802000000000000000000000000000000000000200000008000000000000000007aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc80000000000000000000000000000000000000000000000000ffffffffffffffff23b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff601806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b8302000002000000000000000000000000000000240000000000000000000000005274afe70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000006e305f8000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe04e487b71000000000000000000000000000000000000000000000000000000003b800a46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000800000000000000000fa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c920000000000000000000000000000000000000000000000000000000082b429009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f3902000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000000000000000000000000000f4b3b1bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d00dbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0db63e79269b9eed9a43c2930a47e2489b67510e1d73cefe27fd46be5c6300a50
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e0000000000000000000000000649f2daa72a6524f0eb7f5f65e13cffc8082b10
-----Decoded View---------------
Arg [0] : _owner (address): 0xf3d63166F0Ca56C3c1A3508FcE03Ff0Cf3Fb691e
Arg [1] : _router (address): 0x0649F2dAa72a6524f0eb7f5f65e13CFfc8082b10
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3d63166f0ca56c3c1a3508fce03ff0cf3fb691e
Arg [1] : 0000000000000000000000000649f2daa72a6524f0eb7f5f65e13cffc8082b10
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.59
Net Worth in ETH
0.0002
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| OP | 100.00% | $2,950.57 | 0.0002 | $0.590114 |
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.