Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 19 from a total of 19 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Permit Transfer ... | 21443787 | 30 days ago | IN | 0 ETH | 0.0026582 | ||||
Permit Transfer ... | 21443786 | 30 days ago | IN | 0 ETH | 0.00416501 | ||||
Permit Transfer ... | 21443766 | 30 days ago | IN | 0 ETH | 0.00507291 | ||||
Permit Transfer ... | 21443758 | 30 days ago | IN | 0 ETH | 0.00472037 | ||||
Permit Transfer ... | 21443743 | 30 days ago | IN | 0 ETH | 0.00380725 | ||||
Permit Transfer ... | 21443677 | 30 days ago | IN | 0 ETH | 0.00493825 | ||||
Permit Transfer ... | 21436472 | 31 days ago | IN | 0 ETH | 0.00087242 | ||||
Permit Transfer ... | 21436467 | 31 days ago | IN | 0 ETH | 0.00135763 | ||||
Permit Transfer ... | 21436462 | 31 days ago | IN | 0 ETH | 0.00115032 | ||||
Permit Transfer ... | 21436460 | 31 days ago | IN | 0 ETH | 0.00108429 | ||||
Permit Transfer ... | 21436458 | 31 days ago | IN | 0 ETH | 0.00085001 | ||||
Permit Transfer ... | 21436457 | 31 days ago | IN | 0 ETH | 0.00136922 | ||||
Permit Transfer ... | 21436456 | 31 days ago | IN | 0 ETH | 0.00138251 | ||||
Permit Transfer ... | 21436452 | 31 days ago | IN | 0 ETH | 0.00126293 | ||||
Permit Transfer ... | 21436451 | 31 days ago | IN | 0 ETH | 0.00098362 | ||||
Permit Transfer ... | 21428363 | 32 days ago | IN | 0 ETH | 0.00097043 | ||||
Permit Transfer ... | 21386021 | 38 days ago | IN | 0 ETH | 0.00218559 | ||||
Permit Transfer ... | 21342416 | 44 days ago | IN | 0 ETH | 0.00167985 | ||||
Permit Transfer ... | 21265651 | 54 days ago | IN | 0 ETH | 0.00341733 |
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
Contract Source Code (Solidity Standard Json-Input format)
// 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 } } }
/** * 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); }
// 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)); } }
// 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; }
// 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)); } }
// 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); }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60c0604052348015600f57600080fd5b504660a0818152604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a828401526060820194909452306080808301919091528251808303909101815292019052805191012060805260805160a051610f106100b6600039600061021c015260006102c20152610f106000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80634fe02b44116100665780634fe02b441461011c5780639444b48d146101445780639a157e6a1461016f5780639f09829314610182578063fddc23a61461019557600080fd5b80630ee60fa7146100a3578063137c29fe146100cb57806330f28b7a146100e05780633644e515146100f35780633ff9dcb114610109575b600080fd5b6100b66100b1366004610a50565b6101a8565b60405190151581526020015b60405180910390f35b6100de6100d9366004610b8d565b6101df565b005b6100de6100ee366004610c3d565b610202565b6100fb610218565b6040519081526020016100c2565b6100de610117366004610cb6565b6102e4565b6100fb61012a366004610a50565b600060208181529281526040808220909352908152205481565b6100fb610152366004610a50565b600160209081526000928352604080842090915290825290205481565b6100fb61017d366004610a50565b61033d565b6100fb610190366004610cd8565b610366565b6100b66101a3366004610a50565b6103bd565b6001600160a01b038216600090815260208181526040808320600885901c8452909152902054600160ff83161b1615155b92915050565b6101f88888886101f1838a8a8a6103fe565b86866104b1565b5050505050505050565b6102118585856101f1896105b2565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146102bf5750604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a82840152466060830152306080808401919091528351808403909101815260a0909201909252805191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526020818152604080832086845282529182902080548517905581518581529081018490527f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d910160405180910390a25050565b60005b61034a83836103bd565b610360578161035881610d2d565b925050610340565b50919050565b60006103768383604001356101a8565b15610383575060006101d9565b6001600160a01b03831660009081526001602090815260408083208582013584528252909120546103b691840135610d46565b90506101d9565b60006103c983836101a8565b1580156103f757506001600160a01b0383166000908152600160209081526040808320858452909152902054155b9392505050565b6000806040518060a0016040528060648152602001610e7760649139848460405160200161042e93929190610d59565b60405160208183030381529060405280519060200120905060006104558760000151610635565b6020808901516040808b01518151938401879052908301849052336060840152608083019190915260a082015260c0810188905290915060e0016040516020818303038152906040528051906020012092505050949350505050565b60408601516020860135904211156104ed57866040015160405163cd21db4f60e01b81526004016104e491815260200190565b60405180910390fd5b610505858860200151838a60000151602001516106a6565b61051b610511856107e8565b8490849088610817565b8651516001600160a01b03166323b872dd8661053a60208a018a610d97565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064016020604051808303816000875af115801561058e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610db2565b6000806105c28360000151610635565b60208085015160408087015181517f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d8010694810194909452908301849052336060840152608083019190915260a082015290915060c00160405160208183030381529060405280519060200120915050919050565b60007f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a18260405160200161068992919091825280516001600160a01b03166020808401919091520151604082015260600190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038416600090815260208181526040808320600887901c80855292529091205460ff8516906001821b90818116156106f857604051633ab3447f60e11b815260040160405180910390fd5b6001600160a01b03881660009081526001602090815260408083208a8452909152902054856107278883610dd4565b11156107465760405163447f595960e11b815260040160405180910390fd5b856107518883610dd4565b101561078a576107618782610dd4565b6001600160a01b038a1660009081526001602090815260408083208c84529091529020556107dd565b80156107b5576001600160a01b03891660009081526001602090815260408083208b84529091528120555b6001600160a01b03891660009081526020818152604080832088845290915290208054841790555b505050505050505050565b60006107f2610218565b60405161190160f01b6020820152602281019190915260428101839052606201610689565b6000806000836001600160a01b03163b60000361098457604186900361086c5761084386880188610cb6565b90935091508686604081811061085b5761085b610de7565b919091013560f81c91506108c49050565b60408690036108ab57600061088387890189610cb6565b9094506001600160ff1b038116935090506108a360ff82901c601b610dfd565b9150506108c4565b604051634be6321b60e01b815260040160405180910390fd5b6040805160008082526020820180845288905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661094c57604051638baa579f60e01b815260040160405180910390fd5b846001600160a01b0316816001600160a01b03161461097e57604051632057875960e21b815260040160405180910390fd5b50610a2b565b604051630b135d3f60e11b81526000906001600160a01b03861690631626ba7e906109b79089908c908c90600401610e16565b602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190610e4c565b90506001600160e01b03198116630b135d3f60e11b146101f857604051632c19a72f60e21b815260040160405180910390fd5b50505050505050565b80356001600160a01b0381168114610a4b57600080fd5b919050565b60008060408385031215610a6357600080fd5b610a6c83610a34565b946020939093013593505050565b60008183036080811215610a8d57600080fd5b6040516060810167ffffffffffffffff8282108183111715610abf57634e487b7160e01b600052604160045260246000fd5b8294506040841215610ad057600080fd5b60a0830193508184108185111715610af857634e487b7160e01b600052604160045260246000fd5b5082604052610b0685610a34565b815260208501356080830152808252506040840135602082015260608401356040820152505092915050565b60006040828403121561036057600080fd5b60008083601f840112610b5657600080fd5b50813567ffffffffffffffff811115610b6e57600080fd5b602083019150836020828501011115610b8657600080fd5b9250929050565b600080600080600080600080610140898b031215610baa57600080fd5b610bb48a8a610a7a565b9750610bc38a60808b01610b32565b9650610bd160c08a01610a34565b955060e0890135945061010089013567ffffffffffffffff80821115610bf657600080fd5b610c028c838d01610b44565b90965094506101208b0135915080821115610c1c57600080fd5b50610c298b828c01610b44565b999c989b5096995094979396929594505050565b60008060008060006101008688031215610c5657600080fd5b610c608787610a7a565b9450610c6f8760808801610b32565b9350610c7d60c08701610a34565b925060e086013567ffffffffffffffff811115610c9957600080fd5b610ca588828901610b44565b969995985093965092949392505050565b60008060408385031215610cc957600080fd5b50508035926020909101359150565b60008082840360a0811215610cec57600080fd5b610cf584610a34565b92506080601f1982011215610d0957600080fd5b506020830190509250929050565b634e487b7160e01b600052601160045260246000fd5b600060018201610d3f57610d3f610d17565b5060010190565b818103818111156101d9576101d9610d17565b6000845160005b81811015610d7a5760208188018101518583015201610d60565b506000908301908152838582376000930192835250909392505050565b600060208284031215610da957600080fd5b6103f782610a34565b600060208284031215610dc457600080fd5b815180151581146103f757600080fd5b808201808211156101d9576101d9610d17565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156101d9576101d9610d17565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b600060208284031215610e5e57600080fd5b81516001600160e01b0319811681146103f757600080fdfe5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5065726d697373696f6e73207065726d69747465642c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c696e652ca2646970667358221220e08ce343863a89ea8c5e3c98a2bf7508b66dcf40ccecb0955fc26233019edefa64736f6c63430008190033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80634fe02b44116100665780634fe02b441461011c5780639444b48d146101445780639a157e6a1461016f5780639f09829314610182578063fddc23a61461019557600080fd5b80630ee60fa7146100a3578063137c29fe146100cb57806330f28b7a146100e05780633644e515146100f35780633ff9dcb114610109575b600080fd5b6100b66100b1366004610a50565b6101a8565b60405190151581526020015b60405180910390f35b6100de6100d9366004610b8d565b6101df565b005b6100de6100ee366004610c3d565b610202565b6100fb610218565b6040519081526020016100c2565b6100de610117366004610cb6565b6102e4565b6100fb61012a366004610a50565b600060208181529281526040808220909352908152205481565b6100fb610152366004610a50565b600160209081526000928352604080842090915290825290205481565b6100fb61017d366004610a50565b61033d565b6100fb610190366004610cd8565b610366565b6100b66101a3366004610a50565b6103bd565b6001600160a01b038216600090815260208181526040808320600885901c8452909152902054600160ff83161b1615155b92915050565b6101f88888886101f1838a8a8a6103fe565b86866104b1565b5050505050505050565b6102118585856101f1896105b2565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146102bf5750604080517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666020808301919091527f9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a82840152466060830152306080808401919091528351808403909101815260a0909201909252805191012090565b507ff94aa283651a46e088780f55b244d5662efc281f8e93fcfafa024503dd138c9e90565b3360008181526020818152604080832086845282529182902080548517905581518581529081018490527f3704902f963766a4e561bbaab6e6cdc1b1dd12f6e9e99648da8843b3f46b918d910160405180910390a25050565b60005b61034a83836103bd565b610360578161035881610d2d565b925050610340565b50919050565b60006103768383604001356101a8565b15610383575060006101d9565b6001600160a01b03831660009081526001602090815260408083208582013584528252909120546103b691840135610d46565b90506101d9565b60006103c983836101a8565b1580156103f757506001600160a01b0383166000908152600160209081526040808320858452909152902054155b9392505050565b6000806040518060a0016040528060648152602001610e7760649139848460405160200161042e93929190610d59565b60405160208183030381529060405280519060200120905060006104558760000151610635565b6020808901516040808b01518151938401879052908301849052336060840152608083019190915260a082015260c0810188905290915060e0016040516020818303038152906040528051906020012092505050949350505050565b60408601516020860135904211156104ed57866040015160405163cd21db4f60e01b81526004016104e491815260200190565b60405180910390fd5b610505858860200151838a60000151602001516106a6565b61051b610511856107e8565b8490849088610817565b8651516001600160a01b03166323b872dd8661053a60208a018a610d97565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064016020604051808303816000875af115801561058e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f89190610db2565b6000806105c28360000151610635565b60208085015160408087015181517f939c21a48a8dbe3a9a2404a1d46691e4d39f6583d6ec6b35714604c986d8010694810194909452908301849052336060840152608083019190915260a082015290915060c00160405160208183030381529060405280519060200120915050919050565b60007f618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a18260405160200161068992919091825280516001600160a01b03166020808401919091520151604082015260600190565b604051602081830303815290604052805190602001209050919050565b6001600160a01b038416600090815260208181526040808320600887901c80855292529091205460ff8516906001821b90818116156106f857604051633ab3447f60e11b815260040160405180910390fd5b6001600160a01b03881660009081526001602090815260408083208a8452909152902054856107278883610dd4565b11156107465760405163447f595960e11b815260040160405180910390fd5b856107518883610dd4565b101561078a576107618782610dd4565b6001600160a01b038a1660009081526001602090815260408083208c84529091529020556107dd565b80156107b5576001600160a01b03891660009081526001602090815260408083208b84529091528120555b6001600160a01b03891660009081526020818152604080832088845290915290208054841790555b505050505050505050565b60006107f2610218565b60405161190160f01b6020820152602281019190915260428101839052606201610689565b6000806000836001600160a01b03163b60000361098457604186900361086c5761084386880188610cb6565b90935091508686604081811061085b5761085b610de7565b919091013560f81c91506108c49050565b60408690036108ab57600061088387890189610cb6565b9094506001600160ff1b038116935090506108a360ff82901c601b610dfd565b9150506108c4565b604051634be6321b60e01b815260040160405180910390fd5b6040805160008082526020820180845288905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661094c57604051638baa579f60e01b815260040160405180910390fd5b846001600160a01b0316816001600160a01b03161461097e57604051632057875960e21b815260040160405180910390fd5b50610a2b565b604051630b135d3f60e11b81526000906001600160a01b03861690631626ba7e906109b79089908c908c90600401610e16565b602060405180830381865afa1580156109d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f89190610e4c565b90506001600160e01b03198116630b135d3f60e11b146101f857604051632c19a72f60e21b815260040160405180910390fd5b50505050505050565b80356001600160a01b0381168114610a4b57600080fd5b919050565b60008060408385031215610a6357600080fd5b610a6c83610a34565b946020939093013593505050565b60008183036080811215610a8d57600080fd5b6040516060810167ffffffffffffffff8282108183111715610abf57634e487b7160e01b600052604160045260246000fd5b8294506040841215610ad057600080fd5b60a0830193508184108185111715610af857634e487b7160e01b600052604160045260246000fd5b5082604052610b0685610a34565b815260208501356080830152808252506040840135602082015260608401356040820152505092915050565b60006040828403121561036057600080fd5b60008083601f840112610b5657600080fd5b50813567ffffffffffffffff811115610b6e57600080fd5b602083019150836020828501011115610b8657600080fd5b9250929050565b600080600080600080600080610140898b031215610baa57600080fd5b610bb48a8a610a7a565b9750610bc38a60808b01610b32565b9650610bd160c08a01610a34565b955060e0890135945061010089013567ffffffffffffffff80821115610bf657600080fd5b610c028c838d01610b44565b90965094506101208b0135915080821115610c1c57600080fd5b50610c298b828c01610b44565b999c989b5096995094979396929594505050565b60008060008060006101008688031215610c5657600080fd5b610c608787610a7a565b9450610c6f8760808801610b32565b9350610c7d60c08701610a34565b925060e086013567ffffffffffffffff811115610c9957600080fd5b610ca588828901610b44565b969995985093965092949392505050565b60008060408385031215610cc957600080fd5b50508035926020909101359150565b60008082840360a0811215610cec57600080fd5b610cf584610a34565b92506080601f1982011215610d0957600080fd5b506020830190509250929050565b634e487b7160e01b600052601160045260246000fd5b600060018201610d3f57610d3f610d17565b5060010190565b818103818111156101d9576101d9610d17565b6000845160005b81811015610d7a5760208188018101518583015201610d60565b506000908301908152838582376000930192835250909392505050565b600060208284031215610da957600080fd5b6103f782610a34565b600060208284031215610dc457600080fd5b815180151581146103f757600080fd5b808201808211156101d9576101d9610d17565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156101d9576101d9610d17565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b600060208284031215610e5e57600080fd5b81516001600160e01b0319811681146103f757600080fdfe5065726d69745769746e6573735472616e7366657246726f6d28546f6b656e5065726d697373696f6e73207065726d69747465642c61646472657373207370656e6465722c75696e74323536206e6f6e63652c75696e7432353620646561646c696e652ca2646970667358221220e08ce343863a89ea8c5e3c98a2bf7508b66dcf40ccecb0955fc26233019edefa64736f6c63430008190033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.