{
  "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
}
