ETH Price: $3,199.09 (-3.69%)

Contract

0x03BB3011C4daa20C466A0a3c17aa5C7CA2e339B6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Permit Transfer ...214437872024-12-20 12:39:1130 days ago1734698351IN
0x03BB3011...CA2e339B6
0 ETH0.002658249.80434247
Permit Transfer ...214437862024-12-20 12:38:5930 days ago1734698339IN
0x03BB3011...CA2e339B6
0 ETH0.0041650144.27708031
Permit Transfer ...214437662024-12-20 12:34:5930 days ago1734698099IN
0x03BB3011...CA2e339B6
0 ETH0.0050729153.92187656
Permit Transfer ...214437582024-12-20 12:33:2330 days ago1734698003IN
0x03BB3011...CA2e339B6
0 ETH0.0047203750.16820519
Permit Transfer ...214437432024-12-20 12:30:2330 days ago1734697823IN
0x03BB3011...CA2e339B6
0 ETH0.0038072552.72399872
Permit Transfer ...214436772024-12-20 12:17:1130 days ago1734697031IN
0x03BB3011...CA2e339B6
0 ETH0.0049382552.48382886
Permit Transfer ...214364722024-12-19 12:09:2331 days ago1734610163IN
0x03BB3011...CA2e339B6
0 ETH0.0008724214.56975086
Permit Transfer ...214364672024-12-19 12:08:2331 days ago1734610103IN
0x03BB3011...CA2e339B6
0 ETH0.0013576314.43076811
Permit Transfer ...214364622024-12-19 12:07:2331 days ago1734610043IN
0x03BB3011...CA2e339B6
0 ETH0.0011503214.94568844
Permit Transfer ...214364602024-12-19 12:06:5931 days ago1734610019IN
0x03BB3011...CA2e339B6
0 ETH0.0010842915.01570664
Permit Transfer ...214364582024-12-19 12:06:3531 days ago1734609995IN
0x03BB3011...CA2e339B6
0 ETH0.0008500114.19261911
Permit Transfer ...214364572024-12-19 12:06:2331 days ago1734609983IN
0x03BB3011...CA2e339B6
0 ETH0.0013692214.55403106
Permit Transfer ...214364562024-12-19 12:06:1131 days ago1734609971IN
0x03BB3011...CA2e339B6
0 ETH0.0013825114.69336292
Permit Transfer ...214364522024-12-19 12:05:2331 days ago1734609923IN
0x03BB3011...CA2e339B6
0 ETH0.0012629314.14595599
Permit Transfer ...214364512024-12-19 12:05:1131 days ago1734609911IN
0x03BB3011...CA2e339B6
0 ETH0.0009836213.61924353
Permit Transfer ...214283632024-12-18 8:56:1132 days ago1734512171IN
0x03BB3011...CA2e339B6
0 ETH0.0009704310.31251893
Permit Transfer ...213860212024-12-12 11:07:1138 days ago1734001631IN
0x03BB3011...CA2e339B6
0 ETH0.0021855923.23147556
Permit Transfer ...213424162024-12-06 8:59:1144 days ago1733475551IN
0x03BB3011...CA2e339B6
0 ETH0.0016798521.81315697
Permit Transfer ...212656512024-11-25 15:25:2354 days ago1732548323IN
0x03BB3011...CA2e339B6
0 ETH0.0034173336.32415079

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SignatureTransfer

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license
File 1 of 6 : SignatureTransfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * Copied from github.com/Uniswap/permit2/blob/main/src/SignatureTransfer.sol and modified.
 */
import {ISignatureTransfer} from "./ISignatureTransfer.sol";
import {IERC20} from "../ERC20/IERC20.sol";
import {SignatureVerification} from "./SignatureVerification.sol";
import {PermitHash} from "./PermitHash.sol";
import {EIP712} from "./EIP712.sol";

contract SignatureTransfer is ISignatureTransfer, EIP712 {

    using SignatureVerification for bytes;
    using PermitHash for PermitTransferFrom;

    /// @inheritdoc ISignatureTransfer
    mapping(address => mapping(uint256 => uint256)) public nonceBitmap;
    mapping(address => mapping(uint256 => uint256)) public partialFills;

    /// @notice Thrown when validating an inputted signature that is stale
    /// @param signatureDeadline The timestamp at which a signature is no longer valid
    error SignatureExpired(uint256 signatureDeadline);

    /// @notice Thrown when validating that the inputted nonce has not been used
    error InvalidNonce();

    error OverFilled();

    function permitTransferFrom(PermitTransferFrom memory permit, SignatureTransferDetails calldata transferDetails, address owner, bytes calldata signature) external {
        _permitTransferFrom(permit, transferDetails, owner, permit.hash(), signature);
    }

    /// @inheritdoc ISignatureTransfer
    function permitWitnessTransferFrom(
        PermitTransferFrom memory permit,
        SignatureTransferDetails calldata transferDetails,
        address owner,
        bytes32 witness,
        string calldata witnessTypeString,
        bytes calldata signature
    ) external {
        _permitTransferFrom(permit, transferDetails, owner, permit.hashWithWitness(witness, witnessTypeString), signature);
    }

    /**
     * Find a nonce that looks free given the data on the blockchain.
     * Of course, this method cannot take into account nonces of valid but unused permits.
     */
    function findFreeNonce(address owner, uint256 start) public view returns (uint256){
        while (!isFreeNonce(owner, start)){
            start++;
        }
        return start;
    }

    function isFreeNonce(address owner, uint256 nonce) public view returns (bool){
        return !isUsedNonce(owner, nonce) && partialFills[owner][nonce] == 0;
    }

    function isUsedNonce(address owner, uint256 nonce) public view returns (bool) {
        (uint256 wordPos, uint256 bitPos) = bitmapPositions(nonce);
        uint256 bit = 1 << bitPos;
        return nonceBitmap[owner][wordPos] & bit != 0;
    }

    function getPermittedAmount(address owner, PermitTransferFrom calldata permit) public view returns (uint256) {
        if (isUsedNonce(owner, permit.nonce)) {
            return 0;
        } else {
            return permit.permitted.amount - partialFills[owner][permit.nonce];
        }
    }

    /// @notice Transfers a token using a signed permit message.
    /// @param permit The permit data signed over by the owner
    /// @param dataHash The EIP-712 hash of permit data to include when checking signature
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails The spender's requested transfer details for the permitted token
    /// @param signature The signature to verify
    function _permitTransferFrom(PermitTransferFrom memory permit, SignatureTransferDetails calldata transferDetails, address owner, bytes32 dataHash, bytes calldata signature) private {
        uint256 requestedAmount = transferDetails.requestedAmount;

        if (block.timestamp > permit.deadline) revert SignatureExpired(permit.deadline);

        _useUnorderedNonce(owner, permit.nonce, requestedAmount, permit.permitted.amount);

        signature.verify(_hashTypedData(dataHash), owner);

        IERC20(permit.permitted.token).transferFrom(owner, transferDetails.to, requestedAmount);
    }

    /// @inheritdoc ISignatureTransfer
    function invalidateUnorderedNonces(uint256 wordPos, uint256 mask) external {
        nonceBitmap[msg.sender][wordPos] |= mask;

        emit UnorderedNonceInvalidation(msg.sender, wordPos, mask);
    }

    /// @notice Returns the index of the bitmap and the bit position within the bitmap. Used for unordered nonces
    /// @param nonce The nonce to get the associated word and bit positions
    /// @return wordPos The word position or index into the nonceBitmap
    /// @return bitPos The bit position
    /// @dev The first 248 bits of the nonce value is the index of the desired bitmap
    /// @dev The last 8 bits of the nonce value is the position of the bit in the bitmap
    function bitmapPositions(uint256 nonce) private pure returns (uint256 wordPos, uint256 bitPos) {
        wordPos = uint248(nonce >> 8);
        bitPos = uint8(nonce);
    }

    /// @notice Checks whether a nonce is taken and sets the bit at the bit position in the bitmap at the word position
    /// @dev This function is used to manage nonces for transactions, ensuring that each nonce is used only once and tracking partial fills of orders.
    /// @param from The address to use the nonce at
    /// @param nonce The nonce to spend
    /// @param amount The amount being filled in the current transaction.
    /// @param max The maximum allowable fill amount for the nonce.
    function _useUnorderedNonce(address from, uint256 nonce, uint256 amount, uint256 max) internal {
        (uint256 wordPos, uint256 bitPos) = bitmapPositions(nonce);
        uint256 bit = 1 << bitPos;
        uint256 state = nonceBitmap[from][wordPos];
        if (state & bit != 0) revert InvalidNonce();

        uint256 alreadyFilled = partialFills[from][nonce];
        if (alreadyFilled + amount > max) revert OverFilled();
        if (alreadyFilled + amount < max){
            partialFills[from][nonce] = alreadyFilled + amount;
        } else {
            if (alreadyFilled > 0) delete partialFills[from][nonce]; // get some gas back 
            nonceBitmap[from][wordPos] |= bit; // flag done
        }
    }
}

File 2 of 6 : IERC20.sol
/**
* SPDX-License-Identifier: MIT
*
* Copyright (c) 2016-2019 zOS Global Limited
*
*/
pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */

interface IERC20 {

    // Optional functions
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through `transferFrom`. This is
     * zero by default.
     *
     * This value changes when `approve` or `transferFrom` are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * > Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an `Approval` event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

}

File 3 of 6 : EIP712.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * Copied from github.com/Uniswap/permit2/blob/main/src/SignatureTransfer.sol and modified.
 */

/// @notice EIP712 helpers for permit2
/// @dev Maintains cross-chain replay protection in the event of a fork
/// @dev Reference: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/EIP712.sol
contract EIP712 {
    // Cache the domain separator as an immutable value, but also store the chain id that it
    // corresponds to, in order to invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private constant _HASHED_NAME = keccak256("Permit2"); // TODO: what name should we use here?
    bytes32 private constant _TYPE_HASH =
        keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    constructor() {
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME);
    }

    /// @notice Returns the domain separator for the current chain.
    /// @dev Uses cached version if chainid and address are unchanged from construction.
    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        return block.chainid == _CACHED_CHAIN_ID
            ? _CACHED_DOMAIN_SEPARATOR
            : _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME);
    }

    /// @notice Builds a domain separator using the current chainId and contract address.
    function _buildDomainSeparator(bytes32 typeHash, bytes32 nameHash) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, block.chainid, address(this)));
    }

    /// @notice Creates an EIP-712 typed data hash
    function _hashTypedData(bytes32 dataHash) internal view returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), dataHash));
    }
}

File 4 of 6 : ISignatureTransfer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title SignatureTransfer
/// @notice Handles ERC20 token transfers through signature based actions
/// @dev Requires user's token approval on the Permit2 contract
interface ISignatureTransfer {
    /// @notice Thrown when the requested amount for a transfer is larger than the permissioned amount
    /// @param maxAmount The maximum amount a spender can request to transfer
    error InvalidAmount(uint256 maxAmount);

    /// @notice Thrown when the number of tokens permissioned to a spender does not match the number of tokens being transferred
    /// @dev If the spender does not need to transfer the number of tokens permitted, the spender can request amount 0 to be transferred
    error LengthMismatch();

    /// @notice Emits an event when the owner successfully invalidates an unordered nonce.
    event UnorderedNonceInvalidation(address indexed owner, uint256 word, uint256 mask);

    /// @notice The token and amount details for a transfer signed in the permit transfer signature
    struct TokenPermissions {
        // ERC20 token address
        address token;
        // the maximum amount that can be spent
        uint256 amount;
    }

    /// @notice The signed permit message for a single token transfer
    struct PermitTransferFrom {
        TokenPermissions permitted;
        // a unique value for every token owner's signature to prevent signature replays
        uint256 nonce;
        // deadline on the permit signature
        uint256 deadline;
    }

    /// @notice Specifies the recipient address and amount for batched transfers.
    /// @dev Recipients and amounts correspond to the index of the signed token permissions array.
    /// @dev Reverts if the requested amount is greater than the permitted signed amount.
    struct SignatureTransferDetails {
        // recipient address
        address to;
        // spender requested amount
        uint256 requestedAmount;
    }

    /// @notice A map from token owner address and a caller specified word index to a bitmap. Used to set bits in the bitmap to prevent against signature replay protection
    /// @dev Uses unordered nonces so that permit messages do not need to be spent in a certain order
    /// @dev The mapping is indexed first by the token owner, then by an index specified in the nonce
    /// @dev It returns a uint256 bitmap
    /// @dev The index, or wordPosition is capped at type(uint248).max
    function nonceBitmap(address, uint256) external view returns (uint256);

    /// @notice Transfers a token using a signed permit message
    /// @dev Reverts if the requested amount is greater than the permitted signed amount
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails The spender's requested transfer details for the permitted token
    /// @param signature The signature to verify
    function permitTransferFrom(
        PermitTransferFrom memory permit,
        SignatureTransferDetails calldata transferDetails,
        address owner,
        bytes calldata signature
    ) external;

    /// @notice Transfers a token using a signed permit message
    /// @notice Includes extra data provided by the caller to verify signature over
    /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition
    /// @dev Reverts if the requested amount is greater than the permitted signed amount
    /// @param permit The permit data signed over by the owner
    /// @param owner The owner of the tokens to transfer
    /// @param transferDetails The spender's requested transfer details for the permitted token
    /// @param witness Extra data to include when checking the user signature
    /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash
    /// @param signature The signature to verify
    function permitWitnessTransferFrom(
        PermitTransferFrom memory permit,
        SignatureTransferDetails calldata transferDetails,
        address owner,
        bytes32 witness,
        string calldata witnessTypeString,
        bytes calldata signature
    ) external;


    /// @notice Invalidates the bits specified in mask for the bitmap at the word position
    /// @dev The wordPos is maxed at type(uint248).max
    /// @param wordPos A number to index the nonceBitmap at
    /// @param mask A bitmap masked against msg.sender's current bitmap at the word position
    function invalidateUnorderedNonces(uint256 wordPos, uint256 mask) external;
}

File 5 of 6 : PermitHash.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * Copied from github.com/Uniswap/permit2/blob/main/src/SignatureTransfer.sol and modified.
 */
import {ISignatureTransfer} from "./ISignatureTransfer.sol";

library PermitHash {
    bytes32 public constant _TOKEN_PERMISSIONS_TYPEHASH = keccak256("TokenPermissions(address token,uint256 amount)");

    bytes32 public constant _PERMIT_TRANSFER_FROM_TYPEHASH = keccak256(
        "PermitTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline)TokenPermissions(address token,uint256 amount)"
    );

    string public constant _TOKEN_PERMISSIONS_TYPESTRING = "TokenPermissions(address token,uint256 amount)";

    string public constant _PERMIT_TRANSFER_FROM_WITNESS_TYPEHASH_STUB =
        "PermitWitnessTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline,";

    function hash(ISignatureTransfer.PermitTransferFrom memory permit) internal view returns (bytes32) {
        bytes32 tokenPermissionsHash = _hashTokenPermissions(permit.permitted);
        return keccak256(
            abi.encode(_PERMIT_TRANSFER_FROM_TYPEHASH, tokenPermissionsHash, msg.sender, permit.nonce, permit.deadline)
        );
    }

    function hashWithWitness(
        ISignatureTransfer.PermitTransferFrom memory permit,
        bytes32 witness,
        string calldata witnessTypeString
    ) internal view returns (bytes32) {
        bytes32 typeHash = keccak256(abi.encodePacked(_PERMIT_TRANSFER_FROM_WITNESS_TYPEHASH_STUB, witnessTypeString));

        bytes32 tokenPermissionsHash = _hashTokenPermissions(permit.permitted);
        return keccak256(abi.encode(typeHash, tokenPermissionsHash, msg.sender, permit.nonce, permit.deadline, witness));
    }

    function _hashTokenPermissions(ISignatureTransfer.TokenPermissions memory permitted)
        private
        pure
        returns (bytes32)
    {
        return keccak256(abi.encode(_TOKEN_PERMISSIONS_TYPEHASH, permitted));
    }
}

File 6 of 6 : SignatureVerification.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * Copied from github.com/Uniswap/permit2/blob/main/src/SignatureTransfer.sol and modified.
 */
library SignatureVerification {
    /// @notice Thrown when the passed in signature is not a valid length
    error InvalidSignatureLength();

    /// @notice Thrown when the recovered signer is equal to the zero address
    error InvalidSignature();

    /// @notice Thrown when the recovered signer does not equal the claimedSigner
    error InvalidSigner();

    /// @notice Thrown when the recovered contract signature is incorrect
    error InvalidContractSignature();

    bytes32 constant UPPER_BIT_MASK = (0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);

    function verify(bytes calldata signature, bytes32 hash, address claimedSigner) internal view {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (claimedSigner.code.length == 0) {
            if (signature.length == 65) {
                (r, s) = abi.decode(signature, (bytes32, bytes32));
                v = uint8(signature[64]);
            } else if (signature.length == 64) {
                // EIP-2098
                bytes32 vs;
                (r, vs) = abi.decode(signature, (bytes32, bytes32));
                s = vs & UPPER_BIT_MASK;
                v = uint8(uint256(vs >> 255)) + 27;
            } else {
                revert InvalidSignatureLength();
            }
            address signer = ecrecover(hash, v, r, s);
            if (signer == address(0)) revert InvalidSignature();
            if (signer != claimedSigner) revert InvalidSigner();
        } else {
            bytes4 magicValue = IERC1271(claimedSigner).isValidSignature(hash, signature);
            if (magicValue != IERC1271.isValidSignature.selector) revert InvalidContractSignature();
        }
    }
}

interface IERC1271 {
    /// @dev Should return whether the signature provided is valid for the provided data
    /// @param hash      Hash of the data to be signed
    /// @param signature Signature byte array associated with _data
    /// @return magicValue The bytes4 magic value 0x1626ba7e
    function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}

Settings
{
  "evmVersion": "paris",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidContractSignature","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidSignatureLength","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"LengthMismatch","type":"error"},{"inputs":[],"name":"OverFilled","type":"error"},{"inputs":[{"internalType":"uint256","name":"signatureDeadline","type":"uint256"}],"name":"SignatureExpired","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"word","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mask","type":"uint256"}],"name":"UnorderedNonceInvalidation","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"}],"name":"findFreeNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitTransferFrom","name":"permit","type":"tuple"}],"name":"getPermittedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wordPos","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"}],"name":"invalidateUnorderedNonces","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"isFreeNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"isUsedNonce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonceBitmap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"partialFills","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails","name":"transferDetails","type":"tuple"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ISignatureTransfer.TokenPermissions","name":"permitted","type":"tuple"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ISignatureTransfer.PermitTransferFrom","name":"permit","type":"tuple"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"internalType":"struct ISignatureTransfer.SignatureTransferDetails","name":"transferDetails","type":"tuple"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"witness","type":"bytes32"},{"internalType":"string","name":"witnessTypeString","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permitWitnessTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052348015600f57600080fd5b504660a0818152604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a828401526060820194909452306080808301919091528251808303909101815292019052805191012060805260805160a051610f106100b6600039600061021c015260006102c20152610f106000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80634fe02b44116100665780634fe02b441461011c5780639444b48d146101445780639a157e6a1461016f5780639f09829314610182578063fddc23a61461019557600080fd5b80630ee60fa7146100a3578063137c29fe146100cb57806330f28b7a146100e05780633644e515146100f35780633ff9dcb114610109575b600080fd5b6100b66100b1366004610a50565b6101a8565b60405190151581526020015b60405180910390f35b6100de6100d9366004610b8d565b6101df565b005b6100de6100ee366004610c3d565b610202565b6100fb610218565b6040519081526020016100c2565b6100de610117366004610cb6565b6102e4565b6100fb61012a366004610a50565b600060208181529281526040808220909352908152205481565b6100fb610152366004610a50565b600160209081526000928352604080842090915290825290205481565b6100fb61017d366004610a50565b61033d565b6100fb610190366004610cd8565b610366565b6100b66101a3366004610a50565b6103bd565b6001600160a01b038216600090815260208181526040808320600885901c8452909152902054600160ff83161b1615155b92915050565b6101f88888886101f1838a8a8a6103fe565b86866104b1565b5050505050505050565b6102118585856101f1896105b2565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146102bf5750604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a82840152466060830152306080808401919091528351808403909101815260a0909201909252805191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526020818152604080832086845282529182902080548517905581518581529081018490527f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d910160405180910390a25050565b60005b61034a83836103bd565b610360578161035881610d2d565b925050610340565b50919050565b60006103768383604001356101a8565b15610383575060006101d9565b6001600160a01b03831660009081526001602090815260408083208582013584528252909120546103b691840135610d46565b90506101d9565b60006103c983836101a8565b1580156103f757506001600160a01b0383166000908152600160209081526040808320858452909152902054155b9392505050565b6000806040518060a0016040528060648152602001610e7760649139848460405160200161042e93929190610d59565b60405160208183030381529060405280519060200120905060006104558760000151610635565b6020808901516040808b01518151938401879052908301849052336060840152608083019190915260a082015260c0810188905290915060e0016040516020818303038152906040528051906020012092505050949350505050565b60408601516020860135904211156104ed57866040015160405163cd21db4f60e01b81526004016104e491815260200190565b60405180910390fd5b610505858860200151838a60000151602001516106a6565b61051b610511856107e8565b8490849088610817565b8651516001600160a01b03166323b872dd8661053a60208a018a610d97565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064016020604051808303816000875af115801561058e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610db2565b6000806105c28360000151610635565b60208085015160408087015181517f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d8010694810194909452908301849052336060840152608083019190915260a082015290915060c00160405160208183030381529060405280519060200120915050919050565b60007f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a18260405160200161068992919091825280516001600160a01b03166020808401919091520151604082015260600190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038416600090815260208181526040808320600887901c80855292529091205460ff8516906001821b90818116156106f857604051633ab3447f60e11b815260040160405180910390fd5b6001600160a01b03881660009081526001602090815260408083208a8452909152902054856107278883610dd4565b11156107465760405163447f595960e11b815260040160405180910390fd5b856107518883610dd4565b101561078a576107618782610dd4565b6001600160a01b038a1660009081526001602090815260408083208c84529091529020556107dd565b80156107b5576001600160a01b03891660009081526001602090815260408083208b84529091528120555b6001600160a01b03891660009081526020818152604080832088845290915290208054841790555b505050505050505050565b60006107f2610218565b60405161190160f01b6020820152602281019190915260428101839052606201610689565b6000806000836001600160a01b03163b60000361098457604186900361086c5761084386880188610cb6565b90935091508686604081811061085b5761085b610de7565b919091013560f81c91506108c49050565b60408690036108ab57600061088387890189610cb6565b9094506001600160ff1b038116935090506108a360ff82901c601b610dfd565b9150506108c4565b604051634be6321b60e01b815260040160405180910390fd5b6040805160008082526020820180845288905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661094c57604051638baa579f60e01b815260040160405180910390fd5b846001600160a01b0316816001600160a01b03161461097e57604051632057875960e21b815260040160405180910390fd5b50610a2b565b604051630b135d3f60e11b81526000906001600160a01b03861690631626ba7e906109b79089908c908c90600401610e16565b602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190610e4c565b90506001600160e01b03198116630b135d3f60e11b146101f857604051632c19a72f60e21b815260040160405180910390fd5b50505050505050565b80356001600160a01b0381168114610a4b57600080fd5b919050565b60008060408385031215610a6357600080fd5b610a6c83610a34565b946020939093013593505050565b60008183036080811215610a8d57600080fd5b6040516060810167ffffffffffffffff8282108183111715610abf57634e487b7160e01b600052604160045260246000fd5b8294506040841215610ad057600080fd5b60a0830193508184108185111715610af857634e487b7160e01b600052604160045260246000fd5b5082604052610b0685610a34565b815260208501356080830152808252506040840135602082015260608401356040820152505092915050565b60006040828403121561036057600080fd5b60008083601f840112610b5657600080fd5b50813567ffffffffffffffff811115610b6e57600080fd5b602083019150836020828501011115610b8657600080fd5b9250929050565b600080600080600080600080610140898b031215610baa57600080fd5b610bb48a8a610a7a565b9750610bc38a60808b01610b32565b9650610bd160c08a01610a34565b955060e0890135945061010089013567ffffffffffffffff80821115610bf657600080fd5b610c028c838d01610b44565b90965094506101208b0135915080821115610c1c57600080fd5b50610c298b828c01610b44565b999c989b5096995094979396929594505050565b60008060008060006101008688031215610c5657600080fd5b610c608787610a7a565b9450610c6f8760808801610b32565b9350610c7d60c08701610a34565b925060e086013567ffffffffffffffff811115610c9957600080fd5b610ca588828901610b44565b969995985093965092949392505050565b60008060408385031215610cc957600080fd5b50508035926020909101359150565b60008082840360a0811215610cec57600080fd5b610cf584610a34565b92506080601f1982011215610d0957600080fd5b506020830190509250929050565b634e487b7160e01b600052601160045260246000fd5b600060018201610d3f57610d3f610d17565b5060010190565b818103818111156101d9576101d9610d17565b6000845160005b81811015610d7a5760208188018101518583015201610d60565b506000908301908152838582376000930192835250909392505050565b600060208284031215610da957600080fd5b6103f782610a34565b600060208284031215610dc457600080fd5b815180151581146103f757600080fd5b808201808211156101d9576101d9610d17565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156101d9576101d9610d17565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b600060208284031215610e5e57600080fd5b81516001600160e01b0319811681146103f757600080fdfe5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5065726d697373696f6e73207065726d69747465642c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c696e652ca2646970667358221220e08ce343863a89ea8c5e3c98a2bf7508b66dcf40ccecb0955fc26233019edefa64736f6c63430008190033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80634fe02b44116100665780634fe02b441461011c5780639444b48d146101445780639a157e6a1461016f5780639f09829314610182578063fddc23a61461019557600080fd5b80630ee60fa7146100a3578063137c29fe146100cb57806330f28b7a146100e05780633644e515146100f35780633ff9dcb114610109575b600080fd5b6100b66100b1366004610a50565b6101a8565b60405190151581526020015b60405180910390f35b6100de6100d9366004610b8d565b6101df565b005b6100de6100ee366004610c3d565b610202565b6100fb610218565b6040519081526020016100c2565b6100de610117366004610cb6565b6102e4565b6100fb61012a366004610a50565b600060208181529281526040808220909352908152205481565b6100fb610152366004610a50565b600160209081526000928352604080842090915290825290205481565b6100fb61017d366004610a50565b61033d565b6100fb610190366004610cd8565b610366565b6100b66101a3366004610a50565b6103bd565b6001600160a01b038216600090815260208181526040808320600885901c8452909152902054600160ff83161b1615155b92915050565b6101f88888886101f1838a8a8a6103fe565b86866104b1565b5050505050505050565b6102118585856101f1896105b2565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146102bf5750604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a82840152466060830152306080808401919091528351808403909101815260a0909201909252805191012090565b507ff94aa283651a46e088780f55b244d5662efc281f8e93fcfafa024503dd138c9e90565b3360008181526020818152604080832086845282529182902080548517905581518581529081018490527f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d910160405180910390a25050565b60005b61034a83836103bd565b610360578161035881610d2d565b925050610340565b50919050565b60006103768383604001356101a8565b15610383575060006101d9565b6001600160a01b03831660009081526001602090815260408083208582013584528252909120546103b691840135610d46565b90506101d9565b60006103c983836101a8565b1580156103f757506001600160a01b0383166000908152600160209081526040808320858452909152902054155b9392505050565b6000806040518060a0016040528060648152602001610e7760649139848460405160200161042e93929190610d59565b60405160208183030381529060405280519060200120905060006104558760000151610635565b6020808901516040808b01518151938401879052908301849052336060840152608083019190915260a082015260c0810188905290915060e0016040516020818303038152906040528051906020012092505050949350505050565b60408601516020860135904211156104ed57866040015160405163cd21db4f60e01b81526004016104e491815260200190565b60405180910390fd5b610505858860200151838a60000151602001516106a6565b61051b610511856107e8565b8490849088610817565b8651516001600160a01b03166323b872dd8661053a60208a018a610d97565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064016020604051808303816000875af115801561058e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610db2565b6000806105c28360000151610635565b60208085015160408087015181517f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d8010694810194909452908301849052336060840152608083019190915260a082015290915060c00160405160208183030381529060405280519060200120915050919050565b60007f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a18260405160200161068992919091825280516001600160a01b03166020808401919091520151604082015260600190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038416600090815260208181526040808320600887901c80855292529091205460ff8516906001821b90818116156106f857604051633ab3447f60e11b815260040160405180910390fd5b6001600160a01b03881660009081526001602090815260408083208a8452909152902054856107278883610dd4565b11156107465760405163447f595960e11b815260040160405180910390fd5b856107518883610dd4565b101561078a576107618782610dd4565b6001600160a01b038a1660009081526001602090815260408083208c84529091529020556107dd565b80156107b5576001600160a01b03891660009081526001602090815260408083208b84529091528120555b6001600160a01b03891660009081526020818152604080832088845290915290208054841790555b505050505050505050565b60006107f2610218565b60405161190160f01b6020820152602281019190915260428101839052606201610689565b6000806000836001600160a01b03163b60000361098457604186900361086c5761084386880188610cb6565b90935091508686604081811061085b5761085b610de7565b919091013560f81c91506108c49050565b60408690036108ab57600061088387890189610cb6565b9094506001600160ff1b038116935090506108a360ff82901c601b610dfd565b9150506108c4565b604051634be6321b60e01b815260040160405180910390fd5b6040805160008082526020820180845288905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661094c57604051638baa579f60e01b815260040160405180910390fd5b846001600160a01b0316816001600160a01b03161461097e57604051632057875960e21b815260040160405180910390fd5b50610a2b565b604051630b135d3f60e11b81526000906001600160a01b03861690631626ba7e906109b79089908c908c90600401610e16565b602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190610e4c565b90506001600160e01b03198116630b135d3f60e11b146101f857604051632c19a72f60e21b815260040160405180910390fd5b50505050505050565b80356001600160a01b0381168114610a4b57600080fd5b919050565b60008060408385031215610a6357600080fd5b610a6c83610a34565b946020939093013593505050565b60008183036080811215610a8d57600080fd5b6040516060810167ffffffffffffffff8282108183111715610abf57634e487b7160e01b600052604160045260246000fd5b8294506040841215610ad057600080fd5b60a0830193508184108185111715610af857634e487b7160e01b600052604160045260246000fd5b5082604052610b0685610a34565b815260208501356080830152808252506040840135602082015260608401356040820152505092915050565b60006040828403121561036057600080fd5b60008083601f840112610b5657600080fd5b50813567ffffffffffffffff811115610b6e57600080fd5b602083019150836020828501011115610b8657600080fd5b9250929050565b600080600080600080600080610140898b031215610baa57600080fd5b610bb48a8a610a7a565b9750610bc38a60808b01610b32565b9650610bd160c08a01610a34565b955060e0890135945061010089013567ffffffffffffffff80821115610bf657600080fd5b610c028c838d01610b44565b90965094506101208b0135915080821115610c1c57600080fd5b50610c298b828c01610b44565b999c989b5096995094979396929594505050565b60008060008060006101008688031215610c5657600080fd5b610c608787610a7a565b9450610c6f8760808801610b32565b9350610c7d60c08701610a34565b925060e086013567ffffffffffffffff811115610c9957600080fd5b610ca588828901610b44565b969995985093965092949392505050565b60008060408385031215610cc957600080fd5b50508035926020909101359150565b60008082840360a0811215610cec57600080fd5b610cf584610a34565b92506080601f1982011215610d0957600080fd5b506020830190509250929050565b634e487b7160e01b600052601160045260246000fd5b600060018201610d3f57610d3f610d17565b5060010190565b818103818111156101d9576101d9610d17565b6000845160005b81811015610d7a5760208188018101518583015201610d60565b506000908301908152838582376000930192835250909392505050565b600060208284031215610da957600080fd5b6103f782610a34565b600060208284031215610dc457600080fd5b815180151581146103f757600080fd5b808201808211156101d9576101d9610d17565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156101d9576101d9610d17565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b600060208284031215610e5e57600080fd5b81516001600160e01b0319811681146103f757600080fdfe5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5065726d697373696f6e73207065726d69747465642c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c696e652ca2646970667358221220e08ce343863a89ea8c5e3c98a2bf7508b66dcf40ccecb0955fc26233019edefa64736f6c63430008190033

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
Loading...
Loading
[ 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.