ETH Price: $3,288.56 (-0.75%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

Transaction Hash
Method
Block
From
To
0x736fe97c4e5e5c96a7d2bbc88ee5a3eb33b987243cde11ae4cdccdf0de0ad755 0x2213bc0b(pending)2026-01-14 6:40:132 days ago1768372813IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x4b2b5f80d8219d0700344887b63acda8f5c17d0ff35135188e1bed301b06ff6e 0x2213bc0b(pending)2026-01-14 4:46:523 days ago1768366012IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x8fa9bd6e9044df52c1f05068bde734c4ca97bab3c33013ee7445c8397d592494 0x2213bc0b(pending)2026-01-14 4:46:523 days ago1768366012IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xa19192ffc7ffe811ecd112cfb0a6bb57e50658d9f492b3faa154b3e51d3783d6 0x2213bc0b(pending)2026-01-14 4:46:523 days ago1768366012IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xdb79f8da606dc898b9efdf21229f46a3ab52b703c5af7032cb995c86b1acbc35 0x2213bc0b(pending)2026-01-14 4:46:523 days ago1768366012IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xefae8ce16c76f2b427e5381d20884ce24bdca4056e23eed69b85227d9d1abbaa 0x2213bc0b(pending)2026-01-14 4:46:523 days ago1768366012IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xb5f00bd4cd26165c615c86cd7db16bb60a89ac3fa18217a94ad58a7d063cec25 0x2213bc0b(pending)2026-01-14 4:05:033 days ago1768363503IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x682b1f5e54b4fb9ff77bf34517bd9c5bf577bf42b6165c918c199dedc4f1d861 0x2213bc0b(pending)2026-01-14 4:00:523 days ago1768363252IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xbba51f639fc2c7a649b5895810cb7601da910669a6e40d043ae29a0e6933ff48 0x2213bc0b(pending)2026-01-14 3:58:043 days ago1768363084IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x449f3f5835072318bd50ef0ba28f65a408e7fb99146452fa2a8f896afe9ef5cc 0x2213bc0b(pending)2026-01-14 3:58:043 days ago1768363084IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x14e4174c2baffc62fe97a769c8ba123a8f54167ba4472c01874f81106b24def3 0x2213bc0b(pending)2026-01-14 3:57:503 days ago1768363070IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xca9116027abae2c13a0e94793214730021474eced5b0d2bd349b919df4ed62c2 0x2213bc0b(pending)2026-01-14 3:50:503 days ago1768362650IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xa0ef2bf19e5c0a7e0f0729a4f7b222f04e0ef3c3b9fec5f634aad8de65f15517 0x2213bc0b(pending)2026-01-14 3:47:033 days ago1768362423IN
0x: Allowance Holder
0.0009 ETH(Pending)(Pending)
0x7256781e834806eb99c355d43ae2d7f470fae51e17c23ab9dffcde41923248f2 0x2213bc0b(pending)2026-01-14 3:46:513 days ago1768362411IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x4ae9a08a1fe0b3f90524cdba9850313a296477d18fad61626dde3c6f1b115438 0x2213bc0b(pending)2026-01-14 3:42:493 days ago1768362169IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x598f35ab34c2983365f9752913df00cff8bfffda628321e2607e539780ce6322 0x2213bc0b(pending)2026-01-14 3:42:493 days ago1768362169IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xb906efe7606cd9eedc9848e820ba2e7e65c83e9835a04024da35b8e0cbc0dd28 0x2213bc0b(pending)2026-01-14 3:42:383 days ago1768362158IN
0x: Allowance Holder
0.0014005928 ETH(Pending)(Pending)
0x857ae85764c128d6e61ce597bc26c31b20aae13bb003d97340982b7d2a18a015 0x2213bc0b(pending)2026-01-14 3:40:123 days ago1768362012IN
0x: Allowance Holder
0.001 ETH(Pending)(Pending)
0x5547903c484548faad0447a5c26f3d088c89e79a1ea5812a1771b8f559143a40 0x2213bc0b(pending)2026-01-14 3:32:283 days ago1768361548IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x7a0cc1f982b89183ce7ec70f2eeb4c174ee8991f1ca00ac98a773d12649f2f0c 0x2213bc0b(pending)2026-01-14 3:32:263 days ago1768361546IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xf24f52b06af80fd330f639158f191763e4b839f2dd0b2e5b498e132762fc1926 0x2213bc0b(pending)2026-01-14 3:28:403 days ago1768361320IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x3b3932b1a9beae7d94f614995bd6b2176501791402fcd7a5c5358336464a90e8 0x2213bc0b(pending)2026-01-14 3:28:403 days ago1768361320IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0x005369046c7913d5d2fdababfe88a3450ab7a5f9787afec378c8bab5934b8083 0x2213bc0b(pending)2026-01-14 3:28:403 days ago1768361320IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xb6716469254c45433567e75ae232ba907ab3d12a1f9d076ba8727cf2689ab974 0x2213bc0b(pending)2026-01-14 3:28:403 days ago1768361320IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
0xdd2700fd73bf85a21f701335b6d620d20a8bb9e9cc16f707e54a77d3dd7efa11 0x2213bc0b(pending)2026-01-14 3:27:393 days ago1768361259IN
0x: Allowance Holder
0 ETH(Pending)(Pending)
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Execute242526082026-01-17 6:16:1122 secs ago1768630571
0x: Allowance Holder
0.02923456 ETH
0x2213bc0b242526082026-01-17 6:16:1122 secs ago1768630571
0x: Allowance Holder
0.02923456 ETH
Execute242526082026-01-17 6:16:1122 secs ago1768630571
0x: Allowance Holder
0.00046862 ETH
Execute242526072026-01-17 6:15:5934 secs ago1768630559
0x: Allowance Holder
0.00062246 ETH
0x2213bc0b242526072026-01-17 6:15:5934 secs ago1768630559
0x: Allowance Holder
0.00062246 ETH
Execute242526062026-01-17 6:15:4746 secs ago1768630547
0x: Allowance Holder
0.00011562 ETH
0x2213bc0b242526062026-01-17 6:15:4746 secs ago1768630547
0x: Allowance Holder
0.00011562 ETH
Execute242526062026-01-17 6:15:4746 secs ago1768630547
0x: Allowance Holder
0.0011 ETH
0x2213bc0b242526062026-01-17 6:15:4746 secs ago1768630547
0x: Allowance Holder
0.0011 ETH
Execute242526052026-01-17 6:15:3558 secs ago1768630535
0x: Allowance Holder
0.0007 ETH
Execute242526052026-01-17 6:15:3558 secs ago1768630535
0x: Allowance Holder
0.1 ETH
Execute242526002026-01-17 6:14:351 min ago1768630475
0x: Allowance Holder
0.0007 ETH
Execute242525962026-01-17 6:13:472 mins ago1768630427
0x: Allowance Holder
0.00146729 ETH
Execute242525932026-01-17 6:13:113 mins ago1768630391
0x: Allowance Holder
0.00007179 ETH
Execute242525932026-01-17 6:13:113 mins ago1768630391
0x: Allowance Holder
0.0001175 ETH
0x2213bc0b242525932026-01-17 6:13:113 mins ago1768630391
0x: Allowance Holder
0.0001175 ETH
Execute242525892026-01-17 6:12:234 mins ago1768630343
0x: Allowance Holder
0.01340373 ETH
0x2213bc0b242525892026-01-17 6:12:234 mins ago1768630343
0x: Allowance Holder
0.01340373 ETH
Execute242525882026-01-17 6:12:114 mins ago1768630331
0x: Allowance Holder
0.01486875 ETH
0x2213bc0b242525882026-01-17 6:12:114 mins ago1768630331
0x: Allowance Holder
0.01486875 ETH
Execute242525872026-01-17 6:11:594 mins ago1768630319
0x: Allowance Holder
0.087 ETH
0x2213bc0b242525872026-01-17 6:11:594 mins ago1768630319
0x: Allowance Holder
0.087 ETH
Execute242525832026-01-17 6:11:115 mins ago1768630271
0x: Allowance Holder
0.00219671 ETH
Execute242525832026-01-17 6:11:115 mins ago1768630271
0x: Allowance Holder
0.00001175 ETH
Execute242525832026-01-17 6:11:115 mins ago1768630271
0x: Allowance Holder
0.03217921 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AllowanceHolder

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {AllowanceHolderBase} from "./AllowanceHolderBase.sol";
import {TransientStorage} from "./TransientStorage.sol";

/// @custom:security-contact [email protected]
contract AllowanceHolder is TransientStorage, AllowanceHolderBase {
    constructor() {
        require(address(this) == 0x0000000000001fF3684f28c67538d4D072C22734 || block.chainid == 31337);
    }

    /// @inheritdoc AllowanceHolderBase
    function exec(address operator, address token, uint256 amount, address payable target, bytes calldata data)
        internal
        override
        returns (bytes memory)
    {
        (bytes memory result, address sender, TSlot allowance) = _exec(operator, token, amount, target, data);
        // EIP-3074 seems unlikely
        if (sender != tx.origin) {
            _set(allowance, 0);
        }
        return result;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {IAllowanceHolder} from "./IAllowanceHolder.sol";
import {IERC20} from "../IERC20.sol";
import {SafeTransferLib} from "../vendor/SafeTransferLib.sol";
import {CheckCall} from "../utils/CheckCall.sol";
import {FreeMemory} from "../utils/FreeMemory.sol";
import {TransientStorageLayout} from "./TransientStorageLayout.sol";

/// @notice Thrown when validating the target, avoiding executing against an ERC20 directly
error ConfusedDeputy();

abstract contract AllowanceHolderBase is TransientStorageLayout, FreeMemory {
    using SafeTransferLib for IERC20;
    using CheckCall for address payable;

    function _rejectIfERC20(address payable maybeERC20, bytes calldata data) private view DANGEROUS_freeMemory {
        // We could just choose a random address for this check, but to make
        // confused deputy attacks harder for tokens that might be badly behaved
        // (e.g. tokens with blacklists), we choose to copy the first argument
        // out of `data` and mask it as an address. If there isn't enough
        // `data`, we use 0xdead instead.
        address target;
        if (data.length > 0x10) {
            target = address(uint160(bytes20(data[0x10:])));
        }
        // EIP-1352 (not adopted) specifies 0xffff as the maximum precompile
        if (target <= address(0xffff)) {
            // 0xdead is a conventional burn address; we assume that it is not treated specially
            target = address(0xdead);
        }
        bytes memory testData = abi.encodeCall(IERC20.balanceOf, target);
        if (maybeERC20.checkCall(testData, 0x20)) revert ConfusedDeputy();
    }

    function _msgSender() private view returns (address sender) {
        if ((sender = msg.sender) == address(this)) {
            assembly ("memory-safe") {
                sender := shr(0x60, calldataload(sub(calldatasize(), 0x14)))
            }
        }
    }

    /// @dev This virtual function provides the implementation for the function
    ///      of the same name in `IAllowanceHolder`. It is unimplemented in this
    ///      base contract to accommodate the customization required to support
    ///      both chains that have EIP-1153 (transient storage) and those that
    ///      don't.
    function exec(address operator, address token, uint256 amount, address payable target, bytes calldata data)
        internal
        virtual
        returns (bytes memory result);

    /// @dev This is the majority of the implementation of IAllowanceHolder.exec
    ///      . The arguments have the same meaning as documented there.
    /// @return result
    /// @return sender The (possibly forwarded) message sender that is
    ///                requesting the allowance be set. Provided to avoid
    ///                duplicated computation in customized `exec`
    /// @return allowance The slot where the ephemeral allowance is
    ///                   stored. Provided to avoid duplicated computation in
    ///                   customized `exec`
    function _exec(address operator, address token, uint256 amount, address payable target, bytes calldata data)
        internal
        returns (bytes memory result, address sender, TSlot allowance)
    {
        // This contract has no special privileges, except for the allowances it
        // holds. In order to prevent abusing those allowances, we prohibit
        // sending arbitrary calldata (doing `target.call(data)`) to any
        // contract that might be an ERC20.
        _rejectIfERC20(target, data);

        sender = _msgSender();
        allowance = _ephemeralAllowance(operator, sender, token);
        _set(allowance, amount);

        // For gas efficiency we're omitting a bunch of checks here. Notably,
        // we're omitting the check that `address(this)` has sufficient value to
        // send (we know it does), and we're omitting the check that `target`
        // contains code (we already checked in `_rejectIfERC20`).
        assembly ("memory-safe") {
            result := mload(0x40)
            calldatacopy(result, data.offset, data.length)
            // ERC-2771 style msgSender forwarding https://eips.ethereum.org/EIPS/eip-2771
            mstore(add(result, data.length), shl(0x60, sender))
            let success := call(gas(), target, callvalue(), result, add(data.length, 0x14), 0x00, 0x00)
            let ptr := add(result, 0x20)
            returndatacopy(ptr, 0x00, returndatasize())
            switch success
            case 0 { revert(ptr, returndatasize()) }
            default {
                mstore(result, returndatasize())
                mstore(0x40, add(ptr, returndatasize()))
            }
        }
    }

    /// @dev This provides the implementation of the function of the same name
    ///      in `IAllowanceHolder`.
    function transferFrom(address token, address owner, address recipient, uint256 amount) internal {
        // msg.sender is the assumed and later validated operator
        TSlot allowance = _ephemeralAllowance(msg.sender, owner, token);
        // validation of the ephemeral allowance for operator, owner, token via
        // uint underflow
        _set(allowance, _get(allowance) - amount);
        // `safeTransferFrom` does not check that `token` actually contains
        // code. It is the responsibility of integrating code to check for that
        // if vacuous success is a security concern.
        IERC20(token).safeTransferFrom(owner, recipient, amount);
    }

    fallback() external payable {
        uint256 selector;
        assembly ("memory-safe") {
            selector := shr(0xe0, calldataload(0x00))
        }
        if (selector == uint256(uint32(IAllowanceHolder.transferFrom.selector))) {
            address token;
            address owner;
            address recipient;
            uint256 amount;
            assembly ("memory-safe") {
                // We do not validate `calldatasize()`. If the calldata is short
                // enough that `amount` is null, this call is a harmless no-op.
                let err := callvalue()
                token := calldataload(0x04)
                err := or(err, shr(0xa0, token))
                owner := calldataload(0x24)
                err := or(err, shr(0xa0, owner))
                recipient := calldataload(0x44)
                err := or(err, shr(0xa0, recipient))
                if err { revert(0x00, 0x00) }
                amount := calldataload(0x64)
            }

            transferFrom(token, owner, recipient, amount);

            // return true;
            assembly ("memory-safe") {
                mstore(0x00, 0x01)
                return(0x00, 0x20)
            }
        } else if (selector == uint256(uint32(IAllowanceHolder.exec.selector))) {
            address operator;
            address token;
            uint256 amount;
            address payable target;
            bytes calldata data;
            assembly ("memory-safe") {
                // We do not validate `calldatasize()`. If the calldata is short
                // enough that `data` is null, it will alias `operator`. This
                // results in either an OOG (because `operator` encodes a
                // too-long `bytes`) or is a harmless no-op (because `operator`
                // encodes a valid length, but not an address capable of making
                // calls). If the calldata is _so_ sort that `target` is null,
                // we will revert because it contains no code.
                operator := calldataload(0x04)
                let err := shr(0xa0, operator)
                token := calldataload(0x24)
                err := or(err, shr(0xa0, token))
                amount := calldataload(0x44)
                target := calldataload(0x64)
                err := or(err, shr(0xa0, target))
                if err { revert(0x00, 0x00) }
                // We perform no validation that `data` is reasonable.
                data.offset := add(0x04, calldataload(0x84))
                data.length := calldataload(data.offset)
                data.offset := add(0x20, data.offset)
            }

            bytes memory result = exec(operator, token, amount, target, data);

            // return result;
            assembly ("memory-safe") {
                let returndata := sub(result, 0x20)
                mstore(returndata, 0x20)
                return(returndata, add(0x40, mload(result)))
            }
        } else if (selector == uint256(uint32(IERC20.balanceOf.selector))) {
            // balanceOf(address) reverts with a single byte of returndata,
            // making it more gas efficient to pass the `_rejectERC20` check
            assembly ("memory-safe") {
                revert(0x00, 0x01)
            }
        } else {
            // emulate standard Solidity behavior
            assembly ("memory-safe") {
                revert(0x00, 0x00)
            }
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {TransientStorageBase} from "./TransientStorageBase.sol";

abstract contract TransientStorage is TransientStorageBase {
    function _get(TSlot s) internal view override returns (uint256 r) {
        assembly ("memory-safe") {
            r := tload(s)
        }
    }

    function _set(TSlot s, uint256 v) internal override {
        assembly ("memory-safe") {
            tstore(s, v)
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

interface IAllowanceHolder {
    /// @notice Executes against `target` with the `data` payload. Prior to execution, token permits
    ///         are temporarily stored for the duration of the transaction. These permits can be
    ///         consumed by the `operator` during the execution
    /// @notice `operator` consumes the funds during its operations by calling back into
    ///         `AllowanceHolder` with `transferFrom`, consuming a token permit.
    /// @dev Neither `exec` nor `transferFrom` check that `token` contains code.
    /// @dev msg.sender is forwarded to target appended to the msg data (similar to ERC-2771)
    /// @param operator An address which is allowed to consume the token permits
    /// @param token The ERC20 token the caller has authorised to be consumed
    /// @param amount The quantity of `token` the caller has authorised to be consumed
    /// @param target A contract to execute operations with `data`
    /// @param data The data to forward to `target`
    /// @return result The returndata from calling `target` with `data`
    /// @notice If calling `target` with `data` reverts, the revert is propagated
    function exec(address operator, address token, uint256 amount, address payable target, bytes calldata data)
        external
        payable
        returns (bytes memory result);

    /// @notice The counterpart to `exec` which allows for the consumption of token permits later
    ///         during execution
    /// @dev *DOES NOT* check that `token` contains code. This function vacuously succeeds if
    ///      `token` is empty.
    /// @dev can only be called by the `operator` previously registered in `exec`
    /// @param token The ERC20 token to transfer
    /// @param owner The owner of tokens to transfer
    /// @param recipient The destination/beneficiary of the ERC20 `transferFrom`
    /// @param amount The quantity of `token` to transfer`
    /// @return true
    function transferFrom(address token, address owner, address recipient, uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
    function approve(address, uint256) external returns (bool);
    function allowance(address, address) external view returns (uint256);

    event Transfer(address indexed, address indexed, uint256);
    event Approval(address indexed, address indexed, uint256);
}

interface IERC20Meta is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.25;

import {IERC20} from "../IERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    uint32 private constant _TRANSFER_FROM_FAILED_SELECTOR = 0x7939f424; // bytes4(keccak256("TransferFromFailed()"))
    uint32 private constant _TRANSFER_FAILED_SELECTOR = 0x90b8ec18; // bytes4(keccak256("TransferFailed()"))
    uint32 private constant _APPROVE_FAILED_SELECTOR = 0x3e3f8f73; // bytes4(keccak256("ApproveFailed()"))

    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address payable to, uint256 amount) internal {
        assembly ("memory-safe") {
            // Transfer the ETH and store if it succeeded or not.
            if iszero(call(gas(), to, amount, 0, 0, 0, 0)) {
                let freeMemoryPointer := mload(0x40)
                returndatacopy(freeMemoryPointer, 0, returndatasize())
                revert(freeMemoryPointer, returndatasize())
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            if iszero(call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)) {
                returndatacopy(freeMemoryPointer, 0, returndatasize())
                revert(freeMemoryPointer, returndatasize())
            }
            // We check that the call either returned exactly 1 (can't just be non-zero data), or had no
            // return data.
            if iszero(or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize()))) {
                mstore(0, _TRANSFER_FROM_FAILED_SELECTOR)
                revert(0x1c, 0x04)
            }
        }
    }

    function safeTransfer(IERC20 token, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)) {
                returndatacopy(freeMemoryPointer, 0, returndatasize())
                revert(freeMemoryPointer, returndatasize())
            }
            // We check that the call either returned exactly 1 (can't just be non-zero data), or had no
            // return data.
            if iszero(or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize()))) {
                mstore(0, _TRANSFER_FAILED_SELECTOR)
                revert(0x1c, 0x04)
            }
        }
    }

    function safeApprove(IERC20 token, address to, uint256 amount) internal {
        assembly ("memory-safe") {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
            // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
            if iszero(call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)) {
                returndatacopy(freeMemoryPointer, 0, returndatasize())
                revert(freeMemoryPointer, returndatasize())
            }
            // We check that the call either returned exactly 1 (can't just be non-zero data), or had no
            // return data.
            if iszero(or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize()))) {
                mstore(0, _APPROVE_FAILED_SELECTOR)
                revert(0x1c, 0x04)
            }
        }
    }

    function safeApproveIfBelow(IERC20 token, address spender, uint256 amount) internal {
        uint256 allowance = token.allowance(address(this), spender);
        if (allowance < amount) {
            if (allowance != 0) {
                safeApprove(token, spender, 0);
            }
            safeApprove(token, spender, type(uint256).max);
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

library CheckCall {
    /**
     * @notice `staticcall` another contract. Check the length of the return without reading it.
     * @dev contains protections against EIP-150-induced insufficient gas griefing
     * @dev reverts iff the target is not a contract or we encounter an out-of-gas
     * @return success true iff the call succeeded and returned at least `minReturnBytes` of return
     *                 data
     * @param target the contract (reverts if non-contract) on which to make the `staticcall`
     * @param data the calldata to pass
     * @param minReturnBytes `success` is false if the call doesn't return at least this much return
     *                       data
     */
    function checkCall(address target, bytes memory data, uint256 minReturnBytes)
        internal
        view
        returns (bool success)
    {
        assembly ("memory-safe") {
            let beforeGas
            {
                let offset := add(data, 0x20)
                let length := mload(data)
                beforeGas := gas()
                success := staticcall(gas(), target, offset, length, 0x00, 0x00)
            }

            // `verbatim` can't work in inline assembly. Assignment of a value to a variable costs
            // gas (although how much is unpredictable because it depends on the Yul/IR optimizer),
            // as does the `GAS` opcode itself. Therefore, the `gas()` below returns less than the
            // actual amount of gas available for computation at the end of the call. Also
            // `beforeGas` above is exclusive of the preparing of the stack for `staticcall` as well
            // as the gas costs of the `staticcall` paid by the caller (e.g. cold account
            // access). All this makes the check below slightly too conservative. However, we do not
            // correct this because the correction would become outdated (possibly too permissive)
            // if the opcodes are repriced.
            let afterGas := gas()

            for {} 1 {} {
                if iszero(returndatasize()) {
                    // The absence of returndata means that it's possible that either we called an
                    // address without code or that the call reverted due to out-of-gas. We must
                    // check.
                    switch success
                    case 0 {
                        // Check whether the call reverted due to out-of-gas.
                        // https://eips.ethereum.org/EIPS/eip-150
                        // https://ronan.eth.limo/blog/ethereum-gas-dangers/
                        // We apply the "all but one 64th" rule twice because `target` could
                        // plausibly be a proxy. We apply it only twice because we assume only a
                        // single level of indirection.
                        let remainingGas := shr(6, beforeGas)
                        remainingGas := add(remainingGas, shr(6, sub(beforeGas, remainingGas)))
                        if iszero(lt(remainingGas, afterGas)) {
                            // The call failed due to not enough gas left. We deliberately consume
                            // all remaining gas with `invalid` (instead of `revert`) to make this
                            // failure distinguishable to our caller.
                            invalid()
                        }
                        // `success` is false because the call reverted
                    }
                    default {
                        // Check whether we called an address with no code (gas expensive).
                        if iszero(extcodesize(target)) { revert(0x00, 0x00) }
                        // We called a contract which returned no data; this is only a success if we
                        // were expecting no data.
                        success := iszero(minReturnBytes)
                    }
                    break
                }
                // The presence of returndata indicates that we definitely executed code. It also
                // means that the call didn't revert due to out-of-gas, if it reverted. We can omit
                // a bunch of checks.
                success := gt(success, lt(returndatasize(), minReturnBytes))
                break
            }
        }
    }
}

File 8 of 10 : FreeMemory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

abstract contract FreeMemory {
    modifier DANGEROUS_freeMemory() {
        uint256 freeMemPtr;
        assembly ("memory-safe") {
            freeMemPtr := mload(0x40)
        }
        _;
        assembly ("memory-safe") {
            mstore(0x40, freeMemPtr)
        }
    }
}

File 9 of 10 : TransientStorageLayout.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import {TransientStorageBase} from "./TransientStorageBase.sol";

abstract contract TransientStorageLayout is TransientStorageBase {
    /// @dev The key for this ephemeral allowance is keccak256(abi.encodePacked(operator, owner, token)).
    function _ephemeralAllowance(address operator, address owner, address token) internal pure returns (TSlot r) {
        assembly ("memory-safe") {
            let ptr := mload(0x40)
            mstore(0x28, token)
            mstore(0x14, owner)
            mstore(0x00, operator)
            // allowance slot is keccak256(abi.encodePacked(operator, owner, token))
            r := keccak256(0x0c, 0x3c)
            // restore dirtied free pointer
            mstore(0x40, ptr)
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

abstract contract TransientStorageBase {
    type TSlot is bytes32;

    function _get(TSlot s) internal view virtual returns (uint256);

    function _set(TSlot s, uint256 v) internal virtual;
}

Settings
{
  "remappings": [
    "solmate/=lib/solmate/",
    "permit2/=lib/permit2/",
    "forge-std/=lib/forge-std/src/",
    "forge-gas-snapshot/=lib/forge-gas-snapshot/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000,
    "details": {
      "constantOptimizer": true,
      "yul": true
    }
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ConfusedDeputy","type":"error"},{"stateMutability":"payable","type":"fallback"}]

608080604052346030576d1ff3684f28c67538d4d072c22734301480156034575b156030576103f1908161003f8239f35b5f80fd5b50617a694614602056fe608060408181525f3560e01c6315dacbea81036101245750600435602435604435928360a01c8260a01c8460a01c34171717610120576040805160288590526014849052335f52603c600c2091526064359290805c928484039384116100f3576020955f9560649587945d73ffffffffffffffffffffffffffffffffffffffff80998194519a8b977f23b872dd0000000000000000000000000000000000000000000000000000000089521660048801521660248601526044850152165af1156100eb573d15601f3d1160015f51141617156100de5760015f5260205ff35b637939f4245f526004601cfd5b3d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f80fd5b632213bc0b81036103e2575060043560243590606435918260a01c8160a01c8360a01c171761012057608435928360040135935f9260108611610360575b73ffffffffffffffffffffffffffffffffffffffff9361ffff8582161115610357575b8460208a01917f70a082310000000000000000000000000000000000000000000000000000000083521660248a0152602489526060890189811067ffffffffffffffff82111761032a5788528484165f808b515a94845afa905a60203d10933d156102fb57505050115b6102d257602497875233943033146102a4575b9160146102295f959388879690929192604051936028526014525f52603c600c2091604052565b97604435895d808a519b8c940184378760601b81840152019134905af160208601903d5f833e156102a057503d855260203d860101845232911603610297575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082019160208352510190f35b5f905d5f610269565b3d90fd5b367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec013560601c9550610202565b600487517fe758b8d5000000000000000000000000000000000000000000000000000000008152fd5b919350908215610314575050503b15610120575f6101ef565b90919250600681811c809203901c01106101ef57fe5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5061dead610185565b9250846010116101205760348101357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008082169160147ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff08901106103ca575b505060601c92610162565b908092506010886014030160031b1b16165f806103bf565b6370a08231036101205760015ffd

Deployed Bytecode

0x608060408181525f3560e01c6315dacbea81036101245750600435602435604435928360a01c8260a01c8460a01c34171717610120576040805160288590526014849052335f52603c600c2091526064359290805c928484039384116100f3576020955f9560649587945d73ffffffffffffffffffffffffffffffffffffffff80998194519a8b977f23b872dd0000000000000000000000000000000000000000000000000000000089521660048801521660248601526044850152165af1156100eb573d15601f3d1160015f51141617156100de5760015f5260205ff35b637939f4245f526004601cfd5b3d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f80fd5b632213bc0b81036103e2575060043560243590606435918260a01c8160a01c8360a01c171761012057608435928360040135935f9260108611610360575b73ffffffffffffffffffffffffffffffffffffffff9361ffff8582161115610357575b8460208a01917f70a082310000000000000000000000000000000000000000000000000000000083521660248a0152602489526060890189811067ffffffffffffffff82111761032a5788528484165f808b515a94845afa905a60203d10933d156102fb57505050115b6102d257602497875233943033146102a4575b9160146102295f959388879690929192604051936028526014525f52603c600c2091604052565b97604435895d808a519b8c940184378760601b81840152019134905af160208601903d5f833e156102a057503d855260203d860101845232911603610297575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082019160208352510190f35b5f905d5f610269565b3d90fd5b367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec013560601c9550610202565b600487517fe758b8d5000000000000000000000000000000000000000000000000000000008152fd5b919350908215610314575050503b15610120575f6101ef565b90919250600681811c809203901c01106101ef57fe5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5061dead610185565b9250846010116101205760348101357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008082169160147ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff08901106103ca575b505060601c92610162565b908092506010886014030160031b1b16165f806103bf565b6370a08231036101205760015ffd

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
0x0000000000001fF3684f28c67538d4D072C22734
Net Worth in USD
$2,245,703,615.37

Net Worth in ETH
682,882.596461

Token Allocations
LUIGI 99.90%
LOVELY 0.10%
DHN 0.00%
Others 0.00%
Chain Token Portfolio % Price Amount Value
BSC99.90%$0.0002967,580,669,599,479.208$2,243,490,553.63
BSC0.10%$0.009053243,552,343.9868$2,204,757.59
BSC<0.01%$5.851,000$5,850
BSC<0.01%$0.999586488.6058$488.4
BSC<0.01%$0.999713155.602$155.56
BSC<0.01%$0.00000813,196,946.7952$112.14
BSC<0.01%$0.000552151,701.6586$83.73
BSC<0.01%$2.0638.77$79.95
BSC<0.01%$0.000033579,253.1036$18.96
BSC<0.01%$17.3645$7.37
BSC<0.01%$0.00832560.6775$4.67
BSC<0.01%$0.012176306.3535$3.73
BSC<0.01%$0.0540468.771$0.474
BSC<0.01%$0.0025$0.00
BSC<0.01%$0.000657200$0.1313
BASE<0.01%$0.0163470,845.6803$1,157.64
BASE<0.01%$95,3010.00003111$2.96
BASE<0.01%$0.999850.5$0.4999
BASE<0.01%$0.00002811,641.7011$0.3265
ETH<0.01%<$0.0000016,655,290,430.649$155.72
ETH<0.01%$3,664.140.00964142$35.33
ETH<0.01%$0.0043865,651.1134$24.78
ETH<0.01%$0.0000092,500,000$21.25
ETH<0.01%$0.99955713.7014$13.7
ETH<0.01%<$0.000001796,089,068,063,452,540$13.53
ETH<0.01%$0.9997251$0.9997
ETH<0.01%$0.01069357.0281$0.6098
ETH<0.01%$95,0320.00000319$0.3031
ABSTRACT<0.01%$3,289.870.0156$51.29
LINEA<0.01%$3,288.410.006001$19.73
POL<0.01%$0.000.0006018$0.00
OPBNB<0.01%$936.770.000000008318$0.000008
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.