ETH Price: $1,968.88 (-2.17%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Signature245608102026-03-01 6:30:2319 hrs ago1772346623IN
0x38B2D254...AC63498ed
0 ETH0.000010270.11417123
Set Signature245578112026-02-28 20:27:4729 hrs ago1772310467IN
0x38B2D254...AC63498ed
0 ETH0.000971830.38506549
Set Signature245577542026-02-28 20:16:2329 hrs ago1772309783IN
0x38B2D254...AC63498ed
0 ETH0.00157730.32320041
Set Signature245577352026-02-28 20:12:2329 hrs ago1772309543IN
0x38B2D254...AC63498ed
0 ETH0.000786320.14696611
Set Signature245577282026-02-28 20:10:5929 hrs ago1772309459IN
0x38B2D254...AC63498ed
0 ETH0.000233392.14732725
Set Signature245576832026-02-28 20:01:5929 hrs ago1772308919IN
0x38B2D254...AC63498ed
0 ETH0.0016592.1196363
Set Signature245576752026-02-28 20:00:2329 hrs ago1772308823IN
0x38B2D254...AC63498ed
0 ETH0.002733782.09364558
Set Signature245576702026-02-28 19:59:2329 hrs ago1772308763IN
0x38B2D254...AC63498ed
0 ETH0.00066040.19196787
Set Signature245576592026-02-28 19:57:1129 hrs ago1772308631IN
0x38B2D254...AC63498ed
0 ETH0.000255141.1320422
Set Signature245576542026-02-28 19:56:1129 hrs ago1772308571IN
0x38B2D254...AC63498ed
0 ETH0.002917621.12824964
Set Signature245576492026-02-28 19:55:1129 hrs ago1772308511IN
0x38B2D254...AC63498ed
0 ETH0.010431632.13456913
Set Signature245576372026-02-28 19:52:4729 hrs ago1772308367IN
0x38B2D254...AC63498ed
0 ETH0.000742072.12115223
Set Signature245576232026-02-28 19:49:5929 hrs ago1772308199IN
0x38B2D254...AC63498ed
0 ETH0.000435790.10172236
Set Signature245576072026-02-28 19:46:4729 hrs ago1772308007IN
0x38B2D254...AC63498ed
0 ETH0.000957332.11482151
Set Signature245576012026-02-28 19:45:3529 hrs ago1772307935IN
0x38B2D254...AC63498ed
0 ETH0.0001720.11927606
Set Signature245575962026-02-28 19:44:3530 hrs ago1772307875IN
0x38B2D254...AC63498ed
0 ETH0.002402360.91926929
Set Signature245575942026-02-28 19:44:1130 hrs ago1772307851IN
0x38B2D254...AC63498ed
0 ETH0.000721430.91809147
Set Signature245575902026-02-28 19:43:2330 hrs ago1772307803IN
0x38B2D254...AC63498ed
0 ETH0.000088740.20972954
Set Signature245575882026-02-28 19:42:5930 hrs ago1772307779IN
0x38B2D254...AC63498ed
0 ETH0.002389942.10507387
Set Signature245575642026-02-28 19:37:5930 hrs ago1772307479IN
0x38B2D254...AC63498ed
0 ETH0.000111510.17251518
Set Signature245575432026-02-28 19:33:4730 hrs ago1772307227IN
0x38B2D254...AC63498ed
0 ETH0.00156342.05425968
Set Signature245575372026-02-28 19:32:3530 hrs ago1772307155IN
0x38B2D254...AC63498ed
0 ETH0.000294812.04180603
Set Signature245575312026-02-28 19:31:2330 hrs ago1772307083IN
0x38B2D254...AC63498ed
0 ETH0.000382350.14705668
Set Signature245575152026-02-28 19:28:1130 hrs ago1772306891IN
0x38B2D254...AC63498ed
0 ETH0.000033820.06446415
Set Signature245575082026-02-28 19:26:4730 hrs ago1772306807IN
0x38B2D254...AC63498ed
0 ETH0.000027110.30112868
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x61001980245608102026-03-01 6:30:2319 hrs ago1772346623
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x612c0380245578112026-02-28 20:27:4729 hrs ago1772310467
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61568480245577542026-02-28 20:16:2329 hrs ago1772309783
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x615eff80245577352026-02-28 20:12:2329 hrs ago1772309543
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61006f80245577282026-02-28 20:10:5929 hrs ago1772309459
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x610c9980245576832026-02-28 20:01:5929 hrs ago1772308919
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61160980245576752026-02-28 20:00:2329 hrs ago1772308823
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x613c8b80245576702026-02-28 19:59:2329 hrs ago1772308763
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61028a80245576592026-02-28 19:57:1129 hrs ago1772308631
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61116780245576562026-02-28 19:56:3529 hrs ago1772308595
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x612d2280245576542026-02-28 19:56:1129 hrs ago1772308571
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x6156a380245576492026-02-28 19:55:1129 hrs ago1772308511
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x6104c980245576372026-02-28 19:52:4729 hrs ago1772308367
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x614bc480245576232026-02-28 19:49:5929 hrs ago1772308199
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x610eb880245576152026-02-28 19:48:2329 hrs ago1772308103
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x6106a480245576072026-02-28 19:46:4729 hrs ago1772308007
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61187f80245576012026-02-28 19:45:3529 hrs ago1772307935
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x612da180245575962026-02-28 19:44:3530 hrs ago1772307875
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x610ca780245575942026-02-28 19:44:1130 hrs ago1772307851
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61061c80245575902026-02-28 19:43:2330 hrs ago1772307803
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x6112f680245575882026-02-28 19:42:5930 hrs ago1772307779
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x610a2380245575642026-02-28 19:37:5930 hrs ago1772307479
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x610c3580245575432026-02-28 19:33:4730 hrs ago1772307227
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x61011480245575372026-02-28 19:32:3530 hrs ago1772307155
0x38B2D254...AC63498ed
 Contract Creation0 ETH
0x612d6380245575312026-02-28 19:31:2330 hrs ago1772307083
0x38B2D254...AC63498ed
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading
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:
FundingWorksSignature

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
No with 200 runs

Other Settings:
prague EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import {SSTORE2} from "solady/utils/SSTORE2.sol";
import {IFundingWorks} from "./Interfaces.sol";

/// @title FundingWorksSignature - Store SVG path signatures for FundingWorks tokens
/// @notice Allows token owners to associate an SVG path signature with their token
/// @dev Uses SSTORE2 for gas-efficient storage of signature bytes
contract FundingWorksSignature {
    /// @notice The FundingWorks NFT contract
    IFundingWorks public immutable fundingWorks;

    /// @notice Mapping from tokenId to SSTORE2 pointer contract address
    mapping(uint256 => address) public signaturePointers;

    /// @notice Emitted when a signature is set for a token
    event SignatureSet(uint256 indexed tokenId, address pointer);

    /// @notice Error thrown when caller is not the token owner
    error NotTokenOwner();

    /// @notice Error thrown when signature data is empty
    error EmptySignature();

    /// @param _fundingWorks Address of the FundingWorks NFT contract
    constructor(address _fundingWorks) {
        fundingWorks = IFundingWorks(_fundingWorks);
    }

    /// @notice Set or update the signature for a token you own
    /// @param tokenId The token ID to set the signature for
    /// @param signature The SVG path bytes to store
    function setSignature(uint256 tokenId, bytes calldata signature) external {
        if (fundingWorks.ownerOf(tokenId) != msg.sender) revert NotTokenOwner();
        if (signature.length == 0) revert EmptySignature();

        address pointer = SSTORE2.write(signature);
        signaturePointers[tokenId] = pointer;

        emit SignatureSet(tokenId, pointer);
    }

    /// @notice Get the signature for a token
    /// @param tokenId The token ID to get the signature for
    /// @return The signature bytes, or empty bytes if not set
    function getSignature(uint256 tokenId) external view returns (bytes memory) {
        address pointer = signaturePointers[tokenId];
        if (pointer == address(0)) return "";
        return SSTORE2.read(pointer);
    }

    /// @notice Check if a token has a signature set
    /// @param tokenId The token ID to check
    /// @return True if a signature is set
    function hasSignature(uint256 tokenId) external view returns (bool) {
        return signaturePointers[tokenId] != address(0);
    }
}

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

/// @notice Read and write to persistent storage at a fraction of the cost.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SSTORE2.sol)
/// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol)
/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol)
/// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3)
library SSTORE2 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The proxy initialization code.
    uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3;

    /// @dev Hash of the `_CREATE3_PROXY_INITCODE`.
    /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`.
    bytes32 internal constant CREATE3_PROXY_INITCODE_HASH =
        0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Unable to deploy the storage contract.
    error DeploymentFailed();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         WRITE LOGIC                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    function write(bytes memory data) internal returns (address pointer) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data) // Let `l` be `n + 1`. +1 as we prefix a STOP opcode.
            /**
             * ---------------------------------------------------+
             * Opcode | Mnemonic       | Stack     | Memory       |
             * ---------------------------------------------------|
             * 61 l   | PUSH2 l        | l         |              |
             * 80     | DUP1           | l l       |              |
             * 60 0xa | PUSH1 0xa      | 0xa l l   |              |
             * 3D     | RETURNDATASIZE | 0 0xa l l |              |
             * 39     | CODECOPY       | l         | [0..l): code |
             * 3D     | RETURNDATASIZE | 0 l       | [0..l): code |
             * F3     | RETURN         |           | [0..l): code |
             * 00     | STOP           |           |              |
             * ---------------------------------------------------+
             * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called.
             * Also PUSH2 is used since max contract size cap is 24,576 bytes which is less than 2 ** 16.
             */
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create(0, add(data, 0x15), add(n, 0xb))
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract with `salt`
    /// and returns its normal CREATE2 deterministic address.
    function writeCounterfactual(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            // Deploy a new contract with the generated creation code.
            pointer := create2(0, add(data, 0x15), add(n, 0xb), salt)
            if iszero(pointer) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Writes `data` into the bytecode of a storage contract and returns its address.
    /// This uses the so-called "CREATE3" workflow,
    /// which means that `pointer` is agnostic to `data, and only depends on `salt`.
    function writeDeterministic(bytes memory data, bytes32 salt)
        internal
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            mstore(0x00, _CREATE3_PROXY_INITCODE) // Store the `_PROXY_INITCODE`.
            let proxy := create2(0, 0x10, 0x10, salt)
            if iszero(proxy) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(0x14, proxy) // Store the proxy's address.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)

            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n)))
            if iszero(
                mul( // The arguments of `mul` are evaluated last to first.
                    extcodesize(pointer),
                    call(gas(), proxy, 0, add(data, 0x15), add(n, 0xb), codesize(), 0x00)
                )
            ) {
                mstore(0x00, 0x30116425) // `DeploymentFailed()`.
                revert(0x1c, 0x04)
            }
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                    ADDRESS CALCULATIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the initialization code hash of the storage contract for `data`.
    /// Used for mining vanity addresses with create2crunch.
    function initCodeHash(bytes memory data) internal pure returns (bytes32 hash) {
        /// @solidity memory-safe-assembly
        assembly {
            let n := mload(data)
            // Do a out-of-gas revert if `n + 1` is more than 2 bytes.
            returndatacopy(returndatasize(), returndatasize(), gt(n, 0xfffe))
            mstore(data, add(0x61000180600a3d393df300, shl(0x40, n)))
            hash := keccak256(add(data, 0x15), add(n, 0xb))
            mstore(data, n) // Restore the length of `data`.
        }
    }

    /// @dev Equivalent to `predictCounterfactualAddress(data, salt, address(this))`
    function predictCounterfactualAddress(bytes memory data, bytes32 salt)
        internal
        view
        returns (address pointer)
    {
        pointer = predictCounterfactualAddress(data, salt, address(this));
    }

    /// @dev Returns the CREATE2 address of the storage contract for `data`
    /// deployed with `salt` by `deployer`.
    /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly.
    function predictCounterfactualAddress(bytes memory data, bytes32 salt, address deployer)
        internal
        pure
        returns (address predicted)
    {
        bytes32 hash = initCodeHash(data);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and store the bytecode hash.
            mstore8(0x00, 0xff) // Write the prefix.
            mstore(0x35, hash)
            mstore(0x01, shl(96, deployer))
            mstore(0x15, salt)
            predicted := keccak256(0x00, 0x55)
            // Restore the part of the free memory pointer that has been overwritten.
            mstore(0x35, 0)
        }
    }

    /// @dev Equivalent to `predictDeterministicAddress(salt, address(this))`.
    function predictDeterministicAddress(bytes32 salt) internal view returns (address pointer) {
        pointer = predictDeterministicAddress(salt, address(this));
    }

    /// @dev Returns the "CREATE3" deterministic address for `salt` with `deployer`.
    function predictDeterministicAddress(bytes32 salt, address deployer)
        internal
        pure
        returns (address pointer)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Cache the free memory pointer.
            mstore(0x00, deployer) // Store `deployer`.
            mstore8(0x0b, 0xff) // Store the prefix.
            mstore(0x20, salt) // Store the salt.
            mstore(0x40, CREATE3_PROXY_INITCODE_HASH) // Store the bytecode hash.

            mstore(0x14, keccak256(0x0b, 0x55)) // Store the proxy's address.
            mstore(0x40, m) // Restore the free memory pointer.
            // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01).
            // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex).
            mstore(0x00, 0xd694)
            mstore8(0x34, 0x01) // Nonce of the proxy contract (1).
            pointer := keccak256(0x1e, 0x17)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         READ LOGIC                         */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Equivalent to `read(pointer, 0, 2 ** 256 - 1)`.
    function read(address pointer) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
            extcodecopy(pointer, add(data, 0x1f), 0x00, add(n, 0x21))
            mstore(data, n) // Store the length.
            mstore(0x40, add(n, add(data, 0x40))) // Allocate memory.
        }
    }

    /// @dev Equivalent to `read(pointer, start, 2 ** 256 - 1)`.
    function read(address pointer, uint256 start) internal view returns (bytes memory data) {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            let n := and(0xffffffffff, sub(extcodesize(pointer), 0x01))
            let l := sub(n, and(0xffffff, mul(lt(start, n), start)))
            extcodecopy(pointer, add(data, 0x1f), start, add(l, 0x21))
            mstore(data, mul(sub(n, start), lt(start, n))) // Store the length.
            mstore(0x40, add(data, add(0x40, mload(data)))) // Allocate memory.
        }
    }

    /// @dev Returns a slice of the data on `pointer` from `start` to `end`.
    /// `start` and `end` will be clamped to the range `[0, args.length]`.
    /// The `pointer` MUST be deployed via the SSTORE2 write functions.
    /// Otherwise, the behavior is undefined.
    /// Out-of-gas reverts if `pointer` does not have any code.
    function read(address pointer, uint256 start, uint256 end)
        internal
        view
        returns (bytes memory data)
    {
        /// @solidity memory-safe-assembly
        assembly {
            data := mload(0x40)
            if iszero(lt(end, 0xffff)) { end := 0xffff }
            let d := mul(sub(end, start), lt(start, end))
            extcodecopy(pointer, add(data, 0x1f), start, add(d, 0x01))
            if iszero(and(0xff, mload(add(data, d)))) {
                let n := sub(extcodesize(pointer), 0x01)
                returndatacopy(returndatasize(), returndatasize(), shr(40, n))
                d := mul(gt(n, start), sub(d, mul(gt(end, n), sub(end, n))))
            }
            mstore(data, d) // Store the length.
            mstore(add(add(data, 0x20), d), 0) // Zeroize the slot after the bytes.
            mstore(0x40, add(add(data, 0x40), d)) // Allocate memory.
        }
    }
}

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

/// @notice Interface for ENS registry
interface IENS {
    function resolver(bytes32 node) external view returns (address);
}

/// @notice Interface for ENS name resolver
interface INameResolver {
    function name(bytes32 node) external view returns (string memory);
}

/// @notice Interface for FW2Token
interface IFW2Token {
    function start(address _hook) external payable;
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function lpTokenId() external view returns (uint256);
    function loadingLiquidity() external view returns (bool);
}

/// @notice Interface for FW2Hook
interface IFW2Hook {
    function swapCount() external view returns (uint256);
}

/// @notice Interface for FundingWorks
interface IFundingWorks {
    function isSwapping() external view returns (bool);
    function name() external view returns (string memory);
    function ownerOf(uint256 tokenId) external view returns (address);
    function MINT_PRICE() external view returns (uint256);
    function VESTING_PERIOD() external view returns (uint256);
    function vestingStarted() external view returns (bool);
    function vestingStartTime() external view returns (uint256);
    function getRemainingLockedEth(uint256 tokenId) external view returns (uint256);
    function initialLockedPerToken() external view returns (uint256);
    function mintHash(uint256 tokenId) external view returns (bytes32);
}

/// @notice Interface for on-chain metadata renderer
interface IRenderer {
    function tokenURI(uint256 tokenId) external view returns (string memory);
    function contractURI() external view returns (string memory);
}

/// @notice Interface for FundingWorksSignature
interface IFundingWorksSignature {
    function getSignature(uint256 tokenId) external view returns (bytes memory);
    function hasSignature(uint256 tokenId) external view returns (bool);
}

Settings
{
  "remappings": [
    "solady/=lib/solady/src/",
    "@uniswap/v4-core/=lib/v4-core/",
    "@uniswap/v4-periphery/=lib/v4-periphery/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "v4-router/=lib/v4-router/src/",
    "@v4/=lib/v4-core/",
    "@ensdomains/=lib/v4-core/node_modules/@ensdomains/",
    "@forge/=lib/v4-router/lib/forge-std/src/",
    "@openzeppelin/uniswap-hooks/=lib/v4-router/lib/v4-template/lib/uniswap-hooks/",
    "@permit2/=lib/v4-router/lib/permit2/src/",
    "@solady/=lib/v4-router/lib/solady/",
    "@uniswap/v2-core/=lib/v4-router/lib/universal-router/node_modules/@uniswap/v2-core/",
    "@uniswap/v3-core/=lib/v4-router/lib/universal-router/node_modules/@uniswap/v3-core/",
    "@uniswap/v3-periphery/=lib/v4-router/lib/universal-router/lib/v3-periphery/",
    "@universal-router/=lib/v4-router/lib/universal-router/contracts/",
    "@v4-periphery/=lib/v4-router/lib/v4-periphery/",
    "@v4-template/=lib/v4-router/lib/v4-template/",
    "ds-test/=lib/v4-core/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-gas-snapshot/=lib/v4-router/lib/forge-gas-snapshot/src/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=lib/v4-core/node_modules/hardhat/",
    "hookmate/=lib/v4-router/lib/v4-template/lib/hookmate/src/",
    "openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/",
    "openzeppelin/=lib/v4-router/lib/v4-template/lib/uniswap-hooks/lib/v4-core/lib/openzeppelin-contracts/contracts/",
    "permit2/=lib/v4-periphery/lib/permit2/",
    "solmate/=lib/v4-core/lib/solmate/",
    "uniswap-hooks/=lib/v4-router/lib/v4-template/lib/uniswap-hooks/src/",
    "universal-router/=lib/v4-router/lib/universal-router/",
    "v3-periphery/=lib/v4-router/lib/universal-router/lib/v3-periphery/contracts/",
    "v4-core/=lib/v4-core/src/",
    "v4-periphery/=lib/v4-periphery/",
    "v4-template/=lib/v4-router/lib/v4-template/",
    "lib/permit2/test:openzeppelin-contracts/contracts/=lib/v4-router/lib/permit2/lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "prague",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_fundingWorks","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptySignature","type":"error"},{"inputs":[],"name":"NotTokenOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"pointer","type":"address"}],"name":"SignatureSet","type":"event"},{"inputs":[],"name":"fundingWorks","outputs":[{"internalType":"contract IFundingWorks","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSignature","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signaturePointers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801561000f575f5ffd5b5060405161096e38038061096e833981810160405281019061003191906100c9565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506100f4565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100988261006f565b9050919050565b6100a88161008e565b81146100b2575f5ffd5b50565b5f815190506100c38161009f565b92915050565b5f602082840312156100de576100dd61006b565b5b5f6100eb848285016100b5565b91505092915050565b60805161085b6101135f395f81816101b60152610287015261085b5ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c806302a569e61461005957806302ea0dec1461008957806368f2b04b146100a7578063b2ec536e146100d7578063cb8cac0514610107575b5f5ffd5b610073600480360381019061006e9190610530565b610123565b60405161008091906105cb565b60405180910390f35b6100916101b4565b60405161009e9190610665565b60405180910390f35b6100c160048036038101906100bc9190610530565b6101d8565b6040516100ce919061069e565b60405180910390f35b6100f160048036038101906100ec9190610530565b610207565b6040516100fe91906106d1565b60405180910390f35b610121600480360381019061011c919061074b565b61026e565b005b60605f5f5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101a25760405180602001604052805f8152509150506101af565b6101ab81610481565b9150505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f73ffffffffffffffffffffffffffffffffffffffff165f5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016102de91906107b7565b602060405180830381865afa1580156102f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031d91906107fa565b73ffffffffffffffffffffffffffffffffffffffff161461036a576040517f59dc379f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82829050036103a6576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103f383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506104b1565b9050805f5f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550837f34144b541e1d3ee551cb8b0366199f9ef9daed89ced6993d34ab406f76a42f2c82604051610473919061069e565b60405180910390a250505050565b606060405190506001823b0364ffffffffff16602181015f601f8401853c80825260408201810160405250919050565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816104ec5763301164255f526004601cfd5b80835250919050565b5f5ffd5b5f5ffd5b5f819050919050565b61050f816104fd565b8114610519575f5ffd5b50565b5f8135905061052a81610506565b92915050565b5f60208284031215610545576105446104f5565b5b5f6105528482850161051c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61059d8261055b565b6105a78185610565565b93506105b7818560208601610575565b6105c081610583565b840191505092915050565b5f6020820190508181035f8301526105e38184610593565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61062d610628610623846105eb565b61060a565b6105eb565b9050919050565b5f61063e82610613565b9050919050565b5f61064f82610634565b9050919050565b61065f81610645565b82525050565b5f6020820190506106785f830184610656565b92915050565b5f610688826105eb565b9050919050565b6106988161067e565b82525050565b5f6020820190506106b15f83018461068f565b92915050565b5f8115159050919050565b6106cb816106b7565b82525050565b5f6020820190506106e45f8301846106c2565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261070b5761070a6106ea565b5b8235905067ffffffffffffffff811115610728576107276106ee565b5b602083019150836001820283011115610744576107436106f2565b5b9250929050565b5f5f5f60408486031215610762576107616104f5565b5b5f61076f8682870161051c565b935050602084013567ffffffffffffffff8111156107905761078f6104f9565b5b61079c868287016106f6565b92509250509250925092565b6107b1816104fd565b82525050565b5f6020820190506107ca5f8301846107a8565b92915050565b6107d98161067e565b81146107e3575f5ffd5b50565b5f815190506107f4816107d0565b92915050565b5f6020828403121561080f5761080e6104f5565b5b5f61081c848285016107e6565b9150509291505056fea2646970667358221220843ad0226f5d09a30f590055f4445607807f9110287483f8a5aebc5aecfa16dc64736f6c634300081e0033000000000000000000000000b33d806a94b6770c9d309e0842a75f8e6edcd5a6

Deployed Bytecode

0x608060405234801561000f575f5ffd5b5060043610610055575f3560e01c806302a569e61461005957806302ea0dec1461008957806368f2b04b146100a7578063b2ec536e146100d7578063cb8cac0514610107575b5f5ffd5b610073600480360381019061006e9190610530565b610123565b60405161008091906105cb565b60405180910390f35b6100916101b4565b60405161009e9190610665565b60405180910390f35b6100c160048036038101906100bc9190610530565b6101d8565b6040516100ce919061069e565b60405180910390f35b6100f160048036038101906100ec9190610530565b610207565b6040516100fe91906106d1565b60405180910390f35b610121600480360381019061011c919061074b565b61026e565b005b60605f5f5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101a25760405180602001604052805f8152509150506101af565b6101ab81610481565b9150505b919050565b7f000000000000000000000000b33d806a94b6770c9d309e0842a75f8e6edcd5a681565b5f602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f73ffffffffffffffffffffffffffffffffffffffff165f5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000b33d806a94b6770c9d309e0842a75f8e6edcd5a673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016102de91906107b7565b602060405180830381865afa1580156102f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061031d91906107fa565b73ffffffffffffffffffffffffffffffffffffffff161461036a576040517f59dc379f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82829050036103a6576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6103f383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506104b1565b9050805f5f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550837f34144b541e1d3ee551cb8b0366199f9ef9daed89ced6993d34ab406f76a42f2c82604051610473919061069e565b60405180910390a250505050565b606060405190506001823b0364ffffffffff16602181015f601f8401853c80825260408201810160405250919050565b5f81518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584015ff09150816104ec5763301164255f526004601cfd5b80835250919050565b5f5ffd5b5f5ffd5b5f819050919050565b61050f816104fd565b8114610519575f5ffd5b50565b5f8135905061052a81610506565b92915050565b5f60208284031215610545576105446104f5565b5b5f6105528482850161051c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61059d8261055b565b6105a78185610565565b93506105b7818560208601610575565b6105c081610583565b840191505092915050565b5f6020820190508181035f8301526105e38184610593565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61062d610628610623846105eb565b61060a565b6105eb565b9050919050565b5f61063e82610613565b9050919050565b5f61064f82610634565b9050919050565b61065f81610645565b82525050565b5f6020820190506106785f830184610656565b92915050565b5f610688826105eb565b9050919050565b6106988161067e565b82525050565b5f6020820190506106b15f83018461068f565b92915050565b5f8115159050919050565b6106cb816106b7565b82525050565b5f6020820190506106e45f8301846106c2565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261070b5761070a6106ea565b5b8235905067ffffffffffffffff811115610728576107276106ee565b5b602083019150836001820283011115610744576107436106f2565b5b9250929050565b5f5f5f60408486031215610762576107616104f5565b5b5f61076f8682870161051c565b935050602084013567ffffffffffffffff8111156107905761078f6104f9565b5b61079c868287016106f6565b92509250509250925092565b6107b1816104fd565b82525050565b5f6020820190506107ca5f8301846107a8565b92915050565b6107d98161067e565b81146107e3575f5ffd5b50565b5f815190506107f4816107d0565b92915050565b5f6020828403121561080f5761080e6104f5565b5b5f61081c848285016107e6565b9150509291505056fea2646970667358221220843ad0226f5d09a30f590055f4445607807f9110287483f8a5aebc5aecfa16dc64736f6c634300081e0033

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

000000000000000000000000b33d806a94b6770c9d309e0842a75f8e6edcd5a6

-----Decoded View---------------
Arg [0] : _fundingWorks (address): 0xb33d806a94B6770C9d309E0842a75f8E6edCd5A6

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


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.