{
"abi": [
{
"type": "function",
"name": "DOMAIN_SEPARATOR",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "allowance",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"internalType": "uint48"
},
{
"name": "nonce",
"type": "uint48",
"internalType": "uint48"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "approve",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "invalidateNonces",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "newNonce",
"type": "uint48",
"internalType": "uint48"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "lockdown",
"inputs": [
{
"name": "approvals",
"type": "tuple[]",
"internalType": "struct IAllowanceTransfer.TokenSpenderPair[]",
"components": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "permit",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "permitBatch",
"type": "tuple",
"internalType": "struct IAllowanceTransfer.PermitBatch",
"components": [
{
"name": "details",
"type": "tuple[]",
"internalType": "struct IAllowanceTransfer.PermitDetails[]",
"components": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"internalType": "uint48"
},
{
"name": "nonce",
"type": "uint48",
"internalType": "uint48"
}
]
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "sigDeadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "permit",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "permitSingle",
"type": "tuple",
"internalType": "struct IAllowanceTransfer.PermitSingle",
"components": [
{
"name": "details",
"type": "tuple",
"internalType": "struct IAllowanceTransfer.PermitDetails",
"components": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"internalType": "uint48"
},
{
"name": "nonce",
"type": "uint48",
"internalType": "uint48"
}
]
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "sigDeadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "transferFrom",
"inputs": [
{
"name": "transferDetails",
"type": "tuple[]",
"internalType": "struct IAllowanceTransfer.AllowanceTransferDetails[]",
"components": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "transferFrom",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"internalType": "uint160"
},
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "event",
"name": "Approval",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"indexed": false,
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
}
],
"anonymous": false
},
{
"type": "event",
"name": "Lockdown",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"type": "event",
"name": "NonceInvalidation",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newNonce",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
},
{
"name": "oldNonce",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
}
],
"anonymous": false
},
{
"type": "event",
"name": "Permit",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint160",
"indexed": false,
"internalType": "uint160"
},
{
"name": "expiration",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
},
{
"name": "nonce",
"type": "uint48",
"indexed": false,
"internalType": "uint48"
}
],
"anonymous": false
},
{
"type": "error",
"name": "AllowanceExpired",
"inputs": [
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"type": "error",
"name": "ExcessiveInvalidation",
"inputs": []
},
{
"type": "error",
"name": "InsufficientAllowance",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
]
}
],
"bytecode": {
"object": "0x",
"sourceMap": "",
"linkReferences": {}
},
"deployedBytecode": {
"object": "0x",
"sourceMap": "",
"linkReferences": {}
},
"methodIdentifiers": {
"DOMAIN_SEPARATOR()": "3644e515",
"allowance(address,address,address)": "927da105",
"approve(address,address,uint160,uint48)": "87517c45",
"invalidateNonces(address,address,uint48)": "65d9723c",
"lockdown((address,address)[])": "cc53287f",
"permit(address,((address,uint160,uint48,uint48),address,uint256),bytes)": "2b67b570",
"permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes)": "2a2d80d1",
"transferFrom((address,address,uint160,address)[])": "0d58b1db",
"transferFrom(address,address,uint160,address)": "36c78516"
},
"rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"}],\"name\":\"AllowanceExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExcessiveInvalidation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"InsufficientAllowance\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"Lockdown\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"newNonce\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"oldNonce\",\"type\":\"uint48\"}],\"name\":\"NonceInvalidation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"indexed\":false,\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"name\":\"Permit\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"newNonce\",\"type\":\"uint48\"}],\"name\":\"invalidateNonces\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"internalType\":\"struct IAllowanceTransfer.TokenSpenderPair[]\",\"name\":\"approvals\",\"type\":\"tuple[]\"}],\"name\":\"lockdown\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"internalType\":\"struct IAllowanceTransfer.PermitDetails[]\",\"name\":\"details\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sigDeadline\",\"type\":\"uint256\"}],\"internalType\":\"struct IAllowanceTransfer.PermitBatch\",\"name\":\"permitBatch\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"uint48\",\"name\":\"expiration\",\"type\":\"uint48\"},{\"internalType\":\"uint48\",\"name\":\"nonce\",\"type\":\"uint48\"}],\"internalType\":\"struct IAllowanceTransfer.PermitDetails\",\"name\":\"details\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sigDeadline\",\"type\":\"uint256\"}],\"internalType\":\"struct IAllowanceTransfer.PermitSingle\",\"name\":\"permitSingle\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"struct IAllowanceTransfer.AllowanceTransferDetails[]\",\"name\":\"transferDetails\",\"type\":\"tuple[]\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"amount\",\"type\":\"uint160\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Requires user's token approval on the Permit2 contract\",\"errors\":{\"AllowanceExpired(uint256)\":[{\"params\":{\"deadline\":\"The timestamp at which the allowed amount is no longer valid\"}}],\"InsufficientAllowance(uint256)\":[{\"params\":{\"amount\":\"The maximum amount allowed\"}}]},\"kind\":\"dev\",\"methods\":{\"allowance(address,address,address)\":{\"details\":\"The packed slot holds the allowed amount, expiration at which the allowed amount is no longer valid, and current nonce thats updated on any signature based approvals.\"},\"approve(address,address,uint160,uint48)\":{\"details\":\"The packed allowance also holds a nonce, which will stay unchanged in approveSetting amount to type(uint160).max sets an unlimited approval\",\"params\":{\"amount\":\"The approved amount of the token\",\"expiration\":\"The timestamp at which the approval is no longer valid\",\"spender\":\"The spender address to approve\",\"token\":\"The token to approve\"}},\"invalidateNonces(address,address,uint48)\":{\"details\":\"Can't invalidate more than 2**16 nonces per transaction.\",\"params\":{\"newNonce\":\"The new nonce to set. Invalidates all nonces less than it.\",\"spender\":\"The spender to invalidate nonces for\",\"token\":\"The token to invalidate nonces for\"}},\"lockdown((address,address)[])\":{\"params\":{\"approvals\":\"Array of approvals to revoke.\"}},\"permit(address,((address,uint160,uint48,uint48),address,uint256),bytes)\":{\"details\":\"May fail if the owner's nonce was invalidated in-flight by invalidateNonce\",\"params\":{\"owner\":\"The owner of the tokens being approved\",\"permitSingle\":\"Data signed over by the owner specifying the terms of approval\",\"signature\":\"The owner's signature over the permit data\"}},\"permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes)\":{\"details\":\"May fail if the owner's nonce was invalidated in-flight by invalidateNonce\",\"params\":{\"owner\":\"The owner of the tokens being approved\",\"permitBatch\":\"Data signed over by the owner specifying the terms of approval\",\"signature\":\"The owner's signature over the permit data\"}},\"transferFrom((address,address,uint160,address)[])\":{\"details\":\"Requires the from addresses to have approved at least the desired amount of tokens to msg.sender.\",\"params\":{\"transferDetails\":\"Array of owners, recipients, amounts, and tokens for the transfers\"}},\"transferFrom(address,address,uint160,address)\":{\"details\":\"Requires the from address to have approved at least the desired amount of tokens to msg.sender.\",\"params\":{\"amount\":\"The amount of the token to transfer\",\"from\":\"The address to transfer from\",\"to\":\"The address of the recipient\",\"token\":\"The token address to transfer\"}}},\"title\":\"AllowanceTransfer\",\"version\":1},\"userdoc\":{\"errors\":{\"AllowanceExpired(uint256)\":[{\"notice\":\"Thrown when an allowance on a token has expired.\"}],\"ExcessiveInvalidation()\":[{\"notice\":\"Thrown when too many nonces are invalidated.\"}],\"InsufficientAllowance(uint256)\":[{\"notice\":\"Thrown when an allowance on a token has been depleted.\"}]},\"events\":{\"Approval(address,address,address,uint160,uint48)\":{\"notice\":\"Emits an event when the owner successfully sets permissions on a token for the spender.\"},\"Lockdown(address,address,address)\":{\"notice\":\"Emits an event when the owner sets the allowance back to 0 with the lockdown function.\"},\"NonceInvalidation(address,address,address,uint48,uint48)\":{\"notice\":\"Emits an event when the owner successfully invalidates an ordered nonce.\"},\"Permit(address,address,address,uint160,uint48,uint48)\":{\"notice\":\"Emits an event when the owner successfully sets permissions using a permit signature on a token for the spender.\"}},\"kind\":\"user\",\"methods\":{\"allowance(address,address,address)\":{\"notice\":\"A mapping from owner address to token address to spender address to PackedAllowance struct, which contains details and conditions of the approval.The mapping is indexed in the above order see: allowance[ownerAddress][tokenAddress][spenderAddress]\"},\"approve(address,address,uint160,uint48)\":{\"notice\":\"Approves the spender to use up to amount of the specified token up until the expiration\"},\"invalidateNonces(address,address,uint48)\":{\"notice\":\"Invalidate nonces for a given (token, spender) pair\"},\"lockdown((address,address)[])\":{\"notice\":\"Enables performing a \\\"lockdown\\\" of the sender's Permit2 identity by batch revoking approvals\"},\"permit(address,((address,uint160,uint48,uint48),address,uint256),bytes)\":{\"notice\":\"Permit a spender to a given amount of the owners token via the owner's EIP-712 signature\"},\"permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes)\":{\"notice\":\"Permit a spender to the signed amounts of the owners tokens via the owner's EIP-712 signature\"},\"transferFrom((address,address,uint160,address)[])\":{\"notice\":\"Transfer approved tokens in a batch\"},\"transferFrom(address,address,uint160,address)\":{\"notice\":\"Transfer approved tokens from one address to another\"}},\"notice\":\"Handles ERC20 token permissions through signature based allowance setting and ERC20 token transfers by checking allowed amounts\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"chains/evm/lib/permit2/src/interfaces/IAllowanceTransfer.sol\":\"IAllowanceTransfer\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[\":@across-protocol/=chains/evm/lib/contracts/node_modules/@across-protocol/\",\":@ensdomains/=chains/evm/lib/contracts/node_modules/@ensdomains/\",\":@eth-optimism/=chains/evm/lib/contracts/node_modules/@eth-optimism/\",\":@gnosis.pm/=chains/evm/lib/contracts/node_modules/@gnosis.pm/\",\":@maticnetwork/=chains/evm/lib/contracts/node_modules/@maticnetwork/\",\":@matterlabs/=chains/evm/lib/contracts/node_modules/@matterlabs/\",\":@openzeppelin/=chains/evm/lib/contracts/node_modules/@openzeppelin/\",\":@scroll-tech/=chains/evm/lib/contracts/node_modules/@scroll-tech/\",\":@uma/=chains/evm/lib/contracts/node_modules/@uma/\",\":@uniswap/=chains/evm/lib/contracts/node_modules/@uniswap/\",\":arb-bridge-eth/=chains/evm/lib/contracts/node_modules/arb-bridge-eth/\",\":arb-bridge-peripherals/=chains/evm/lib/contracts/node_modules/arb-bridge-peripherals/\",\":arbos-precompiles/=chains/evm/lib/contracts/node_modules/arbos-precompiles/\",\":base64-sol/=chains/evm/lib/contracts/node_modules/base64-sol/\",\":bitcoinprism-evm/=chains/evm/lib/oif-contracts/lib/bitcoinprism-evm/\",\":contracts/=chains/evm/lib/contracts/contracts/\",\":ds-test/=chains/evm/lib/permit2/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=chains/evm/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":eth-gas-reporter/=chains/evm/lib/contracts/node_modules/eth-gas-reporter/\",\":forge-gas-snapshot/=chains/evm/lib/permit2/lib/forge-gas-snapshot/src/\",\":forge-std/=chains/evm/lib/forge-std/src/\",\":halmos-cheatcodes/=chains/evm/lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":hardhat-deploy/=chains/evm/lib/contracts/node_modules/hardhat-deploy/\",\":hardhat/=chains/evm/lib/contracts/node_modules/hardhat/\",\":oif-contracts/=chains/evm/lib/oif-contracts/\",\":openzeppelin-contracts-upgradeable/=chains/evm/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=chains/evm/lib/openzeppelin-contracts/\",\":openzeppelin-foundry-upgrades/=chains/evm/lib/openzeppelin-foundry-upgrades/src/\",\":openzeppelin/=chains/evm/lib/oif-contracts/lib/openzeppelin-contracts/contracts/\",\":permit2/=chains/evm/lib/permit2/\",\":solady/=chains/evm/lib/solady/src/\",\":soledge/=chains/evm/lib/oif-contracts/lib/the-compact/lib/soledge/src/\",\":solmate/=chains/evm/lib/permit2/lib/solmate/\",\":the-compact/=chains/evm/lib/oif-contracts/lib/the-compact/\"]},\"sources\":{\"chains/evm/lib/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"]},\"chains/evm/lib/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"]}},\"version\":1}",
"metadata": {
"compiler": {
"version": "0.8.30+commit.73712a01"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
}
],
"type": "error",
"name": "AllowanceExpired"
},
{
"inputs": [],
"type": "error",
"name": "ExcessiveInvalidation"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"type": "error",
"name": "InsufficientAllowance"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "token",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "spender",
"type": "address",
"indexed": true
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160",
"indexed": false
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48",
"indexed": false
}
],
"type": "event",
"name": "Approval",
"anonymous": false
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "token",
"type": "address",
"indexed": false
},
{
"internalType": "address",
"name": "spender",
"type": "address",
"indexed": false
}
],
"type": "event",
"name": "Lockdown",
"anonymous": false
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "token",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "spender",
"type": "address",
"indexed": true
},
{
"internalType": "uint48",
"name": "newNonce",
"type": "uint48",
"indexed": false
},
{
"internalType": "uint48",
"name": "oldNonce",
"type": "uint48",
"indexed": false
}
],
"type": "event",
"name": "NonceInvalidation",
"anonymous": false
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "token",
"type": "address",
"indexed": true
},
{
"internalType": "address",
"name": "spender",
"type": "address",
"indexed": true
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160",
"indexed": false
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48",
"indexed": false
},
{
"internalType": "uint48",
"name": "nonce",
"type": "uint48",
"indexed": false
}
],
"type": "event",
"name": "Permit",
"anonymous": false
},
{
"inputs": [],
"stateMutability": "view",
"type": "function",
"name": "DOMAIN_SEPARATOR",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
]
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"stateMutability": "view",
"type": "function",
"name": "allowance",
"outputs": [
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "nonce",
"type": "uint48"
}
]
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48"
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "approve"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint48",
"name": "newNonce",
"type": "uint48"
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "invalidateNonces"
},
{
"inputs": [
{
"internalType": "struct IAllowanceTransfer.TokenSpenderPair[]",
"name": "approvals",
"type": "tuple[]",
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
]
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "lockdown"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "struct IAllowanceTransfer.PermitBatch",
"name": "permitBatch",
"type": "tuple",
"components": [
{
"internalType": "struct IAllowanceTransfer.PermitDetails[]",
"name": "details",
"type": "tuple[]",
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "nonce",
"type": "uint48"
}
]
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "sigDeadline",
"type": "uint256"
}
]
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "permit"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "struct IAllowanceTransfer.PermitSingle",
"name": "permitSingle",
"type": "tuple",
"components": [
{
"internalType": "struct IAllowanceTransfer.PermitDetails",
"name": "details",
"type": "tuple",
"components": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "uint48",
"name": "expiration",
"type": "uint48"
},
{
"internalType": "uint48",
"name": "nonce",
"type": "uint48"
}
]
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "sigDeadline",
"type": "uint256"
}
]
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "permit"
},
{
"inputs": [
{
"internalType": "struct IAllowanceTransfer.AllowanceTransferDetails[]",
"name": "transferDetails",
"type": "tuple[]",
"components": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "address",
"name": "token",
"type": "address"
}
]
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "transferFrom"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint160",
"name": "amount",
"type": "uint160"
},
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function",
"name": "transferFrom"
}
],
"devdoc": {
"kind": "dev",
"methods": {
"allowance(address,address,address)": {
"details": "The packed slot holds the allowed amount, expiration at which the allowed amount is no longer valid, and current nonce thats updated on any signature based approvals."
},
"approve(address,address,uint160,uint48)": {
"details": "The packed allowance also holds a nonce, which will stay unchanged in approveSetting amount to type(uint160).max sets an unlimited approval",
"params": {
"amount": "The approved amount of the token",
"expiration": "The timestamp at which the approval is no longer valid",
"spender": "The spender address to approve",
"token": "The token to approve"
}
},
"invalidateNonces(address,address,uint48)": {
"details": "Can't invalidate more than 2**16 nonces per transaction.",
"params": {
"newNonce": "The new nonce to set. Invalidates all nonces less than it.",
"spender": "The spender to invalidate nonces for",
"token": "The token to invalidate nonces for"
}
},
"lockdown((address,address)[])": {
"params": {
"approvals": "Array of approvals to revoke."
}
},
"permit(address,((address,uint160,uint48,uint48),address,uint256),bytes)": {
"details": "May fail if the owner's nonce was invalidated in-flight by invalidateNonce",
"params": {
"owner": "The owner of the tokens being approved",
"permitSingle": "Data signed over by the owner specifying the terms of approval",
"signature": "The owner's signature over the permit data"
}
},
"permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes)": {
"details": "May fail if the owner's nonce was invalidated in-flight by invalidateNonce",
"params": {
"owner": "The owner of the tokens being approved",
"permitBatch": "Data signed over by the owner specifying the terms of approval",
"signature": "The owner's signature over the permit data"
}
},
"transferFrom((address,address,uint160,address)[])": {
"details": "Requires the from addresses to have approved at least the desired amount of tokens to msg.sender.",
"params": {
"transferDetails": "Array of owners, recipients, amounts, and tokens for the transfers"
}
},
"transferFrom(address,address,uint160,address)": {
"details": "Requires the from address to have approved at least the desired amount of tokens to msg.sender.",
"params": {
"amount": "The amount of the token to transfer",
"from": "The address to transfer from",
"to": "The address of the recipient",
"token": "The token address to transfer"
}
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {
"allowance(address,address,address)": {
"notice": "A mapping from owner address to token address to spender address to PackedAllowance struct, which contains details and conditions of the approval.The mapping is indexed in the above order see: allowance[ownerAddress][tokenAddress][spenderAddress]"
},
"approve(address,address,uint160,uint48)": {
"notice": "Approves the spender to use up to amount of the specified token up until the expiration"
},
"invalidateNonces(address,address,uint48)": {
"notice": "Invalidate nonces for a given (token, spender) pair"
},
"lockdown((address,address)[])": {
"notice": "Enables performing a \"lockdown\" of the sender's Permit2 identity by batch revoking approvals"
},
"permit(address,((address,uint160,uint48,uint48),address,uint256),bytes)": {
"notice": "Permit a spender to a given amount of the owners token via the owner's EIP-712 signature"
},
"permit(address,((address,uint160,uint48,uint48)[],address,uint256),bytes)": {
"notice": "Permit a spender to the signed amounts of the owners tokens via the owner's EIP-712 signature"
},
"transferFrom((address,address,uint160,address)[])": {
"notice": "Transfer approved tokens in a batch"
},
"transferFrom(address,address,uint160,address)": {
"notice": "Transfer approved tokens from one address to another"
}
},
"version": 1
}
},
"settings": {
"remappings": [
"@across-protocol/=chains/evm/lib/contracts/node_modules/@across-protocol/",
"@ensdomains/=chains/evm/lib/contracts/node_modules/@ensdomains/",
"@eth-optimism/=chains/evm/lib/contracts/node_modules/@eth-optimism/",
"@gnosis.pm/=chains/evm/lib/contracts/node_modules/@gnosis.pm/",
"@maticnetwork/=chains/evm/lib/contracts/node_modules/@maticnetwork/",
"@matterlabs/=chains/evm/lib/contracts/node_modules/@matterlabs/",
"@openzeppelin/=chains/evm/lib/contracts/node_modules/@openzeppelin/",
"@scroll-tech/=chains/evm/lib/contracts/node_modules/@scroll-tech/",
"@uma/=chains/evm/lib/contracts/node_modules/@uma/",
"@uniswap/=chains/evm/lib/contracts/node_modules/@uniswap/",
"arb-bridge-eth/=chains/evm/lib/contracts/node_modules/arb-bridge-eth/",
"arb-bridge-peripherals/=chains/evm/lib/contracts/node_modules/arb-bridge-peripherals/",
"arbos-precompiles/=chains/evm/lib/contracts/node_modules/arbos-precompiles/",
"base64-sol/=chains/evm/lib/contracts/node_modules/base64-sol/",
"bitcoinprism-evm/=chains/evm/lib/oif-contracts/lib/bitcoinprism-evm/",
"contracts/=chains/evm/lib/contracts/contracts/",
"ds-test/=chains/evm/lib/permit2/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=chains/evm/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"eth-gas-reporter/=chains/evm/lib/contracts/node_modules/eth-gas-reporter/",
"forge-gas-snapshot/=chains/evm/lib/permit2/lib/forge-gas-snapshot/src/",
"forge-std/=chains/evm/lib/forge-std/src/",
"halmos-cheatcodes/=chains/evm/lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
"hardhat-deploy/=chains/evm/lib/contracts/node_modules/hardhat-deploy/",
"hardhat/=chains/evm/lib/contracts/node_modules/hardhat/",
"oif-contracts/=chains/evm/lib/oif-contracts/",
"openzeppelin-contracts-upgradeable/=chains/evm/lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=chains/evm/lib/openzeppelin-contracts/",
"openzeppelin-foundry-upgrades/=chains/evm/lib/openzeppelin-foundry-upgrades/src/",
"openzeppelin/=chains/evm/lib/oif-contracts/lib/openzeppelin-contracts/contracts/",
"permit2/=chains/evm/lib/permit2/",
"solady/=chains/evm/lib/solady/src/",
"soledge/=chains/evm/lib/oif-contracts/lib/the-compact/lib/soledge/src/",
"solmate/=chains/evm/lib/permit2/lib/solmate/",
"the-compact/=chains/evm/lib/oif-contracts/lib/the-compact/"
],
"optimizer": {
"enabled": true,
"runs": 1000
},
"metadata": {
"bytecodeHash": "ipfs"
},
"compilationTarget": {
"chains/evm/lib/permit2/src/interfaces/IAllowanceTransfer.sol": "IAllowanceTransfer"
},
"evmVersion": "london",
"libraries": {}
},
"sources": {
"chains/evm/lib/permit2/src/interfaces/IAllowanceTransfer.sol": {
"keccak256": "0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29",
"urls": [
"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0",
"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN"
],
"license": "MIT"
},
"chains/evm/lib/permit2/src/interfaces/IEIP712.sol": {
"keccak256": "0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138",
"urls": [
"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72",
"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk"
],
"license": "MIT"
}
},
"version": 1
},
"id": 31
}