Ape Curtis Testnet

Contract

0xFF0000B6c4352714cCe809000d0cd30A0E0c8DcE
Source Code Source Code

Overview

APE Balance

Ape Curtis LogoApe Curtis LogoApe Curtis Logo0 APE

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Clone Trusted Fo...270559762025-08-12 20:05:15242 days ago1755029115IN
0xFF0000B6...A0E0c8DcE
0 APE0.000001170.01

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Amount
319292892025-12-17 11:51:03115 days ago1765972263
0xFF0000B6...A0E0c8DcE
0 APE
319292862025-12-17 11:50:49115 days ago1765972249
0xFF0000B6...A0E0c8DcE
0 APE
319291872025-12-17 11:39:34115 days ago1765971574
0xFF0000B6...A0E0c8DcE
0 APE
319226442025-12-16 20:01:14116 days ago1765915274
0xFF0000B6...A0E0c8DcE
0 APE
319226402025-12-16 20:00:17116 days ago1765915217
0xFF0000B6...A0E0c8DcE
0 APE
319225452025-12-16 18:38:01116 days ago1765910281
0xFF0000B6...A0E0c8DcE
0 APE
303314152025-10-15 16:34:49178 days ago1760546089
0xFF0000B6...A0E0c8DcE
0 APE
286384752025-09-23 16:48:18200 days ago1758646098
0xFF0000B6...A0E0c8DcE
0 APE
286383832025-09-23 16:46:15200 days ago1758645975
0xFF0000B6...A0E0c8DcE
0 APE
283386702025-09-19 16:40:55204 days ago1758300055
0xFF0000B6...A0E0c8DcE
0 APE
282400862025-09-18 11:12:44205 days ago1758193964
0xFF0000B6...A0E0c8DcE
0 APE
279020802025-09-08 21:08:31215 days ago1757365711
0xFF0000B6...A0E0c8DcE
0 APE
278945762025-09-08 8:57:37215 days ago1757321857
0xFF0000B6...A0E0c8DcE
0 APE
278450062025-09-04 15:38:44219 days ago1757000324
0xFF0000B6...A0E0c8DcE
0 APE
278310632025-09-03 14:42:49220 days ago1756910569
0xFF0000B6...A0E0c8DcE
0 APE
278300712025-09-03 12:51:26220 days ago1756903886
0xFF0000B6...A0E0c8DcE
0 APE
278300592025-09-03 12:50:05220 days ago1756903805
0xFF0000B6...A0E0c8DcE
0 APE
278298152025-09-03 11:48:36220 days ago1756900116
0xFF0000B6...A0E0c8DcE
0 APE
277444722025-08-28 15:06:43226 days ago1756393603
0xFF0000B6...A0E0c8DcE
0 APE
276825822025-08-27 16:17:41227 days ago1756311461
0xFF0000B6...A0E0c8DcE
0 APE
272721902025-08-21 15:38:01233 days ago1755790681
0xFF0000B6...A0E0c8DcE
0 APE
272697242025-08-21 14:35:31233 days ago1755786931
0xFF0000B6...A0E0c8DcE
0 APE
272684722025-08-21 14:04:21233 days ago1755785061
0xFF0000B6...A0E0c8DcE
0 APE
272676632025-08-21 13:45:49233 days ago1755783949
0xFF0000B6...A0E0c8DcE
0 APE
272675462025-08-21 13:43:05233 days ago1755783785
0xFF0000B6...A0E0c8DcE
0 APE
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TrustedForwarderFactory

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

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

import "@openzeppelin/contracts/proxy/Clones.sol";

contract TrustedForwarderFactory {

    error TrustedForwarderFactory__TrustedForwarderInitFailed(address admin, address appSigner);

    event TrustedForwarderCreated(address indexed creator, address indexed trustedForwarder);

    // keccak256("__TrustedForwarder_init(address,address)")
    bytes4 constant private INIT_SELECTOR = 0x81ab13d7;
    address immutable public trustedForwarderImplementation;

    mapping(address => bool) public forwarders;

    constructor(address trustedForwarderImplementation_) {
        trustedForwarderImplementation = trustedForwarderImplementation_;
    }

    /**
     * @notice Returns true if the sender is a trusted forwarder, false otherwise.
     * @notice Addresses are added to the `forwarders` mapping when they are cloned via the `cloneTrustedForwarder` function.
     *
     * @dev    This function allows for the TrustedForwarder contracts to be used as trusted forwarders within the TrustedForwarderERC2771Context mixin.
     * 
     * @param sender The address to check.
     * @return True if the sender is a trusted forwarder, false otherwise.
     */
    function isTrustedForwarder(address sender) external view returns (bool) {
        return forwarders[sender];
    }

    /**
     * @notice Clones the TrustedForwarder implementation and initializes it.
     *
     * @dev    To prevent hostile deployments, we hash the sender's address with the salt to create the final salt.
     * @dev    This prevents the mining of specific contract addresses for deterministic deployments, but still allows for
     * @dev    a canonical address to be created for each sender.
     *
     * @param admin             The address to assign the admin role to.
     * @param appSigner         The address to assign the app signer role to. This will be ignored if `enableAppSigner` is false.
     * @param salt              The salt to use for the deterministic deployment.  This is hashed with the sender's address to create the final salt.
     *
     * @return trustedForwarder The address of the newly created TrustedForwarder contract.
     */
    function cloneTrustedForwarder(address admin, address appSigner, bytes32 salt) external returns (address trustedForwarder) {
        trustedForwarder = Clones.cloneDeterministic(trustedForwarderImplementation, keccak256(abi.encode(msg.sender, salt)));

        (bool success, ) = trustedForwarder.call(abi.encodeWithSelector(INIT_SELECTOR, admin, appSigner));
        if (!success) {
            revert TrustedForwarderFactory__TrustedForwarderInitFailed(admin, appSigner);
        }
        forwarders[trustedForwarder] = true;

        emit TrustedForwarderCreated(msg.sender, trustedForwarder);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/Clones.sol)

pragma solidity ^0.8.0;

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create(0, 0x09, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
            instance := create2(0, 0x09, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(add(ptr, 0x38), deployer)
            mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
            mstore(add(ptr, 0x14), implementation)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
            mstore(add(ptr, 0x58), salt)
            mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
            predicted := keccak256(add(ptr, 0x43), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt
    ) internal view returns (address predicted) {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"trustedForwarderImplementation_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"appSigner","type":"address"}],"name":"TrustedForwarderFactory__TrustedForwarderInitFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"trustedForwarder","type":"address"}],"name":"TrustedForwarderCreated","type":"event"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"appSigner","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"cloneTrustedForwarder","outputs":[{"internalType":"address","name":"trustedForwarder","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"forwarders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedForwarderImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561001057600080fd5b5060405161057a38038061057a83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516104e9610091600039600081816056015261013a01526104e96000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630f99ab9814610051578063572b6c05146100a257806376101c0a146100eb578063f46d57c3146100fe575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100db6100b0366004610426565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b6040519015158152602001610099565b6100786100f9366004610448565b610121565b6100db61010c366004610426565b60006020819052908152604090205460ff1681565b60408051336020820152908101829052600090610178907f00000000000000000000000000000000000000000000000000000000000000009060600160405160208183030381529060405280519060200120610333565b6040805173ffffffffffffffffffffffffffffffffffffffff878116602483015286811660448084019190915283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f81ab13d7000000000000000000000000000000000000000000000000000000001790529151929350600092918416916102149190610484565b6000604051808303816000865af19150503d8060008114610251576040519150601f19603f3d011682016040523d82523d6000602084013e610256565b606091505b50509050806102b6576040517fc1d4a79100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555133917fa853f409d7f35adcac6fe80e553b39788513690b76400aca5a478ecc51bdba3691a3509392505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f5905073ffffffffffffffffffffffffffffffffffffffff81166103f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102ad565b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461042157600080fd5b919050565b60006020828403121561043857600080fd5b610441826103fd565b9392505050565b60008060006060848603121561045d57600080fd5b610466846103fd565b9250610474602085016103fd565b9150604084013590509250925092565b6000825160005b818110156104a5576020818601810151858301520161048b565b50600092019182525091905056fea264697066735822122040f722c54e2b473f3601c678616f6d13c61f4f3ca085d95514f28035ba9f9eb964736f6c63430008130033000000000000000000000000ff000047abea9064c699c0727148776e4e17771c

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630f99ab9814610051578063572b6c05146100a257806376101c0a146100eb578063f46d57c3146100fe575b600080fd5b6100787f000000000000000000000000ff000047abea9064c699c0727148776e4e17771c81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100db6100b0366004610426565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b6040519015158152602001610099565b6100786100f9366004610448565b610121565b6100db61010c366004610426565b60006020819052908152604090205460ff1681565b60408051336020820152908101829052600090610178907f000000000000000000000000ff000047abea9064c699c0727148776e4e17771c9060600160405160208183030381529060405280519060200120610333565b6040805173ffffffffffffffffffffffffffffffffffffffff878116602483015286811660448084019190915283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f81ab13d7000000000000000000000000000000000000000000000000000000001790529151929350600092918416916102149190610484565b6000604051808303816000865af19150503d8060008114610251576040519150601f19603f3d011682016040523d82523d6000602084013e610256565b606091505b50509050806102b6576040517fc1d4a79100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8087166004830152851660248201526044015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526020819052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555133917fa853f409d7f35adcac6fe80e553b39788513690b76400aca5a478ecc51bdba3691a3509392505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f5905073ffffffffffffffffffffffffffffffffffffffff81166103f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016102ad565b92915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461042157600080fd5b919050565b60006020828403121561043857600080fd5b610441826103fd565b9392505050565b60008060006060848603121561045d57600080fd5b610466846103fd565b9250610474602085016103fd565b9150604084013590509250925092565b6000825160005b818110156104a5576020818601810151858301520161048b565b50600092019182525091905056fea264697066735822122040f722c54e2b473f3601c678616f6d13c61f4f3ca085d95514f28035ba9f9eb964736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ff000047abea9064c699c0727148776e4e17771c

-----Decoded View---------------
Arg [0] : trustedForwarderImplementation_ (address): 0xFF000047aBEA9064C699c0727148776e4E17771C

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff000047abea9064c699c0727148776e4e17771c


Deployed Bytecode Sourcemap

109:2703:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;459:55;;;;;;;;190:42:2;178:55;;;160:74;;148:2;133:18;459:55:1;;;;;;;;1221:115;;;;;;:::i;:::-;1311:18;;1288:4;1311:18;;;;;;;;;;;;;;1221:115;;;;802:14:2;;795:22;777:41;;765:2;750:18;1221:115:1;637:187:2;2207:603:1;;;;;;:::i;:::-;;:::i;521:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2207:603;2427:28;;;2438:10;2427:28;;;1336:74:2;1426:18;;;1419:34;;;2304:24:1;;2359:98;;2385:30;;1309:18:2;;2427:28:1;;;;;;;;;;;;2417:39;;;;;;2359:25;:98::i;:::-;2509:55;;;2487:21;1717:15:2;;;2509:55:1;;;1699:34:2;1769:15;;;1749:18;;;;1742:43;;;;2509:55:1;;;;;;;;;;1611:18:2;;;;2509:55:1;;;;;;;;;2532:13;2509:55;;;2487:78;;2340:117;;-1:-1:-1;;;2487:21:1;;;;:78;;2509:55;2487:78;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2468:97;;;2580:7;2575:115;;2610:69;;;;;1648:42:2;1717:15;;;2610:69:1;;;1699:34:2;1769:15;;1749:18;;;1742:43;1611:18;;2610:69:1;;;;;;;;2575:115;2699:28;;;:10;:28;;;;;;;;;;;:35;;;;2730:4;2699:35;;;2750:53;2774:10;;2750:53;;;2330:480;2207:603;;;;;:::o;2107:794:0:-;2191:16;2523:48;2505:14;2499:4;2495:25;2489:4;2485:36;2482:90;2476:4;2469:104;2730:32;2713:14;2707:4;2703:25;2700:63;2694:4;2687:77;2812:4;2806;2800;2797:1;2789:28;2777:40;-1:-1:-1;2844:22:0;;;2836:58;;;;;;;2415:2:2;2836:58:0;;;2397:21:2;2454:2;2434:18;;;2427:30;2493:25;2473:18;;;2466:53;2536:18;;2836:58:0;2213:347:2;2836:58:0;2107:794;;;;:::o;245:196:2:-;313:20;;373:42;362:54;;352:65;;342:93;;431:1;428;421:12;342:93;245:196;;;:::o;446:186::-;505:6;558:2;546:9;537:7;533:23;529:32;526:52;;;574:1;571;564:12;526:52;597:29;616:9;597:29;:::i;:::-;587:39;446:186;-1:-1:-1;;;446:186:2:o;829:328::-;906:6;914;922;975:2;963:9;954:7;950:23;946:32;943:52;;;991:1;988;981:12;943:52;1014:29;1033:9;1014:29;:::i;:::-;1004:39;;1062:38;1096:2;1085:9;1081:18;1062:38;:::i;:::-;1052:48;;1147:2;1136:9;1132:18;1119:32;1109:42;;829:328;;;;;:::o;1796:412::-;1925:3;1963:6;1957:13;1988:1;1998:129;2012:6;2009:1;2006:13;1998:129;;;2110:4;2094:14;;;2090:25;;2084:32;2071:11;;;2064:53;2027:12;1998:129;;;-1:-1:-1;2182:1:2;2146:16;;2171:13;;;-1:-1:-1;2146:16:2;1796:412;-1:-1:-1;1796:412:2:o

Swarm Source

ipfs://40f722c54e2b473f3601c678616f6d13c61f4f3ca085d95514f28035ba9f9eb9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0xFF0000B6c4352714cCe809000d0cd30A0E0c8DcE
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.