From 3e7976223a5935e531913f248af6aedf0320cae4 Mon Sep 17 00:00:00 2001 From: lbeder Date: Fri, 27 Jan 2023 22:14:56 +0000 Subject: [PATCH] Deploy to Sepolia --- .env.template | 5 +- .gitignore | 2 +- README.md | 12 +- data/NamedAccounts.ts | 8 +- deployments/goerli/.chainId | 1 - deployments/goerli/.migrations.json | 7 - deployments/goerli/EAS.json | 1148 --------------- deployments/goerli/SchemaRegistry.json | 246 ---- .../types/factories/contracts/EAS__factory.ts | 904 ------------ deployments/sepolia/.chainId | 1 + deployments/sepolia/.migrations.json | 7 + deployments/sepolia/EAS.json | 1271 +++++++++++++++++ deployments/sepolia/SchemaRegistry.json | 246 ++++ .../types/contracts/EAS.ts | 151 +- .../types/contracts/SchemaRegistry.ts | 0 .../types/factories/contracts/EAS__factory.ts | 985 +++++++++++++ .../contracts/SchemaRegistry__factory.ts | 157 +- hardhat.config.ts | 13 +- package.json | 6 +- utils/Constants.ts | 2 +- utils/Deploy.ts | 23 +- 21 files changed, 2773 insertions(+), 2422 deletions(-) delete mode 100644 deployments/goerli/.chainId delete mode 100644 deployments/goerli/.migrations.json delete mode 100644 deployments/goerli/EAS.json delete mode 100644 deployments/goerli/SchemaRegistry.json delete mode 100644 deployments/goerli/types/factories/contracts/EAS__factory.ts create mode 100644 deployments/sepolia/.chainId create mode 100644 deployments/sepolia/.migrations.json create mode 100644 deployments/sepolia/EAS.json create mode 100644 deployments/sepolia/SchemaRegistry.json rename deployments/{goerli => sepolia}/types/contracts/EAS.ts (85%) rename deployments/{goerli => sepolia}/types/contracts/SchemaRegistry.ts (100%) create mode 100644 deployments/sepolia/types/factories/contracts/EAS__factory.ts rename deployments/{goerli => sepolia}/types/factories/contracts/SchemaRegistry__factory.ts (67%) diff --git a/.env.template b/.env.template index dc1fcfe..24a13a7 100644 --- a/.env.template +++ b/.env.template @@ -1,10 +1,11 @@ ETHEREUM_PROVIDER_URL= -ETHEREUM_GOERLI_PROVIDER_URL= +ETHEREUM_SEPOLIA_PROVIDER_URL= TENDERLY_FORK_ID= TENDERLY_PROJECT= TENDERLY_USERNAME= TENDERLY_ACCESS_KEY= TENDERLY_TEST_PROJECT= ETHERSCAN_API_KEY= -GAS_PRICE= +MAX_FEE= +MAX_PRIORITY_FEE= DEPLOYER= diff --git a/.gitignore b/.gitignore index bd8505a..19ff662 100755 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ artifacts typechain-types deployments/mainnet/solcInputs/* -deployments/goerli/solcInputs/* +deployments/sepolia/solcInputs/* deployments/hardhat/* deployments/tenderly/* diff --git a/README.md b/README.md index 3bf4340..8462845 100755 --- a/README.md +++ b/README.md @@ -36,16 +36,16 @@ On-chain attestations will enable a powerful new range of web3 applications, inc ## Deployments -### Goerli +### Sepolia -#### v0.22 +#### v0.24 * **EAS**: - * Contract: [0xf0273638b19877fbA1ca9282Adb7ED83ADa819F8](https://goerli.etherscan.io/address/0xf0273638b19877fbA1ca9282Adb7ED83ADa819F8) - * Deployment and ABI: [EAS.json](./deployments/goerli/EAS.json) + * Contract: [0x50DB967C805A88FAebA43a2049AAc78052ff9f8F](https://sepolia.etherscan.io/address/0x50DB967C805A88FAebA43a2049AAc78052ff9f8F) + * Deployment and ABI: [EAS.json](./deployments/sepolia/EAS.json) * **SchemaRegistry**: - * Contract: [0x40E750bbDCC059cb5F3c24e1B5C84E2D3ea8D2Fc](https://goerli.etherscan.io/address/0x40E750bbDCC059cb5F3c24e1B5C84E2D3ea8D2Fc) - * Deployment and ABI: [SchemaRegistry.json](./deployments/goerli/SchemaRegistry.json) + * Contract: [0x16399b867877D7f59deE9f04bD79B07fa8D17f7A](https://sepolia.etherscan.io/address/0x16399b867877D7f59deE9f04bD79B07fa8D17f7A) + * Deployment and ABI: [SchemaRegistry.json](./deployments/sepolia/SchemaRegistry.json) ## Installation diff --git a/data/NamedAccounts.ts b/data/NamedAccounts.ts index 3fdaf4e..49f15ab 100644 --- a/data/NamedAccounts.ts +++ b/data/NamedAccounts.ts @@ -13,21 +13,21 @@ const mainnet = (address: string) => ({ [DeploymentNetwork.Tenderly]: address }); -const goerli = (address: string) => ({ - [DeploymentNetwork.Goerli]: address +const sepolia = (address: string) => ({ + [DeploymentNetwork.Sepolia]: address }); const TestNamedAccounts = { ethWhale: { ...mainnet('0x00000000219ab540356cbb839cbe05303d7705fa'), - ...goerli('0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134') + ...sepolia('0xb21c33DE1FAb3FA15499c62B59fe0cC3250020d1') } }; export const NamedAccounts = { deployer: { ...mainnet(deployer), - ...goerli(deployer) + ...sepolia(deployer) }, ...TestNamedAccounts diff --git a/deployments/goerli/.chainId b/deployments/goerli/.chainId deleted file mode 100644 index 7813681..0000000 --- a/deployments/goerli/.chainId +++ /dev/null @@ -1 +0,0 @@ -5 \ No newline at end of file diff --git a/deployments/goerli/.migrations.json b/deployments/goerli/.migrations.json deleted file mode 100644 index 258fa11..0000000 --- a/deployments/goerli/.migrations.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "000001-registry": 1673301052, - "000002-eas": 1673301076, - "000003-register-initial-schemas": 1673301352, - "000004-name-initial-schemas": 1673301579, - "000100-test-seed": 1673302034 -} \ No newline at end of file diff --git a/deployments/goerli/EAS.json b/deployments/goerli/EAS.json deleted file mode 100644 index 9209bc2..0000000 --- a/deployments/goerli/EAS.json +++ /dev/null @@ -1,1148 +0,0 @@ -{ - "address": "0xf0273638b19877fbA1ca9282Adb7ED83ADa819F8", - "abi": [ - { - "inputs": [ - { - "internalType": "contract ISchemaRegistry", - "name": "registry", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessDenied", - "type": "error" - }, - { - "inputs": [], - "name": "AlreadyRevoked", - "type": "error" - }, - { - "inputs": [], - "name": "InsufficientValue", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidAttestation", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidAttestations", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidExpirationTime", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidLength", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidOffset", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidRegistry", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidRevocation", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidRevocations", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidSchema", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidSignature", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidVerifier", - "type": "error" - }, - { - "inputs": [], - "name": "Irrevocable", - "type": "error" - }, - { - "inputs": [], - "name": "NotFound", - "type": "error" - }, - { - "inputs": [], - "name": "NotPayable", - "type": "error" - }, - { - "inputs": [], - "name": "WrongSchema", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "attester", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - } - ], - "name": "Attested", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "attester", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - } - ], - "name": "Revoked", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint32", - "name": "expirationTime", - "type": "uint32" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "refUUID", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct AttestationRequestData", - "name": "data", - "type": "tuple" - } - ], - "internalType": "struct AttestationRequest", - "name": "request", - "type": "tuple" - } - ], - "name": "attest", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint32", - "name": "expirationTime", - "type": "uint32" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "refUUID", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct AttestationRequestData", - "name": "data", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct EIP712Signature", - "name": "signature", - "type": "tuple" - }, - { - "internalType": "address", - "name": "attester", - "type": "address" - } - ], - "internalType": "struct DelegatedAttestationRequest", - "name": "delegatedRequest", - "type": "tuple" - } - ], - "name": "attestByDelegation", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "getAttestTypeHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - } - ], - "name": "getAttestation", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "refUUID", - "type": "bytes32" - }, - { - "internalType": "uint32", - "name": "time", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "expirationTime", - "type": "uint32" - }, - { - "internalType": "uint32", - "name": "revocationTime", - "type": "uint32" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "address", - "name": "attester", - "type": "address" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "internalType": "struct Attestation", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getDomainSeparator", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "getNonce", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getRevokeTypeHash", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, - { - "inputs": [], - "name": "getSchemaRegistry", - "outputs": [ - { - "internalType": "contract ISchemaRegistry", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - } - ], - "name": "isAttestationValid", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint32", - "name": "expirationTime", - "type": "uint32" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "refUUID", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct AttestationRequestData[]", - "name": "data", - "type": "tuple[]" - } - ], - "internalType": "struct MultiAttestationRequest[]", - "name": "multiRequests", - "type": "tuple[]" - } - ], - "name": "multiAttest", - "outputs": [ - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint32", - "name": "expirationTime", - "type": "uint32" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "bytes32", - "name": "refUUID", - "type": "bytes32" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct AttestationRequestData[]", - "name": "data", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct EIP712Signature[]", - "name": "signatures", - "type": "tuple[]" - }, - { - "internalType": "address", - "name": "attester", - "type": "address" - } - ], - "internalType": "struct MultiDelegatedAttestationRequest[]", - "name": "multiDelegatedRequests", - "type": "tuple[]" - } - ], - "name": "multiAttestByDelegation", - "outputs": [ - { - "internalType": "bytes32[]", - "name": "", - "type": "bytes32[]" - } - ], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct RevocationRequestData[]", - "name": "data", - "type": "tuple[]" - } - ], - "internalType": "struct MultiRevocationRequest[]", - "name": "multiRequests", - "type": "tuple[]" - } - ], - "name": "multiRevoke", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct RevocationRequestData[]", - "name": "data", - "type": "tuple[]" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct EIP712Signature[]", - "name": "signatures", - "type": "tuple[]" - }, - { - "internalType": "address", - "name": "revoker", - "type": "address" - } - ], - "internalType": "struct MultiDelegatedRevocationRequest[]", - "name": "multiDelegatedRequests", - "type": "tuple[]" - } - ], - "name": "multiRevokeByDelegation", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct RevocationRequestData", - "name": "data", - "type": "tuple" - } - ], - "internalType": "struct RevocationRequest", - "name": "request", - "type": "tuple" - } - ], - "name": "revoke", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "schema", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "internalType": "struct RevocationRequestData", - "name": "data", - "type": "tuple" - }, - { - "components": [ - { - "internalType": "uint8", - "name": "v", - "type": "uint8" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - } - ], - "internalType": "struct EIP712Signature", - "name": "signature", - "type": "tuple" - }, - { - "internalType": "address", - "name": "revoker", - "type": "address" - } - ], - "internalType": "struct DelegatedRevocationRequest", - "name": "delegatedRequest", - "type": "tuple" - } - ], - "name": "revokeByDelegation", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ], - "transactionHash": "0x07ad231a4034029eb2a8371ae88b9008bb0dd7ca9f7e0d9663bda1c01393718c", - "receipt": { - "to": null, - "from": "0x01a93612f26100B6E18a2e3dd57df5c3ccaFeca1", - "contractAddress": "0xf0273638b19877fbA1ca9282Adb7ED83ADa819F8", - "transactionIndex": 8, - "gasUsed": "4073817", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x05614c32ef8a7c6aea2186206a12a7a5968ac39dd6036229e05970f9999fb049", - "transactionHash": "0x07ad231a4034029eb2a8371ae88b9008bb0dd7ca9f7e0d9663bda1c01393718c", - "logs": [], - "blockNumber": 8284412, - "cumulativeGasUsed": "7105019", - "status": 1, - "byzantium": true - }, - "args": [ - "0x40E750bbDCC059cb5F3c24e1B5C84E2D3ea8D2Fc" - ], - "numDeployments": 1, - "solcInputHash": "b22fa35c9f5fddbbe076697098508faf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ISchemaRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessDenied\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyRevoked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAttestation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAttestations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExpirationTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOffset\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRevocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRevocations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSchema\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidVerifier\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Irrevocable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongSchema\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"}],\"name\":\"Attested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"}],\"name\":\"Revoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"expirationTime\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct AttestationRequest\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"attest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"expirationTime\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData\",\"name\":\"data\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature\",\"name\":\"signature\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"}],\"internalType\":\"struct DelegatedAttestationRequest\",\"name\":\"delegatedRequest\",\"type\":\"tuple\"}],\"name\":\"attestByDelegation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestTypeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"getAttestation\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"time\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expirationTime\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"revocationTime\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Attestation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDomainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRevokeTypeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSchemaRegistry\",\"outputs\":[{\"internalType\":\"contract ISchemaRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"isAttestationValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"expirationTime\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"multiRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiAttest\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"expirationTime\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"}],\"internalType\":\"struct MultiDelegatedAttestationRequest[]\",\"name\":\"multiDelegatedRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiAttestByDelegation\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiRevocationRequest[]\",\"name\":\"multiRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiRevoke\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"revoker\",\"type\":\"address\"}],\"internalType\":\"struct MultiDelegatedRevocationRequest[]\",\"name\":\"multiDelegatedRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiRevokeByDelegation\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct RevocationRequest\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"revoke\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData\",\"name\":\"data\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature\",\"name\":\"signature\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"revoker\",\"type\":\"address\"}],\"internalType\":\"struct DelegatedRevocationRequest\",\"name\":\"delegatedRequest\",\"type\":\"tuple\"}],\"name\":\"revokeByDelegation\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"attest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)))\":{\"details\":\"Attests to a specific schema.\",\"params\":{\"request\":\"The arguments of the attestation request. Example: attest({ schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\", data: { recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\", expirationTime: 0, revocable: true, refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\", data: \\\"0xF00D\\\", value: 0 } })\"},\"returns\":{\"_0\":\"The UUID of the new attestation.\"}},\"attestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))\":{\"details\":\"Attests to a specific schema via the provided EIP712 signature.\",\"params\":{\"delegatedRequest\":\"The arguments of the delegated attestation request. Example: attestByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, signature: { v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e' })\"},\"returns\":{\"_0\":\"The UUID of the new attestation.\"}},\"constructor\":{\"details\":\"Creates a new EAS instance.\",\"params\":{\"registry\":\"The address of the global schema registry.\"}},\"getAttestation(bytes32)\":{\"details\":\"Returns an existing attestation by UUID.\",\"params\":{\"uuid\":\"The UUID of the attestation to retrieve.\"},\"returns\":{\"_0\":\"The attestation data members.\"}},\"getDomainSeparator()\":{\"details\":\"Returns the domain separator used in the encoding of the signatures for attest, and revoke.\"},\"getNonce(address)\":{\"details\":\"Returns the current nonce per-account.\",\"params\":{\"account\":\"The requested account.\"},\"returns\":{\"_0\":\"The current nonce.\"}},\"getSchemaRegistry()\":{\"details\":\"Returns the address of the global schema registry.\",\"returns\":{\"_0\":\"The address of the global schema registry.\"}},\"isAttestationValid(bytes32)\":{\"details\":\"Checks whether an attestation exists.\",\"params\":{\"uuid\":\"The UUID of the attestation to retrieve.\"},\"returns\":{\"_0\":\"Whether an attestation exists.\"}},\"multiAttest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[])[])\":{\"details\":\"Attests to multiple schemas.\",\"params\":{\"multiRequests\":\"The arguments of the multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttest([{ schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 1000 }, { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 0, revocable: false, refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174', data: '0x00', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: true, refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f', data: '0x12345678', value: 0 }, }])\"},\"returns\":{\"_0\":\"The UUIDs of the new attestations.\"}},\"multiAttestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])\":{\"details\":\"Attests to multiple schemas using via provided EIP712 signatures.\",\"params\":{\"multiDelegatedRequests\":\"The arguments of the delegated multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttestByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, { recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: false, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x00', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4' }])\"},\"returns\":{\"_0\":\"The UUIDs of the new attestations.\"}},\"multiRevoke((bytes32,(bytes32,uint256)[])[])\":{\"details\":\"Revokes existing attestations to multiple schemas.\",\"params\":{\"multiRequests\":\"The arguments of the multi revocation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevoke([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019', value: 0 }, }])\"}},\"multiRevokeByDelegation((bytes32,(bytes32,uint256)[],(uint8,bytes32,bytes32)[],address)[])\":{\"details\":\"Revokes existing attestations to multiple schemas via provided EIP712 signatures.\",\"params\":{\"multiDelegatedRequests\":\"The arguments of the delegated multi revocation attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevokeByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' }])\"}},\"revoke((bytes32,(bytes32,uint256)))\":{\"details\":\"Revokes an existing attestation to a specific schema. Example: revoke({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d', value: 0 } })\",\"params\":{\"request\":\"The arguments of the revocation request.\"}},\"revokeByDelegation((bytes32,(bytes32,uint256),(uint8,bytes32,bytes32),address))\":{\"details\":\"Revokes an existing attestation to a specific schema via the provided EIP712 signature. Example: revokeByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba', value: 0 }, signature: { v: 27, r: '0xb593...7142', s: '0x0f5b...2cce' }, revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' })\",\"params\":{\"delegatedRequest\":\"The arguments of the delegated revocation request.\"}}},\"title\":\"EAS - Ethereum Attestation Service\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAttestTypeHash()\":{\"notice\":\"Returns the EIP712 type hash for the attest function.\"},\"getRevokeTypeHash()\":{\"notice\":\"Returns the EIP712 type hash for the revoke function.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/EAS.sol\":\"EAS\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/EAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nimport { EMPTY_UUID, EIP712Signature } from \\\"./Types.sol\\\";\\n\\n// prettier-ignore\\nimport {\\n Attestation,\\n AttestationRequest,\\n AttestationRequestData,\\n DelegatedAttestationRequest,\\n DelegatedRevocationRequest,\\n IEAS,\\n MultiAttestationRequest,\\n MultiDelegatedAttestationRequest,\\n MultiDelegatedRevocationRequest,\\n MultiRevocationRequest,\\n RevocationRequest,\\n RevocationRequestData\\n} from \\\"./IEAS.sol\\\";\\nimport { ISchemaRegistry, SchemaRecord } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Verifier } from \\\"./EIP712Verifier.sol\\\";\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\nstruct AttestationsResult {\\n uint256 usedValue; // Total ETH amount that was sent to resolvers.\\n bytes32[] uuids; // UUIDs of the new attestations.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service\\n */\\ncontract EAS is IEAS, EIP712Verifier {\\n using Address for address payable;\\n\\n error AccessDenied();\\n error AlreadyRevoked();\\n error InsufficientValue();\\n error InvalidAttestation();\\n error InvalidAttestations();\\n error InvalidExpirationTime();\\n error InvalidLength();\\n error InvalidOffset();\\n error InvalidRegistry();\\n error InvalidRevocation();\\n error InvalidRevocations();\\n error InvalidSchema();\\n error InvalidVerifier();\\n error Irrevocable();\\n error NotFound();\\n error NotPayable();\\n error WrongSchema();\\n\\n // The version of the contract.\\n string public constant VERSION = \\\"0.22\\\";\\n\\n // A zero expiration represents an non-expiring attestation.\\n uint32 private constant NO_EXPIRATION_TIME = 0;\\n\\n // The global schema registry.\\n ISchemaRegistry private immutable _schemaRegistry;\\n\\n // The global mapping between attestations and their UUIDs.\\n mapping(bytes32 => Attestation) private _db;\\n\\n /**\\n * @dev Creates a new EAS instance.\\n *\\n * @param registry The address of the global schema registry.\\n */\\n constructor(ISchemaRegistry registry) EIP712Verifier(VERSION) {\\n if (address(registry) == address(0)) {\\n revert InvalidRegistry();\\n }\\n\\n _schemaRegistry = registry;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry) {\\n return _schemaRegistry;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function attest(AttestationRequest calldata request) public payable virtual returns (bytes32) {\\n AttestationRequestData[] memory requests = new AttestationRequestData[](1);\\n requests[0] = request.data;\\n\\n return _attest(request.schema, requests, msg.sender, msg.value, true).uuids[0];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) public payable virtual returns (bytes32) {\\n _verifyAttest(delegatedRequest);\\n\\n AttestationRequestData[] memory data = new AttestationRequestData[](1);\\n data[0] = delegatedRequest.data;\\n\\n return _attest(delegatedRequest.schema, data, delegatedRequest.attester, msg.value, true).uuids[0];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory) {\\n // Since a multi-attest call is going to make multiple attestations for multiple schemas, we'd need to collect\\n // all the returned UUIDs into a single list.\\n bytes32[][] memory totalUuids = new bytes32[][](multiRequests.length);\\n uint256 totalUuidsCount = 0;\\n\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiRequests.length - 1;\\n }\\n\\n // Process the current batch of attestations.\\n MultiAttestationRequest calldata multiRequest = multiRequests[i];\\n AttestationsResult memory res = _attest(\\n multiRequest.schema,\\n multiRequest.data,\\n msg.sender,\\n availableValue,\\n last\\n );\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= res.usedValue;\\n\\n // Collect UUIDs (and merge them later).\\n totalUuids[i] = res.uuids;\\n unchecked {\\n totalUuidsCount += res.uuids.length;\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Merge all the collected UUIDs and return them as a flatten array.\\n return _mergeUUIDs(totalUuids, totalUuidsCount);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory) {\\n // Since a multi-attest call is going to make multiple attestations for multiple schemas, we'd need to collect\\n // all the returned UUIDs into a single list.\\n bytes32[][] memory totalUuids = new bytes32[][](multiDelegatedRequests.length);\\n uint256 totalUuidsCount = 0;\\n\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiDelegatedRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiDelegatedRequests.length - 1;\\n }\\n\\n MultiDelegatedAttestationRequest calldata multiDelegatedRequest = multiDelegatedRequests[i];\\n AttestationRequestData[] calldata data = multiDelegatedRequest.data;\\n\\n // Ensure that no inputs are missing.\\n if (data.length == 0 || data.length != multiDelegatedRequest.signatures.length) {\\n revert InvalidLength();\\n }\\n\\n // Verify EIP712 signatures. Please note that the signatures are assumed to be signed with increasing nonces.\\n for (uint256 j = 0; j < data.length; ) {\\n _verifyAttest(\\n DelegatedAttestationRequest({\\n schema: multiDelegatedRequest.schema,\\n data: data[j],\\n signature: multiDelegatedRequest.signatures[j],\\n attester: multiDelegatedRequest.attester\\n })\\n );\\n\\n unchecked {\\n ++j;\\n }\\n }\\n\\n // Process the current batch of attestations.\\n AttestationsResult memory res = _attest(\\n multiDelegatedRequest.schema,\\n data,\\n multiDelegatedRequest.attester,\\n availableValue,\\n last\\n );\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= res.usedValue;\\n\\n // Collect UUIDs (and merge them later).\\n totalUuids[i] = res.uuids;\\n unchecked {\\n totalUuidsCount += res.uuids.length;\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Merge all the collected UUIDs and return them as a flatten array.\\n return _mergeUUIDs(totalUuids, totalUuidsCount);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function revoke(RevocationRequest calldata request) public payable virtual {\\n RevocationRequestData[] memory requests = new RevocationRequestData[](1);\\n requests[0] = request.data;\\n\\n _revoke(request.schema, requests, msg.sender, msg.value, true);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) public payable virtual {\\n _verifyRevoke(delegatedRequest);\\n\\n RevocationRequestData[] memory data = new RevocationRequestData[](1);\\n data[0] = delegatedRequest.data;\\n\\n _revoke(delegatedRequest.schema, data, delegatedRequest.revoker, msg.value, true);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable {\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiRequests.length - 1;\\n }\\n\\n MultiRevocationRequest calldata multiRequest = multiRequests[i];\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= _revoke(multiRequest.schema, multiRequest.data, msg.sender, availableValue, last);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable {\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiDelegatedRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiDelegatedRequests.length - 1;\\n }\\n\\n MultiDelegatedRevocationRequest memory multiDelegatedRequest = multiDelegatedRequests[i];\\n RevocationRequestData[] memory data = multiDelegatedRequest.data;\\n\\n // Ensure that no inputs are missing.\\n if (data.length == 0 || data.length != multiDelegatedRequest.signatures.length) {\\n revert InvalidLength();\\n }\\n\\n // Verify EIP712 signatures. Please note that the signatures are assumed to be signed with increasing nonces.\\n for (uint256 j = 0; j < data.length; ) {\\n _verifyRevoke(\\n DelegatedRevocationRequest({\\n schema: multiDelegatedRequest.schema,\\n data: data[j],\\n signature: multiDelegatedRequest.signatures[j],\\n revoker: multiDelegatedRequest.revoker\\n })\\n );\\n\\n unchecked {\\n ++j;\\n }\\n }\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= _revoke(\\n multiDelegatedRequest.schema,\\n data,\\n multiDelegatedRequest.revoker,\\n availableValue,\\n last\\n );\\n\\n unchecked {\\n ++i;\\n }\\n }\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory) {\\n return _db[uuid];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function isAttestationValid(bytes32 uuid) public view returns (bool) {\\n return _db[uuid].uuid != 0;\\n }\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param schema // the unique identifier of the schema to attest to.\\n * @param data The arguments of the attestation requests.\\n * @param attester The attesting account.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return The UUID of the new attestations and the total sent ETH amount.\\n */\\n function _attest(\\n bytes32 schema,\\n AttestationRequestData[] memory data,\\n address attester,\\n uint256 availableValue,\\n bool last\\n ) private returns (AttestationsResult memory) {\\n uint256 length = data.length;\\n\\n AttestationsResult memory res;\\n res.uuids = new bytes32[](length);\\n\\n // Ensure that we aren't attempting to attest to a non-existing schema.\\n SchemaRecord memory schemaRecord = _schemaRegistry.getSchema(schema);\\n if (schemaRecord.uuid == EMPTY_UUID) {\\n revert InvalidSchema();\\n }\\n\\n Attestation[] memory attestations = new Attestation[](length);\\n uint256[] memory values = new uint256[](length);\\n\\n for (uint256 i = 0; i < length; ) {\\n AttestationRequestData memory request = data[i];\\n\\n // Ensure that either no expiration time was set or that it was set in the future.\\n if (request.expirationTime != NO_EXPIRATION_TIME && request.expirationTime <= _time()) {\\n revert InvalidExpirationTime();\\n }\\n\\n // Ensure that we aren't trying to make a revocable attestation for a non-revocable schema.\\n if (!schemaRecord.revocable && request.revocable) {\\n revert Irrevocable();\\n }\\n\\n Attestation memory attestation = Attestation({\\n uuid: EMPTY_UUID,\\n schema: schema,\\n refUUID: request.refUUID,\\n time: _time(),\\n expirationTime: request.expirationTime,\\n revocationTime: 0,\\n recipient: request.recipient,\\n attester: attester,\\n revocable: request.revocable,\\n data: request.data\\n });\\n\\n // Look for the first non-existing UUID (and use a bump seed/nonce in the rare case of a conflict).\\n bytes32 uuid;\\n uint32 bump = 0;\\n while (true) {\\n uuid = _getUUID(attestation, bump);\\n if (_db[uuid].uuid == EMPTY_UUID) {\\n break;\\n }\\n\\n unchecked {\\n ++bump;\\n }\\n }\\n attestation.uuid = uuid;\\n\\n _db[uuid] = attestation;\\n\\n if (request.refUUID != 0) {\\n // Ensure that we aren't trying to attest to a non-existing referenced UUID.\\n if (!isAttestationValid(request.refUUID)) {\\n revert NotFound();\\n }\\n }\\n\\n attestations[i] = attestation;\\n values[i] = request.value;\\n\\n res.uuids[i] = uuid;\\n\\n emit Attested(request.recipient, attester, uuid, schema);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n res.usedValue = _resolveAttestations(schemaRecord, attestations, values, false, availableValue, last);\\n\\n return res;\\n }\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * @param schema The unique identifier of the schema to attest to.\\n * @param data The arguments of the revocation requests.\\n * @param revoker The revoking account.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _revoke(\\n bytes32 schema,\\n RevocationRequestData[] memory data,\\n address revoker,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n // Ensure that a non-existing schema ID wasn't passed by accident.\\n SchemaRecord memory schemaRecord = _schemaRegistry.getSchema(schema);\\n if (schemaRecord.uuid == EMPTY_UUID) {\\n revert InvalidSchema();\\n }\\n\\n uint256 length = data.length;\\n Attestation[] memory attestations = new Attestation[](length);\\n uint256[] memory values = new uint256[](length);\\n\\n for (uint256 i = 0; i < length; ) {\\n RevocationRequestData memory request = data[i];\\n\\n Attestation storage attestation = _db[request.uuid];\\n\\n // Ensure that we aren't attempting to revoke a non-existing attestation.\\n if (attestation.uuid == EMPTY_UUID) {\\n revert NotFound();\\n }\\n\\n // Ensure that a wrong schema ID wasn't passed by accident.\\n if (attestation.schema != schema) {\\n revert InvalidSchema();\\n }\\n\\n // Allow only original attesters to revoke their attestations.\\n if (attestation.attester != revoker) {\\n revert AccessDenied();\\n }\\n\\n // Please note that also checking of the schema itself is revocable is unnecessary, since it's not possible to\\n // make revocable attestations to an irrevocable schema.\\n if (!attestation.revocable) {\\n revert Irrevocable();\\n }\\n\\n // Ensure that we aren't trying to revoke the same attestation twice.\\n if (attestation.revocationTime != 0) {\\n revert AlreadyRevoked();\\n }\\n attestation.revocationTime = _time();\\n\\n attestations[i] = attestation;\\n values[i] = request.value;\\n\\n emit Revoked(attestation.recipient, revoker, request.uuid, attestation.schema);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return _resolveAttestations(schemaRecord, attestations, values, true, availableValue, last);\\n }\\n\\n /**\\n * @dev Resolves a new attestation or a revocation of an existing attestation.\\n *\\n * @param schemaRecord The schema of the attestation.\\n * @param attestation The data of the attestation to make/revoke.\\n * @param value An explicit ETH amount to send to the resolver.\\n * @param isRevocation Whether to resolve an attestation or its revocation.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _resolveAttestation(\\n SchemaRecord memory schemaRecord,\\n Attestation memory attestation,\\n uint256 value,\\n bool isRevocation,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n ISchemaResolver resolver = schemaRecord.resolver;\\n if (address(resolver) == address(0)) {\\n // Ensure that we don't accept payments if there is no resolver.\\n if (value != 0) {\\n revert NotPayable();\\n }\\n\\n return 0;\\n }\\n\\n // Ensure that we don't accept payments which can't be forwarded to the resolver.\\n if (value != 0 && !resolver.isPayable()) {\\n revert NotPayable();\\n }\\n\\n // Ensure that the attester/revoker doesn't try to spend more than available.\\n if (value > availableValue) {\\n revert InsufficientValue();\\n }\\n\\n // Ensure to deduct the sent value explicitly.\\n unchecked {\\n availableValue -= value;\\n }\\n\\n if (isRevocation) {\\n if (!resolver.revoke{ value: value }(attestation)) {\\n revert InvalidRevocation();\\n }\\n } else if (!resolver.attest{ value: value }(attestation)) {\\n revert InvalidAttestation();\\n }\\n\\n if (last) {\\n _refund(availableValue);\\n }\\n\\n return value;\\n }\\n\\n /**\\n * @dev Resolves multiple attestations or revocations of existing attestations.\\n *\\n * @param schemaRecord The schema of the attestation.\\n * @param attestations The data of the attestations to make/revoke.\\n * @param values Explicit ETH amounts to send to the resolver.\\n * @param isRevocation Whether to resolve an attestation or its revocation.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _resolveAttestations(\\n SchemaRecord memory schemaRecord,\\n Attestation[] memory attestations,\\n uint256[] memory values,\\n bool isRevocation,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n uint256 length = attestations.length;\\n if (length == 1) {\\n return _resolveAttestation(schemaRecord, attestations[0], values[0], isRevocation, availableValue, last);\\n }\\n\\n ISchemaResolver resolver = schemaRecord.resolver;\\n if (address(resolver) == address(0)) {\\n // Ensure that we don't accept payments if there is no resolver.\\n for (uint256 i = 0; i < length; ) {\\n if (values[i] != 0) {\\n revert NotPayable();\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return 0;\\n }\\n\\n uint256 totalUsedValue = 0;\\n\\n for (uint256 i = 0; i < length; ) {\\n uint256 value = values[i];\\n\\n // Ensure that we don't accept payments which can't be forwarded to the resolver.\\n if (value != 0 && !resolver.isPayable()) {\\n revert NotPayable();\\n }\\n\\n // Ensure that the attester/revoker doesn't try to spend more than available.\\n if (value > availableValue) {\\n revert InsufficientValue();\\n }\\n\\n // Ensure to deduct the sent value explicitly and add it to the total used value by the batch.\\n unchecked {\\n availableValue -= value;\\n totalUsedValue += value;\\n\\n ++i;\\n }\\n }\\n\\n if (isRevocation) {\\n if (!resolver.multiRevoke{ value: totalUsedValue }(attestations, values)) {\\n revert InvalidRevocations();\\n }\\n } else if (!resolver.multiAttest{ value: totalUsedValue }(attestations, values)) {\\n revert InvalidAttestations();\\n }\\n\\n if (last) {\\n _refund(availableValue);\\n }\\n\\n return totalUsedValue;\\n }\\n\\n /**\\n * @dev Calculates a UUID for a given attestation.\\n *\\n * @param attestation The input attestation.\\n * @param bump A bump value to use in case of a UUID conflict.\\n *\\n * @return Attestation UUID.\\n */\\n function _getUUID(Attestation memory attestation, uint32 bump) private pure returns (bytes32) {\\n return\\n keccak256(\\n abi.encodePacked(\\n attestation.schema,\\n attestation.recipient,\\n attestation.attester,\\n attestation.time,\\n attestation.expirationTime,\\n attestation.revocable,\\n attestation.refUUID,\\n attestation.data,\\n bump\\n )\\n );\\n }\\n\\n /**\\n * @dev Refunds remaining ETH amount to the attester.\\n *\\n * @param remainingValue The remaining ETH amount that was not sent to the resolver.\\n */\\n function _refund(uint256 remainingValue) private {\\n if (remainingValue > 0) {\\n // Using a regular transfer here might revert, for some non-EOA attesters, due to exceeding of the 2300\\n // gas limit which is why we're using call instead (via sendValue), which the 2300 gas limit does not\\n // apply for.\\n payable(msg.sender).sendValue(remainingValue);\\n }\\n }\\n\\n /**\\n * @dev Merges lists of UUIDs.\\n *\\n * @param uuidLists The provided lists of UUIDs.\\n * @param uuidsCount Total UUIDs count.\\n *\\n * @return A merged and flatten list of all the UUIDs.\\n */\\n function _mergeUUIDs(bytes32[][] memory uuidLists, uint256 uuidsCount) private pure returns (bytes32[] memory) {\\n bytes32[] memory uuids = new bytes32[](uuidsCount);\\n\\n uint256 currentIndex = 0;\\n for (uint256 i = 0; i < uuidLists.length; ) {\\n bytes32[] memory currentUuids = uuidLists[i];\\n for (uint256 j = 0; j < currentUuids.length; ) {\\n uuids[currentIndex] = currentUuids[j];\\n\\n unchecked {\\n ++j;\\n ++currentIndex;\\n }\\n }\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return uuids;\\n }\\n\\n /**\\n * @dev Returns the current's block timestamp. This method is overridden during tests and used to simulate the\\n * current block time.\\n */\\n function _time() internal view virtual returns (uint32) {\\n return uint32(block.timestamp);\\n }\\n}\\n\",\"keccak256\":\"0xe09db34dc57cbfb70128cc4f8287eb5c36f6f34fa22c9f932329bf81992ce18d\",\"license\":\"MIT\"},\"contracts/EIP712Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { EIP712 } from \\\"@openzeppelin/contracts/utils/cryptography/EIP712.sol\\\";\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\n// prettier-ignore\\nimport {\\n AttestationRequest,\\n AttestationRequestData,\\n DelegatedAttestationRequest,\\n DelegatedRevocationRequest,\\n RevocationRequest,\\n RevocationRequestData\\n} from \\\"./IEAS.sol\\\";\\n\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @title EIP712 typed signatures verifier for EAS delegated attestations.\\n */\\nabstract contract EIP712Verifier is EIP712 {\\n error InvalidSignature();\\n\\n // The hash of the data type used to relay calls to the attest function. It's the value of\\n // keccak256(\\\"Attest(bytes32 schema,address recipient,uint32 expirationTime,bool revocable,bytes32 refUUID,bytes data,uint256 nonce)\\\").\\n bytes32 private constant ATTEST_TYPEHASH = 0x790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce9;\\n\\n // The hash of the data type used to relay calls to the revoke function. It's the value of\\n // keccak256(\\\"Revoke(bytes32 schema,bytes32 uuid,uint256 nonce)\\\").\\n bytes32 private constant REVOKE_TYPEHASH = 0xf4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e;\\n\\n // Replay protection nonces.\\n mapping(address => uint256) private _nonces;\\n\\n /**\\n * @dev Creates a new EIP712Verifier instance.\\n *\\n * @param version The current major version of the signing domain\\n */\\n constructor(string memory version) EIP712(\\\"EAS\\\", version) {}\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signatures for attest, and revoke.\\n */\\n function getDomainSeparator() external view returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev Returns the current nonce per-account.\\n *\\n * @param account The requested account.\\n *\\n * @return The current nonce.\\n */\\n function getNonce(address account) external view returns (uint256) {\\n return _nonces[account];\\n }\\n\\n /**\\n * Returns the EIP712 type hash for the attest function.\\n */\\n function getAttestTypeHash() external pure returns (bytes32) {\\n return ATTEST_TYPEHASH;\\n }\\n\\n /**\\n * Returns the EIP712 type hash for the revoke function.\\n */\\n function getRevokeTypeHash() external pure returns (bytes32) {\\n return REVOKE_TYPEHASH;\\n }\\n\\n /**\\n * @dev Verifies delegated attestation request.\\n *\\n * @param request The arguments of the delegated attestation request.\\n */\\n function _verifyAttest(DelegatedAttestationRequest memory request) internal {\\n AttestationRequestData memory data = request.data;\\n EIP712Signature memory signature = request.signature;\\n\\n uint256 nonce;\\n unchecked {\\n nonce = _nonces[request.attester]++;\\n }\\n\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n ATTEST_TYPEHASH,\\n request.schema,\\n data.recipient,\\n data.expirationTime,\\n data.revocable,\\n data.refUUID,\\n keccak256(data.data),\\n nonce\\n )\\n )\\n );\\n\\n if (ECDSA.recover(digest, signature.v, signature.r, signature.s) != request.attester) {\\n revert InvalidSignature();\\n }\\n }\\n\\n /**\\n * @dev Verifies delegated revocation request.\\n *\\n * @param request The arguments of the delegated revocation request.\\n */\\n function _verifyRevoke(DelegatedRevocationRequest memory request) internal {\\n RevocationRequestData memory data = request.data;\\n EIP712Signature memory signature = request.signature;\\n\\n uint256 nonce;\\n unchecked {\\n nonce = _nonces[request.revoker]++;\\n }\\n\\n bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(REVOKE_TYPEHASH, request.schema, data.uuid, nonce)));\\n\\n if (ECDSA.recover(digest, signature.v, signature.r, signature.s) != request.revoker) {\\n revert InvalidSignature();\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0ad840e469fb35721d2c2baae9249a7508147037e8b1dc1c463ccfedea1cd56d\",\"license\":\"MIT\"},\"contracts/IEAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaRegistry } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @dev A struct representing a single attestation.\\n */\\nstruct Attestation {\\n bytes32 uuid; // A unique identifier of the attestation.\\n bytes32 schema; // The unique identifier of the schema.\\n bytes32 refUUID; // The UUID of the related attestation.\\n uint32 time; // The time when the attestation was created (Unix timestamp).\\n uint32 expirationTime; // The time when the attestation expires (Unix timestamp).\\n uint32 revocationTime; // The time when the attestation was revoked (Unix timestamp).\\n address recipient; // The recipient of the attestation.\\n address attester; // The attester/sender of the attestation.\\n bool revocable; // Whether the attestation is revocable.\\n bytes data; // Custom attestation data.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the attestation request.\\n */\\nstruct AttestationRequestData {\\n address recipient; // The recipient of the attestation.\\n uint32 expirationTime; // The time when the attestation expires (Unix timestamp).\\n bool revocable; // Whether the attestation is revocable.\\n bytes32 refUUID; // The UUID of the related attestation.\\n bytes data; // Custom attestation data.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the attestation request.\\n */\\nstruct AttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the full delegated attestation request.\\n */\\nstruct DelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi attestation request.\\n */\\nstruct MultiAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi attestation request.\\n */\\nstruct MultiDelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the revocation request.\\n */\\nstruct RevocationRequestData {\\n bytes32 uuid; // The UUID of the attestation to revoke.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the revocation request.\\n */\\nstruct RevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the full delegated revocation request.\\n */\\nstruct DelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi revocation request.\\n */\\nstruct MultiRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi revocation request.\\n */\\nstruct MultiDelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service interface.\\n */\\ninterface IEAS {\\n /**\\n * @dev Triggered when an attestation has been made.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param uuid The UUID the revoked attestation.\\n * @param schema The UUID of the schema.\\n */\\n event Attested(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Triggered when an attestation has been revoked.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param schema The UUID of the schema.\\n * @param uuid The UUID the revoked attestation.\\n */\\n event Revoked(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Returns the address of the global schema registry.\\n *\\n * @return The address of the global schema registry.\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry);\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param request The arguments of the attestation request.\\n *\\n * Example:\\n *\\n * attest({\\n * schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\",\\n * data: {\\n * recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\",\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\",\\n * data: \\\"0xF00D\\\",\\n * value: 0\\n * }\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attest(AttestationRequest calldata request) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to a specific schema via the provided EIP712 signature.\\n *\\n * @param delegatedRequest The arguments of the delegated attestation request.\\n *\\n * Example:\\n *\\n * attestByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * signature: {\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e'\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi attestation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttest([{\\n * schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 1000\\n * },\\n * {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f',\\n * data: '0x12345678',\\n * value: 0\\n * },\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Attests to multiple schemas using via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttestByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * {\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4'\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * Example:\\n *\\n * revoke({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d',\\n * value: 0\\n * }\\n * })\\n *\\n * @param request The arguments of the revocation request.\\n */\\n function revoke(RevocationRequest calldata request) external payable;\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema via the provided EIP712 signature.\\n *\\n * Example:\\n *\\n * revokeByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba',\\n * value: 0\\n * },\\n * signature: {\\n * v: 27,\\n * r: '0xb593...7142',\\n * s: '0x0f5b...2cce'\\n * },\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * })\\n *\\n * @param delegatedRequest The arguments of the delegated revocation request.\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi revocation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevoke([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019',\\n * value: 0\\n * },\\n * }])\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi revocation attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevokeByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * }])\\n *\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable;\\n\\n /**\\n * @dev Returns an existing attestation by UUID.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return The attestation data members.\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory);\\n\\n /**\\n * @dev Checks whether an attestation exists.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return Whether an attestation exists.\\n */\\n function isAttestationValid(bytes32 uuid) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x41f8ee4011dc8303b671784ce243a655c2a86bce1f18f07aaf786ed0a757df6f\",\"license\":\"MIT\"},\"contracts/ISchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title A struct representing a record for a submitted schema.\\n */\\nstruct SchemaRecord {\\n bytes32 uuid; // The unique identifier of the schema.\\n ISchemaResolver resolver; // Optional schema resolver.\\n bool revocable; // Whether the schema allows revocations explicitly.\\n string schema; // Custom specification of the schema (e.g., an ABI).\\n}\\n\\n/**\\n * @title The global schema registry interface.\\n */\\ninterface ISchemaRegistry {\\n /**\\n * @dev Triggered when a new schema has been registered\\n *\\n * @param uuid The schema UUID.\\n * @param registerer The address of the account used to register the schema.\\n */\\n event Registered(bytes32 indexed uuid, address registerer);\\n\\n /**\\n * @dev Submits and reserves a new schema\\n *\\n * @param schema The schema data schema.\\n * @param resolver An optional schema resolver.\\n * @param revocable Whether the schema allows revocations explicitly.\\n *\\n * @return The UUID of the new schema.\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32);\\n\\n /**\\n * @dev Returns an existing schema by UUID\\n *\\n * @param uuid The UUID of the schema to retrieve.\\n *\\n * @return The schema data members.\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory);\\n}\\n\",\"keccak256\":\"0xe38a6575a35f4459556f1dcdd16b6257d38d7f907a3cf8d669724541f6dad3aa\",\"license\":\"MIT\"},\"contracts/Types.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\n// A representation of an empty/uninitialized UUID.\\nbytes32 constant EMPTY_UUID = 0;\\n\\n/**\\n * @dev A struct representing EIP712 signature data.\\n */\\nstruct EIP712Signature {\\n uint8 v; // The recovery ID.\\n bytes32 r; // The x-coordinate of the nonce R.\\n bytes32 s; // The signature data.\\n}\\n\",\"keccak256\":\"0xda035d575e6fc7f857a23b795ca7cd7d9eb306f068224271ac0fec03e433de94\",\"license\":\"MIT\"},\"contracts/resolver/ISchemaResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Attestation } from \\\"../IEAS.sol\\\";\\n\\n/**\\n * @title The interface of an optional schema resolver.\\n */\\ninterface ISchemaResolver {\\n /**\\n * @dev Returns whether the resolver supports ETH transfers.\\n */\\n function isPayable() external pure returns (bool);\\n\\n /**\\n * @dev Processes an attestation and verifies whether it's valid.\\n *\\n * @param attestation The new attestation.\\n *\\n * @return Whether the attestation is valid.\\n */\\n function attest(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes multiple attestations and verifies whether they are valid.\\n *\\n * @param attestations The new attestations.\\n * @param values Explicit ETH amounts which were sent with each attestation.\\n *\\n * @return Whether all the attestations are valid.\\n */\\n function multiAttest(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n\\n /**\\n * @dev Processes an attestation revocation and verifies if it can be revoked.\\n *\\n * @param attestation The existing attestation to be revoked.\\n *\\n * @return Whether the attestation can be revoked.\\n */\\n function revoke(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes revocation of multiple attestation and verifies they can be revoked.\\n *\\n * @param attestations The existing attestations to be revoked.\\n * @param values Explicit ETH amounts which were sent with each revocation.\\n *\\n * @return Whether the attestations can be revoked.\\n */\\n function multiRevoke(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x070836a283c69af79de3a0c5319680d1cebc137c7e984fb3221269a75c29d2c2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x61016034620001b657601f62004ad338819003918201601f19168301926001600160401b0392909183851183861017620001a0578160209284926040978852833981010312620001b657516001600160a01b03811692838203620001b6578051926200006b84620001bb565b6004845260208401631817191960e11b81526003602084516200008e81620001bb565b828152016245415360e81b81522094519020948460e052610100958087524660a052835160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f978884528683015260608201524660808201523060a082015260a0815260c081019381851090851117620001a0578385525190206080523060c0526101209485521562000191575061014091825251916148fb9384620001d8853960805184614371015260a0518461442c015260c05184614342015260e051846143c0015251836143e60152518261439d0152518181816101a001528181610d170152818161154b0152818161280c01528181612ec801526131370152f35b6311a1e69760e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b03821117620001a05760405256fe61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611bce5750806316bc31ff14611461578063195bf9af14610bb65780632d0335ab14610b4e5780634692626714610af05780634cb7e9e5146109ee578063706c190a146108e9578063a3112a6414610882578063b83010d314610829578063e30bb563146107d5578063e45d03f91461059b578063e57a6b1b14610497578063ed24911d14610456578063ee5ad0f2146101c4578063f10b5cc8146101555763ffa1ad74146100d057600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505761014c60405161010e81611e04565b600481527f302e3232000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611cd5565b0390f35b600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff81116101505761020e903690600401611c46565b610217816120ba565b916000918291345b82841061023f5761014c61023386886142be565b60405191829182611c77565b9091929361024e858585612261565b61025b6020820182612161565b90918115801561043e575b61041457908491888860005b8481106102fd5750936102d6936102cd936102c660019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020990114946102be60608401612099565b9336916121b5565b903561279a565b94855190612225565b930180516102e4888a611f78565b526102ef8789611f78565b50515101940192919061021f565b9293945050506103128160051b850185611f38565b9061032060408401846122a1565b8293919310156103e55761033660608501612099565b926040519081608081011067ffffffffffffffff6080840111176103b65760019461039a73ffffffffffffffffffffffffffffffffffffffff926103896103aa96608087016040528a3587523690611f8c565b60208601523690606088020161205b565b6040840152166060820152614452565b01908888879493610272565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b5061044c60408201826122a1565b9050821415610266565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061048f61432b565b604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576040516104cd81611db0565b6004358082526104dc36612344565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c3601126101505760405161051781611de8565b60643560ff81168103610150578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff811681036101505761056d83826060610599960152614828565b6105756122f5565b61057e36612344565b61058782611f6b565b5261059181611f6b565b503492612e7b565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff600435818111610150576105e883913690600401611c46565b909234926000915b8383106105f957005b610604838588612261565b94608086360312610150576040519561061c87611db0565b803587528381013583811161015057810194601f953687820112156101505761064b903690878135910161238a565b928589019384526040830135858111610150578301963690880112156101505786359461067786611eb8565b97610685604051998a611e3d565b868952878901886060809902830101913683116101505789808a9201925b8484106107bd57505090506106c1915060408c01958a875201611c25565b94868b019586525197885180159182156107b1575b50506104145760005b8851811015610747576001906107418c516106fa838d611f78565b51610706848a51611f78565b5173ffffffffffffffffffffffffffffffffffffffff8b5116916040519361072d85611db0565b84528d84015260408301528a820152614828565b016106df565b509860019550819350906107a1929a976107a79592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916130e9565b90612225565b95019194936105f0565b51141590508c806106d6565b6107c7368561205b565b8152019101908989916106a3565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061081f6004356000526001602052604060002054151590565b6040519015158152f35b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576108b96123fc565b50600435600052600160205261014c6108d5604060002061249a565b604051918291602083526020830190611d18565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff811161015057610934903690600401611c46565b610940819392936120ba565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b8086106109815761014c610233888a6142be565b909192939495600190856109c56109bc8a888861099f838a8f612121565b6102c66109ae88830183612161565b9390951494339336916121b5565b96875190612225565b950180516109d38a8c611f78565b526109de898b611f78565b505151019601949392919061096d565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff9060043582811161015057610a3b903690600401611c46565b929091600090345b858310610a4c57005b610a57838787612121565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561015057810191823592868411610150578401928060061b3603841361015057600193826107a192610ae895610ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161238a565b90356130e9565b920191610a43565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057610599610b256122f5565b610b2e36612344565b610b3782611f6b565b52610b4181611f6b565b5034903390600435612e7b565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043573ffffffffffffffffffffffffffffffffffffffff81168091036101505760005260006020526020604060002054604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101505760043567ffffffffffffffff81116101505760c0816004019282360301126101505760405190610c1082611db0565b82358252602481019182359167ffffffffffffffff83116101505760a4610c7091610c44610ca59560043691840101611f8c565b6020850152610c56366044830161205b565b60408501520191610c6683611c25565b6060820152614452565b610c8c610c7b611ed0565b93610c87369187611f38565b611f8c565b610c9584611f6b565b52610c9f83611f6b565b50612099565b90610cae6125f0565b50805190610cba6125f0565b60c052610cc68261260a565b602060c05101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561145557600060a052611430575b5060a0515115611406579091610d5e8361272d565b60e052610d6a8361260a565b6080526000915b838310610da757610d8a3460805160e05160a0516133b7565b60c051526020610d9e8160c0510151611f6b565b51604051908152f35b610db18382611f78565b519063ffffffff60208301511680151590816113f5575b506113cb57604060a051015115806113be575b6113945760608201519463ffffffff60208401511673ffffffffffffffffffffffffffffffffffffffff845116604085015115159060808601519260405199610e238b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c0880151610f64609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b8301918860e01b1690820152036075810184520182611e3d565b51902080600052600160205260406000205415610f8a575060010163ffffffff16610e7b565b9195929496905081815281600052600160205260406000208151815560208201516001820155604082015160028201556003810163ffffffff6060840151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608087015160201b1692161717815561105163ffffffff60a08501511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08301516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff82116103b6576111206005840154612447565b601f811161134d575b50602090601f8311600114611283576005929160009183611278575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b60608401518061122c575b5060019373ffffffffffffffffffffffffffffffffffffffff916111a98560e051611f78565b526111b68460e051611f78565b5060a08101516111c885608051611f78565b52826111da85602060c0510151611f78565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a401919290610d71565b611243906000526001602052604060002054151590565b1561124e5788611183565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b015190508c80611145565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106113355750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060059716106112fe575b505050811b01910155611178565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80806112f0565b91926020600181928685015181550194019201611294565b600584016000526020600020601f840160051c81016020851061138d575b601f830160051c82018110611381575050611129565b6000815560010161136b565b508061136b565b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408201511515610ddb565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905063ffffffff4216101587610dc8565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b61144c903d806000833e6114448183611e3d565b810190612666565b60a05284610d49565b6040513d6000823e3d90fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610150576004359067ffffffffffffffff821161015057604082600401918336030112610150576114c96114ba611ed0565b92610c87602436920184611f38565b6114d283611f6b565b526114dc82611f6b565b506114e56125f0565b508151916114f16125f0565b916114fb8461260a565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa94851561145557600095611bb1575b50845115611406579161158e8361272d565b916115988461260a565b936000925b8184106115c0576020610d9e81896115b7348b8b8f6133b7565b81520151611f6b565b6115d284829994969893959799611f78565b519263ffffffff6020850151168015159081611ba0575b506113cb5760408101511580611b93575b6113945760608401519463ffffffff60208601511673ffffffffffffffffffffffffffffffffffffffff8651166040870151151590608088015192604051996116428b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c08901523360e089015261010088015261012087015260005b602087015160c0880151611753609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415611779575060010163ffffffff16611684565b91969050999791999896949293988181528160005260016020526040600020908051825560208101516001830155604081015160028301556003820163ffffffff6060830151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608086015160201b1692161717815561184863ffffffff60a08401511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08201516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff83116103b657838c938c938f96600561191e910154612447565b601f8111611b1f575b50602090601f8311600114611a42576005929160009183611a37575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180611a0c575b5085602073ffffffffffffffffffffffffffffffffffffffff95600199956119b984876119d1976119b3838e9b611f78565b52611f78565b506119c98460a089015192611f78565b520151611f78565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a401929061159d565b91509250611a2891506000526001602052604060002054151590565b1561124e5788888b928e611981565b015190503880611943565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611af45750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610611abd575b505050811b01910155611976565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080611aaf565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693611a53565b9295509295509250600584016000526020600020601f840160051c810160208510611b8c575b928f9693928f9693928f96935b601f830160051c82018110611b68575050611927565b60019396995080929598506000919497505501928f9693928f9693928f9693611b52565b5080611b45565b50604084015115156115fa565b905063ffffffff421610158a6115e9565b611bc79195503d806000833e6114448183611e3d565b938561157c565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057807f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce960209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361015057565b9181601f840112156101505782359167ffffffffffffffff8311610150576020808501948460051b01011161015057565b6020908160408183019282815285518094520193019160005b828110611c9e575050505090565b835185529381019392810192600101611c90565b60005b838110611cc55750506000910152565b8181015183820152602001611cb5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611d1181518092818752878088019101611cb2565b0116010190565b90611dad9180518252602081015160208301526040810151604083015263ffffffff80606083015116606084015280608083015116608084015260a08201511660a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611cd5565b90565b6080810190811067ffffffffffffffff8211176103b657604052565b60c0810190811067ffffffffffffffff8211176103b657604052565b6060810190811067ffffffffffffffff8211176103b657604052565b6040810190811067ffffffffffffffff8211176103b657604052565b610140810190811067ffffffffffffffff8211176103b657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103b657604052565b67ffffffffffffffff81116103b657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116103b65760051b60200190565b604090815191611edf83611e04565b60018352829160005b602080821015611f3057835160209291611f0182611dcc565b6000825260008183015260008683015260606000818401526080830152600060a0830152828801015201611ee8565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610150570190565b8051156103e55760200190565b80518210156103e55760209160051b010190565b919060c083820312610150576040519067ffffffffffffffff9060c08301828111848210176103b6576040528294611fc381611c25565b84526020928382013563ffffffff811681036101505784860152604082013580151581036101505760408601526060820135606086015260808201359081116101505781019180601f840112156101505782359261202084611e7e565b9161202e6040519384611e3d565b84835285858301011161015057848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101505760405161207381611de8565b8092803560ff811681036101505760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101505790565b906120c482611eb8565b6120d16040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120ff8294611eb8565b019060005b82811061211057505050565b806060602080938501015201612104565b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff821161015057602001918160051b3603831361015057565b929190926121c284611eb8565b916121d06040519384611e3d565b829480845260208094019060051b8301928284116101505780915b8483106121fa57505050505050565b823567ffffffffffffffff811161015057869161221a8684938601611f8c565b8152019201916121eb565b9190820391821161223257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff82116101505760200191606082023603831361015057565b60409081519161230483611e04565b600183528291600091825b60208082101561233b5782516020929161232882611e04565b868252868183015282890101520161230f565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610150576040519061237b82611e04565b60243582526044356020830152565b92919261239682611eb8565b6040926123a584519283611e3d565b819581835260208093019160061b84019381851161015057915b8483106123ce57505050505050565b85838303126101505783869182516123e581611e04565b8535815282860135838201528152019201916123bf565b6040519061240982611e20565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612490575b602083101461246157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612456565b90604051916124a883611e20565b82815481526001600581840154936020948585015260028101546040850152600381015463ffffffff80821660608701528082881c1660808701528160401c1660a086015260601c60c085015260ff600482015473ffffffffffffffffffffffffffffffffffffffff811660e087015260a01c161515610100850152019060405193849260009281549161253b83612447565b808752928281169081156125b0575060011461256a575b505050506101209291612566910384611e3d565b0152565b60009081528381209695945091905b8183106125985750939450919250908201018161256661012038612552565b86548884018501529586019587945091830191612579565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b83010190508161256661012038612552565b604051906125fd82611e04565b6060602083600081520152565b9061261482611eb8565b6126216040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061264f8294611eb8565b0190602036910137565b5190811515820361015057565b906020808383031261015057825167ffffffffffffffff93848211610150570192608084840312610150576040519361269e85611db0565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361015057838601526126d360408201612659565b60408601526060810151918211610150570182601f82011215610150578051906126fc82611e7e565b9361270a6040519586611e3d565b82855283838301011161015057826127259385019101611cb2565b606082015290565b9061273782611eb8565b6127446040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06127728294611eb8565b019060005b82811061278357505050565b60209061278e6123fc565b82828501015201612777565b92909493916127a76125f0565b508551936127b36125f0565b946127bd8161260a565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa91821561145557600092612e5e575b5081511561140657929790916128528461272d565b9861285c8561260a565b946000935b81851061287e5750505050509561287994959661361e565b815290565b919593989496999092976128928a84611f78565b519a63ffffffff60208d0151168015159081612e4d575b506113cb5760408901511580612e40575b61139457899860608d01518d602081015163ffffffff16815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f9061290682611e20565b600082526020820152604001528d4263ffffffff1660608201526080015260a08d016000905260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612a2d609560c08301519260e08101519060608101516080820151916101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415612a53575060010163ffffffff1661295c565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155604085015160028401556003830163ffffffff6060870151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff0000000060808a015160201b16921617178155612b2563ffffffff60a08801511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08601516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff81116103b6578894612bf66005840154612447565b601f8111612de5575b50602090601f8311600114612d18576005929160009183612d0d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612ce0575b5086602073ffffffffffffffffffffffffffffffffffffffff959487946119b9848660019e6119b383612c8e9a611f78565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612861565b92505050612cfd9193506000526001602052604060002054151590565b1561124e5785918d8b8b38612c5c565b015190503880612c1b565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612dca5750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610612d93575b505050811b01910155612c4e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612d85565b8183015184558c985060019093019260209283019201612d29565b90919293949550600584016000526020600020601f840160051c810160208510612e39575b908b979695949392915b601f830160051c82018110612e2a575050612bff565b600081558c9850600101612e14565b5080612e0a565b5060408c015115156128ba565b905063ffffffff42161015386128a9565b612e749192503d806000833e6114448183611e3d565b903861283d565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916130ce575b50805115611406578251612f0c8161272d565b92612f168261260a565b9460005b838110612f305750505050611dad9495506137ff565b612f3a8183611f78565b51908151600052600160205260406000209182541561124e578460018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff0000000000000000161790556001928c91612ffe8261249a565b613008858c611f78565b52613013848b611f78565b506020810151613023858d611f78565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87600386015460601c9451950154956040519586521693a401612f1a565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6130e391503d806000833e6114448183611e3d565b38612ef9565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916132e8575b5080511561140657865161317b8161272d565b926131858261260a565b9460005b83811061319f5750505050611dad9596506139fe565b6131a9818c611f78565b51908151600052600160205260406000209182541561124e578360018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff00000000000000001617905560019261326b8161249a565b613275848b611f78565b52613280838a611f78565b506020820151613290848c611f78565b5283600382015460601c9251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613189565b6132fd91503d806000833e6114448183611e3d565b38613168565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061336c57505050508281830391015281808451928381520193019160005b828110613358575050505090565b83518552938101939281019260010161334a565b909192959485806133a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611d18565b9798019493919091019101613329565b9092918351936001908186146135fd5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156135cd579560009687915b8083106134bf575050509183929161343a9492876040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613488575b5090501561345e57611dad9061418f565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116134b8575b61349c8183611e3d565b810103126134b557506134ae90612659565b803861344d565b80fd5b503d613492565b909197966134cd8987611f78565b5180151580613547575b61351d578181116134f3578084920398019801909190916133f1565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161358e575b50156134d7565b908982813d83116135bc575b6135a48183611e3d565b810103126134b557506135b690612659565b38613587565b503d61359a565b513d6000823e3d90fd5b9594505050905060005b8281106135e75750505050600090565b6135f18183611f78565b5161351d5783016135d7565b611dad9550613617915061361090611f6b565b5191611f6b565b5191613bd6565b9093918451946001908187146137e25773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137b1579660009788915b80831061370157505050918392916136a19492886040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916136cd575b5090501561345e576136c4575090565b611dad9061418f565b82813d83116136fa575b6136e18183611e3d565b810103126134b557506136f390612659565b80386136b4565b503d6136d7565b9091989761370f8a87611f78565b5180151580613735575b61351d578181116134f357808492039901990190919091613658565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161377c575b5015613719565b908982813d83116137aa575b6137928183611e3d565b810103126134b557506137a490612659565b38613775565b503d613788565b969550505091505060005b8281106137cc5750505050600090565b6137d68183611f78565b5161351d5783016137bc565b611dad96506137f8915061361090959495611f6b565b5191613d5d565b9092918351936001908186146139e45773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139b4579560009687915b80831061390457505050918392916138829492876040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916138d0575b509050156138a657611dad9061418f565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d83116138fd575b6138e48183611e3d565b810103126134b557506138f690612659565b8038613895565b503d6138da565b909197966139128987611f78565b5180151580613938575b61351d578181116134f357808492039801980190919091613839565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161397f575b501561391c565b908982813d83116139ad575b6139958183611e3d565b810103126134b557506139a790612659565b38613978565b503d61398b565b9594505050905060005b8281106139ce5750505050600090565b6139d88183611f78565b5161351d5783016139be565b611dad95506139f7915061361090611f6b565b5191613ec5565b909391845194600190818714613bb95773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613b88579660009788915b808310613ad85750505091839291613a819492886040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613aa4575b509050156138a6576136c4575090565b82813d8311613ad1575b613ab88183611e3d565b810103126134b55750613aca90612659565b8038613a94565b503d613aae565b90919897613ae68a87611f78565b5180151580613b0c575b61351d578181116134f357808492039901990190919091613a38565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c35750600091613b53575b5015613af0565b908982813d8311613b81575b613b698183611e3d565b810103126134b55750613b7b90612659565b38613b4c565b503d613b5f565b969550505091505060005b828110613ba35750505050600090565b613bad8183611f78565b5161351d578301613b93565b611dad9650613bcf915061361090959495611f6b565b519161403f565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613cd6575b61351d578385116134f357613c52829186946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613ca2575b50905015613c785781611dad910361418f565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613ccf575b613cb68183611e3d565b810103126134b55750613cc890612659565b8038613c65565b503d613cac565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613d1b575b5015613c04565b908382813d8311613d49575b613d318183611e3d565b810103126134b55750613d4390612659565b38613d14565b503d613d27565b5050505061351d57600090565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580613e3d575b61351d578486116134f357613dd9829187946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613e09575b50905015613c78578290613dff57505090565b611dad910361418f565b82813d8311613e36575b613e1d8183611e3d565b810103126134b55750613e2f90612659565b8038613dec565b503d613e13565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613e82575b5015613d8b565b908382813d8311613eb0575b613e988183611e3d565b810103126134b55750613eaa90612659565b38613e7b565b503d613e8e565b505050505061351d57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613fc5575b61351d578385116134f357613f41829186946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613f91575b50905015613f675781611dad910361418f565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613fbe575b613fa58183611e3d565b810103126134b55750613fb790612659565b8038613f54565b503d613f9b565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161400a575b5015613ef3565b908382813d8311614038575b6140208183611e3d565b810103126134b5575061403290612659565b38614003565b503d614016565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580614115575b61351d578486116134f3576140bb829187946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af1908115611455576000916140e1575b50905015613f67578290613dff57505090565b82813d831161410e575b6140f58183611e3d565b810103126134b5575061410790612659565b80386140ce565b503d6140eb565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161415a575b501561406d565b908382813d8311614188575b6141708183611e3d565b810103126134b5575061418290612659565b38614153565b503d614166565b806141975750565b80471061426057600080808093335af13d1561425b573d6141b781611e7e565b906141c56040519283611e3d565b8152600060203d92013e5b156141d757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b6141d0565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906142c89061260a565b60009283925b805184101561432357936142e28486611f78565b519160005b8351811015614312576142fa8185611f78565b516143058487611f78565b52600192830192016142e7565b5090946001909401939091506142ce565b509250905090565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614429575b15614393577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815261442381611dcc565b51902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461436a565b602080820151906040928381015192606082019073ffffffffffffffffffffffffffffffffffffffff93848351166000526000815286600020938454946001860190555193858351169263ffffffff83820151169089810151151560806060830151920151858151910120928b5196868801997f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce98b528d8901526060880152608087015260a086015260c085015260e08401526101009081840152825261012082019582871067ffffffffffffffff8811176103b65761453f86956145539461455b998b525190206147c5565b918860ff8351169183015192015192614729565b949094614590565b51169116036145675750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156146fa57806145a15750565b600181036146075760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b6002810361466d5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461467657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083116147b95791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa156147ac57815173ffffffffffffffffffffffffffffffffffffffff8116156147a6579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b6147cd61432b565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176103b65760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff8711176103b6576148d985946145539361455b988a525190206147c5565b9060ff8151168860208301519201519261472956fea164736f6c6343000811000a", - "deployedBytecode": "0x61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611bce5750806316bc31ff14611461578063195bf9af14610bb65780632d0335ab14610b4e5780634692626714610af05780634cb7e9e5146109ee578063706c190a146108e9578063a3112a6414610882578063b83010d314610829578063e30bb563146107d5578063e45d03f91461059b578063e57a6b1b14610497578063ed24911d14610456578063ee5ad0f2146101c4578063f10b5cc8146101555763ffa1ad74146100d057600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505761014c60405161010e81611e04565b600481527f302e3232000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611cd5565b0390f35b600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff81116101505761020e903690600401611c46565b610217816120ba565b916000918291345b82841061023f5761014c61023386886142be565b60405191829182611c77565b9091929361024e858585612261565b61025b6020820182612161565b90918115801561043e575b61041457908491888860005b8481106102fd5750936102d6936102cd936102c660019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020990114946102be60608401612099565b9336916121b5565b903561279a565b94855190612225565b930180516102e4888a611f78565b526102ef8789611f78565b50515101940192919061021f565b9293945050506103128160051b850185611f38565b9061032060408401846122a1565b8293919310156103e55761033660608501612099565b926040519081608081011067ffffffffffffffff6080840111176103b65760019461039a73ffffffffffffffffffffffffffffffffffffffff926103896103aa96608087016040528a3587523690611f8c565b60208601523690606088020161205b565b6040840152166060820152614452565b01908888879493610272565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b5061044c60408201826122a1565b9050821415610266565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061048f61432b565b604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576040516104cd81611db0565b6004358082526104dc36612344565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c3601126101505760405161051781611de8565b60643560ff81168103610150578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff811681036101505761056d83826060610599960152614828565b6105756122f5565b61057e36612344565b61058782611f6b565b5261059181611f6b565b503492612e7b565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff600435818111610150576105e883913690600401611c46565b909234926000915b8383106105f957005b610604838588612261565b94608086360312610150576040519561061c87611db0565b803587528381013583811161015057810194601f953687820112156101505761064b903690878135910161238a565b928589019384526040830135858111610150578301963690880112156101505786359461067786611eb8565b97610685604051998a611e3d565b868952878901886060809902830101913683116101505789808a9201925b8484106107bd57505090506106c1915060408c01958a875201611c25565b94868b019586525197885180159182156107b1575b50506104145760005b8851811015610747576001906107418c516106fa838d611f78565b51610706848a51611f78565b5173ffffffffffffffffffffffffffffffffffffffff8b5116916040519361072d85611db0565b84528d84015260408301528a820152614828565b016106df565b509860019550819350906107a1929a976107a79592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916130e9565b90612225565b95019194936105f0565b51141590508c806106d6565b6107c7368561205b565b8152019101908989916106a3565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061081f6004356000526001602052604060002054151590565b6040519015158152f35b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576108b96123fc565b50600435600052600160205261014c6108d5604060002061249a565b604051918291602083526020830190611d18565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff811161015057610934903690600401611c46565b610940819392936120ba565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b8086106109815761014c610233888a6142be565b909192939495600190856109c56109bc8a888861099f838a8f612121565b6102c66109ae88830183612161565b9390951494339336916121b5565b96875190612225565b950180516109d38a8c611f78565b526109de898b611f78565b505151019601949392919061096d565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff9060043582811161015057610a3b903690600401611c46565b929091600090345b858310610a4c57005b610a57838787612121565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561015057810191823592868411610150578401928060061b3603841361015057600193826107a192610ae895610ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161238a565b90356130e9565b920191610a43565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057610599610b256122f5565b610b2e36612344565b610b3782611f6b565b52610b4181611f6b565b5034903390600435612e7b565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043573ffffffffffffffffffffffffffffffffffffffff81168091036101505760005260006020526020604060002054604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101505760043567ffffffffffffffff81116101505760c0816004019282360301126101505760405190610c1082611db0565b82358252602481019182359167ffffffffffffffff83116101505760a4610c7091610c44610ca59560043691840101611f8c565b6020850152610c56366044830161205b565b60408501520191610c6683611c25565b6060820152614452565b610c8c610c7b611ed0565b93610c87369187611f38565b611f8c565b610c9584611f6b565b52610c9f83611f6b565b50612099565b90610cae6125f0565b50805190610cba6125f0565b60c052610cc68261260a565b602060c05101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561145557600060a052611430575b5060a0515115611406579091610d5e8361272d565b60e052610d6a8361260a565b6080526000915b838310610da757610d8a3460805160e05160a0516133b7565b60c051526020610d9e8160c0510151611f6b565b51604051908152f35b610db18382611f78565b519063ffffffff60208301511680151590816113f5575b506113cb57604060a051015115806113be575b6113945760608201519463ffffffff60208401511673ffffffffffffffffffffffffffffffffffffffff845116604085015115159060808601519260405199610e238b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c0880151610f64609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b8301918860e01b1690820152036075810184520182611e3d565b51902080600052600160205260406000205415610f8a575060010163ffffffff16610e7b565b9195929496905081815281600052600160205260406000208151815560208201516001820155604082015160028201556003810163ffffffff6060840151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608087015160201b1692161717815561105163ffffffff60a08501511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08301516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff82116103b6576111206005840154612447565b601f811161134d575b50602090601f8311600114611283576005929160009183611278575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b60608401518061122c575b5060019373ffffffffffffffffffffffffffffffffffffffff916111a98560e051611f78565b526111b68460e051611f78565b5060a08101516111c885608051611f78565b52826111da85602060c0510151611f78565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a401919290610d71565b611243906000526001602052604060002054151590565b1561124e5788611183565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b015190508c80611145565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106113355750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060059716106112fe575b505050811b01910155611178565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80806112f0565b91926020600181928685015181550194019201611294565b600584016000526020600020601f840160051c81016020851061138d575b601f830160051c82018110611381575050611129565b6000815560010161136b565b508061136b565b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408201511515610ddb565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905063ffffffff4216101587610dc8565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b61144c903d806000833e6114448183611e3d565b810190612666565b60a05284610d49565b6040513d6000823e3d90fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610150576004359067ffffffffffffffff821161015057604082600401918336030112610150576114c96114ba611ed0565b92610c87602436920184611f38565b6114d283611f6b565b526114dc82611f6b565b506114e56125f0565b508151916114f16125f0565b916114fb8461260a565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa94851561145557600095611bb1575b50845115611406579161158e8361272d565b916115988461260a565b936000925b8184106115c0576020610d9e81896115b7348b8b8f6133b7565b81520151611f6b565b6115d284829994969893959799611f78565b519263ffffffff6020850151168015159081611ba0575b506113cb5760408101511580611b93575b6113945760608401519463ffffffff60208601511673ffffffffffffffffffffffffffffffffffffffff8651166040870151151590608088015192604051996116428b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c08901523360e089015261010088015261012087015260005b602087015160c0880151611753609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415611779575060010163ffffffff16611684565b91969050999791999896949293988181528160005260016020526040600020908051825560208101516001830155604081015160028301556003820163ffffffff6060830151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608086015160201b1692161717815561184863ffffffff60a08401511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08201516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff83116103b657838c938c938f96600561191e910154612447565b601f8111611b1f575b50602090601f8311600114611a42576005929160009183611a37575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180611a0c575b5085602073ffffffffffffffffffffffffffffffffffffffff95600199956119b984876119d1976119b3838e9b611f78565b52611f78565b506119c98460a089015192611f78565b520151611f78565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a401929061159d565b91509250611a2891506000526001602052604060002054151590565b1561124e5788888b928e611981565b015190503880611943565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611af45750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610611abd575b505050811b01910155611976565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080611aaf565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693611a53565b9295509295509250600584016000526020600020601f840160051c810160208510611b8c575b928f9693928f9693928f96935b601f830160051c82018110611b68575050611927565b60019396995080929598506000919497505501928f9693928f9693928f9693611b52565b5080611b45565b50604084015115156115fa565b905063ffffffff421610158a6115e9565b611bc79195503d806000833e6114448183611e3d565b938561157c565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057807f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce960209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361015057565b9181601f840112156101505782359167ffffffffffffffff8311610150576020808501948460051b01011161015057565b6020908160408183019282815285518094520193019160005b828110611c9e575050505090565b835185529381019392810192600101611c90565b60005b838110611cc55750506000910152565b8181015183820152602001611cb5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611d1181518092818752878088019101611cb2565b0116010190565b90611dad9180518252602081015160208301526040810151604083015263ffffffff80606083015116606084015280608083015116608084015260a08201511660a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611cd5565b90565b6080810190811067ffffffffffffffff8211176103b657604052565b60c0810190811067ffffffffffffffff8211176103b657604052565b6060810190811067ffffffffffffffff8211176103b657604052565b6040810190811067ffffffffffffffff8211176103b657604052565b610140810190811067ffffffffffffffff8211176103b657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103b657604052565b67ffffffffffffffff81116103b657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116103b65760051b60200190565b604090815191611edf83611e04565b60018352829160005b602080821015611f3057835160209291611f0182611dcc565b6000825260008183015260008683015260606000818401526080830152600060a0830152828801015201611ee8565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610150570190565b8051156103e55760200190565b80518210156103e55760209160051b010190565b919060c083820312610150576040519067ffffffffffffffff9060c08301828111848210176103b6576040528294611fc381611c25565b84526020928382013563ffffffff811681036101505784860152604082013580151581036101505760408601526060820135606086015260808201359081116101505781019180601f840112156101505782359261202084611e7e565b9161202e6040519384611e3d565b84835285858301011161015057848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101505760405161207381611de8565b8092803560ff811681036101505760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101505790565b906120c482611eb8565b6120d16040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120ff8294611eb8565b019060005b82811061211057505050565b806060602080938501015201612104565b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff821161015057602001918160051b3603831361015057565b929190926121c284611eb8565b916121d06040519384611e3d565b829480845260208094019060051b8301928284116101505780915b8483106121fa57505050505050565b823567ffffffffffffffff811161015057869161221a8684938601611f8c565b8152019201916121eb565b9190820391821161223257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff82116101505760200191606082023603831361015057565b60409081519161230483611e04565b600183528291600091825b60208082101561233b5782516020929161232882611e04565b868252868183015282890101520161230f565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610150576040519061237b82611e04565b60243582526044356020830152565b92919261239682611eb8565b6040926123a584519283611e3d565b819581835260208093019160061b84019381851161015057915b8483106123ce57505050505050565b85838303126101505783869182516123e581611e04565b8535815282860135838201528152019201916123bf565b6040519061240982611e20565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612490575b602083101461246157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612456565b90604051916124a883611e20565b82815481526001600581840154936020948585015260028101546040850152600381015463ffffffff80821660608701528082881c1660808701528160401c1660a086015260601c60c085015260ff600482015473ffffffffffffffffffffffffffffffffffffffff811660e087015260a01c161515610100850152019060405193849260009281549161253b83612447565b808752928281169081156125b0575060011461256a575b505050506101209291612566910384611e3d565b0152565b60009081528381209695945091905b8183106125985750939450919250908201018161256661012038612552565b86548884018501529586019587945091830191612579565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b83010190508161256661012038612552565b604051906125fd82611e04565b6060602083600081520152565b9061261482611eb8565b6126216040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061264f8294611eb8565b0190602036910137565b5190811515820361015057565b906020808383031261015057825167ffffffffffffffff93848211610150570192608084840312610150576040519361269e85611db0565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361015057838601526126d360408201612659565b60408601526060810151918211610150570182601f82011215610150578051906126fc82611e7e565b9361270a6040519586611e3d565b82855283838301011161015057826127259385019101611cb2565b606082015290565b9061273782611eb8565b6127446040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06127728294611eb8565b019060005b82811061278357505050565b60209061278e6123fc565b82828501015201612777565b92909493916127a76125f0565b508551936127b36125f0565b946127bd8161260a565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa91821561145557600092612e5e575b5081511561140657929790916128528461272d565b9861285c8561260a565b946000935b81851061287e5750505050509561287994959661361e565b815290565b919593989496999092976128928a84611f78565b519a63ffffffff60208d0151168015159081612e4d575b506113cb5760408901511580612e40575b61139457899860608d01518d602081015163ffffffff16815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f9061290682611e20565b600082526020820152604001528d4263ffffffff1660608201526080015260a08d016000905260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612a2d609560c08301519260e08101519060608101516080820151916101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415612a53575060010163ffffffff1661295c565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155604085015160028401556003830163ffffffff6060870151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff0000000060808a015160201b16921617178155612b2563ffffffff60a08801511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08601516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff81116103b6578894612bf66005840154612447565b601f8111612de5575b50602090601f8311600114612d18576005929160009183612d0d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612ce0575b5086602073ffffffffffffffffffffffffffffffffffffffff959487946119b9848660019e6119b383612c8e9a611f78565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612861565b92505050612cfd9193506000526001602052604060002054151590565b1561124e5785918d8b8b38612c5c565b015190503880612c1b565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612dca5750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610612d93575b505050811b01910155612c4e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612d85565b8183015184558c985060019093019260209283019201612d29565b90919293949550600584016000526020600020601f840160051c810160208510612e39575b908b979695949392915b601f830160051c82018110612e2a575050612bff565b600081558c9850600101612e14565b5080612e0a565b5060408c015115156128ba565b905063ffffffff42161015386128a9565b612e749192503d806000833e6114448183611e3d565b903861283d565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916130ce575b50805115611406578251612f0c8161272d565b92612f168261260a565b9460005b838110612f305750505050611dad9495506137ff565b612f3a8183611f78565b51908151600052600160205260406000209182541561124e578460018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff0000000000000000161790556001928c91612ffe8261249a565b613008858c611f78565b52613013848b611f78565b506020810151613023858d611f78565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87600386015460601c9451950154956040519586521693a401612f1a565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6130e391503d806000833e6114448183611e3d565b38612ef9565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916132e8575b5080511561140657865161317b8161272d565b926131858261260a565b9460005b83811061319f5750505050611dad9596506139fe565b6131a9818c611f78565b51908151600052600160205260406000209182541561124e578360018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff00000000000000001617905560019261326b8161249a565b613275848b611f78565b52613280838a611f78565b506020820151613290848c611f78565b5283600382015460601c9251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613189565b6132fd91503d806000833e6114448183611e3d565b38613168565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061336c57505050508281830391015281808451928381520193019160005b828110613358575050505090565b83518552938101939281019260010161334a565b909192959485806133a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611d18565b9798019493919091019101613329565b9092918351936001908186146135fd5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156135cd579560009687915b8083106134bf575050509183929161343a9492876040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613488575b5090501561345e57611dad9061418f565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116134b8575b61349c8183611e3d565b810103126134b557506134ae90612659565b803861344d565b80fd5b503d613492565b909197966134cd8987611f78565b5180151580613547575b61351d578181116134f3578084920398019801909190916133f1565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161358e575b50156134d7565b908982813d83116135bc575b6135a48183611e3d565b810103126134b557506135b690612659565b38613587565b503d61359a565b513d6000823e3d90fd5b9594505050905060005b8281106135e75750505050600090565b6135f18183611f78565b5161351d5783016135d7565b611dad9550613617915061361090611f6b565b5191611f6b565b5191613bd6565b9093918451946001908187146137e25773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137b1579660009788915b80831061370157505050918392916136a19492886040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916136cd575b5090501561345e576136c4575090565b611dad9061418f565b82813d83116136fa575b6136e18183611e3d565b810103126134b557506136f390612659565b80386136b4565b503d6136d7565b9091989761370f8a87611f78565b5180151580613735575b61351d578181116134f357808492039901990190919091613658565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161377c575b5015613719565b908982813d83116137aa575b6137928183611e3d565b810103126134b557506137a490612659565b38613775565b503d613788565b969550505091505060005b8281106137cc5750505050600090565b6137d68183611f78565b5161351d5783016137bc565b611dad96506137f8915061361090959495611f6b565b5191613d5d565b9092918351936001908186146139e45773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139b4579560009687915b80831061390457505050918392916138829492876040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916138d0575b509050156138a657611dad9061418f565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d83116138fd575b6138e48183611e3d565b810103126134b557506138f690612659565b8038613895565b503d6138da565b909197966139128987611f78565b5180151580613938575b61351d578181116134f357808492039801980190919091613839565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161397f575b501561391c565b908982813d83116139ad575b6139958183611e3d565b810103126134b557506139a790612659565b38613978565b503d61398b565b9594505050905060005b8281106139ce5750505050600090565b6139d88183611f78565b5161351d5783016139be565b611dad95506139f7915061361090611f6b565b5191613ec5565b909391845194600190818714613bb95773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613b88579660009788915b808310613ad85750505091839291613a819492886040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613aa4575b509050156138a6576136c4575090565b82813d8311613ad1575b613ab88183611e3d565b810103126134b55750613aca90612659565b8038613a94565b503d613aae565b90919897613ae68a87611f78565b5180151580613b0c575b61351d578181116134f357808492039901990190919091613a38565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c35750600091613b53575b5015613af0565b908982813d8311613b81575b613b698183611e3d565b810103126134b55750613b7b90612659565b38613b4c565b503d613b5f565b969550505091505060005b828110613ba35750505050600090565b613bad8183611f78565b5161351d578301613b93565b611dad9650613bcf915061361090959495611f6b565b519161403f565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613cd6575b61351d578385116134f357613c52829186946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613ca2575b50905015613c785781611dad910361418f565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613ccf575b613cb68183611e3d565b810103126134b55750613cc890612659565b8038613c65565b503d613cac565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613d1b575b5015613c04565b908382813d8311613d49575b613d318183611e3d565b810103126134b55750613d4390612659565b38613d14565b503d613d27565b5050505061351d57600090565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580613e3d575b61351d578486116134f357613dd9829187946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613e09575b50905015613c78578290613dff57505090565b611dad910361418f565b82813d8311613e36575b613e1d8183611e3d565b810103126134b55750613e2f90612659565b8038613dec565b503d613e13565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613e82575b5015613d8b565b908382813d8311613eb0575b613e988183611e3d565b810103126134b55750613eaa90612659565b38613e7b565b503d613e8e565b505050505061351d57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613fc5575b61351d578385116134f357613f41829186946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613f91575b50905015613f675781611dad910361418f565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613fbe575b613fa58183611e3d565b810103126134b55750613fb790612659565b8038613f54565b503d613f9b565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161400a575b5015613ef3565b908382813d8311614038575b6140208183611e3d565b810103126134b5575061403290612659565b38614003565b503d614016565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580614115575b61351d578486116134f3576140bb829187946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af1908115611455576000916140e1575b50905015613f67578290613dff57505090565b82813d831161410e575b6140f58183611e3d565b810103126134b5575061410790612659565b80386140ce565b503d6140eb565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161415a575b501561406d565b908382813d8311614188575b6141708183611e3d565b810103126134b5575061418290612659565b38614153565b503d614166565b806141975750565b80471061426057600080808093335af13d1561425b573d6141b781611e7e565b906141c56040519283611e3d565b8152600060203d92013e5b156141d757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b6141d0565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906142c89061260a565b60009283925b805184101561432357936142e28486611f78565b519160005b8351811015614312576142fa8185611f78565b516143058487611f78565b52600192830192016142e7565b5090946001909401939091506142ce565b509250905090565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614429575b15614393577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815261442381611dcc565b51902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461436a565b602080820151906040928381015192606082019073ffffffffffffffffffffffffffffffffffffffff93848351166000526000815286600020938454946001860190555193858351169263ffffffff83820151169089810151151560806060830151920151858151910120928b5196868801997f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce98b528d8901526060880152608087015260a086015260c085015260e08401526101009081840152825261012082019582871067ffffffffffffffff8811176103b65761453f86956145539461455b998b525190206147c5565b918860ff8351169183015192015192614729565b949094614590565b51169116036145675750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156146fa57806145a15750565b600181036146075760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b6002810361466d5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461467657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083116147b95791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa156147ac57815173ffffffffffffffffffffffffffffffffffffffff8116156147a6579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b6147cd61432b565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176103b65760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff8711176103b6576148d985946145539361455b988a525190206147c5565b9060ff8151168860208301519201519261472956fea164736f6c6343000811000a", - "devdoc": { - "kind": "dev", - "methods": { - "attest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)))": { - "details": "Attests to a specific schema.", - "params": { - "request": "The arguments of the attestation request. Example: attest({ schema: \"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\", data: { recipient: \"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\", expirationTime: 0, revocable: true, refUUID: \"0x0000000000000000000000000000000000000000000000000000000000000000\", data: \"0xF00D\", value: 0 } })" - }, - "returns": { - "_0": "The UUID of the new attestation." - } - }, - "attestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))": { - "details": "Attests to a specific schema via the provided EIP712 signature.", - "params": { - "delegatedRequest": "The arguments of the delegated attestation request. Example: attestByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, signature: { v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e' })" - }, - "returns": { - "_0": "The UUID of the new attestation." - } - }, - "constructor": { - "details": "Creates a new EAS instance.", - "params": { - "registry": "The address of the global schema registry." - } - }, - "getAttestation(bytes32)": { - "details": "Returns an existing attestation by UUID.", - "params": { - "uuid": "The UUID of the attestation to retrieve." - }, - "returns": { - "_0": "The attestation data members." - } - }, - "getDomainSeparator()": { - "details": "Returns the domain separator used in the encoding of the signatures for attest, and revoke." - }, - "getNonce(address)": { - "details": "Returns the current nonce per-account.", - "params": { - "account": "The requested account." - }, - "returns": { - "_0": "The current nonce." - } - }, - "getSchemaRegistry()": { - "details": "Returns the address of the global schema registry.", - "returns": { - "_0": "The address of the global schema registry." - } - }, - "isAttestationValid(bytes32)": { - "details": "Checks whether an attestation exists.", - "params": { - "uuid": "The UUID of the attestation to retrieve." - }, - "returns": { - "_0": "Whether an attestation exists." - } - }, - "multiAttest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[])[])": { - "details": "Attests to multiple schemas.", - "params": { - "multiRequests": "The arguments of the multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttest([{ schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 1000 }, { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 0, revocable: false, refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174', data: '0x00', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: true, refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f', data: '0x12345678', value: 0 }, }])" - }, - "returns": { - "_0": "The UUIDs of the new attestations." - } - }, - "multiAttestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])": { - "details": "Attests to multiple schemas using via provided EIP712 signatures.", - "params": { - "multiDelegatedRequests": "The arguments of the delegated multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttestByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, { recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: false, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x00', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4' }])" - }, - "returns": { - "_0": "The UUIDs of the new attestations." - } - }, - "multiRevoke((bytes32,(bytes32,uint256)[])[])": { - "details": "Revokes existing attestations to multiple schemas.", - "params": { - "multiRequests": "The arguments of the multi revocation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevoke([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019', value: 0 }, }])" - } - }, - "multiRevokeByDelegation((bytes32,(bytes32,uint256)[],(uint8,bytes32,bytes32)[],address)[])": { - "details": "Revokes existing attestations to multiple schemas via provided EIP712 signatures.", - "params": { - "multiDelegatedRequests": "The arguments of the delegated multi revocation attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevokeByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' }])" - } - }, - "revoke((bytes32,(bytes32,uint256)))": { - "details": "Revokes an existing attestation to a specific schema. Example: revoke({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d', value: 0 } })", - "params": { - "request": "The arguments of the revocation request." - } - }, - "revokeByDelegation((bytes32,(bytes32,uint256),(uint8,bytes32,bytes32),address))": { - "details": "Revokes an existing attestation to a specific schema via the provided EIP712 signature. Example: revokeByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba', value: 0 }, signature: { v: 27, r: '0xb593...7142', s: '0x0f5b...2cce' }, revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' })", - "params": { - "delegatedRequest": "The arguments of the delegated revocation request." - } - } - }, - "title": "EAS - Ethereum Attestation Service", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "getAttestTypeHash()": { - "notice": "Returns the EIP712 type hash for the attest function." - }, - "getRevokeTypeHash()": { - "notice": "Returns the EIP712 type hash for the revoke function." - } - }, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 3940, - "contract": "contracts/EAS.sol:EAS", - "label": "_nonces", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 2368, - "contract": "contracts/EAS.sol:EAS", - "label": "_db", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_bytes32,t_struct(Attestation)4162_storage)" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_bytes_storage": { - "encoding": "bytes", - "label": "bytes", - "numberOfBytes": "32" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_mapping(t_bytes32,t_struct(Attestation)4162_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct Attestation)", - "numberOfBytes": "32", - "value": "t_struct(Attestation)4162_storage" - }, - "t_struct(Attestation)4162_storage": { - "encoding": "inplace", - "label": "struct Attestation", - "members": [ - { - "astId": 4143, - "contract": "contracts/EAS.sol:EAS", - "label": "uuid", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 4145, - "contract": "contracts/EAS.sol:EAS", - "label": "schema", - "offset": 0, - "slot": "1", - "type": "t_bytes32" - }, - { - "astId": 4147, - "contract": "contracts/EAS.sol:EAS", - "label": "refUUID", - "offset": 0, - "slot": "2", - "type": "t_bytes32" - }, - { - "astId": 4149, - "contract": "contracts/EAS.sol:EAS", - "label": "time", - "offset": 0, - "slot": "3", - "type": "t_uint32" - }, - { - "astId": 4151, - "contract": "contracts/EAS.sol:EAS", - "label": "expirationTime", - "offset": 4, - "slot": "3", - "type": "t_uint32" - }, - { - "astId": 4153, - "contract": "contracts/EAS.sol:EAS", - "label": "revocationTime", - "offset": 8, - "slot": "3", - "type": "t_uint32" - }, - { - "astId": 4155, - "contract": "contracts/EAS.sol:EAS", - "label": "recipient", - "offset": 12, - "slot": "3", - "type": "t_address" - }, - { - "astId": 4157, - "contract": "contracts/EAS.sol:EAS", - "label": "attester", - "offset": 0, - "slot": "4", - "type": "t_address" - }, - { - "astId": 4159, - "contract": "contracts/EAS.sol:EAS", - "label": "revocable", - "offset": 20, - "slot": "4", - "type": "t_bool" - }, - { - "astId": 4161, - "contract": "contracts/EAS.sol:EAS", - "label": "data", - "offset": 0, - "slot": "5", - "type": "t_bytes_storage" - } - ], - "numberOfBytes": "192" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint32": { - "encoding": "inplace", - "label": "uint32", - "numberOfBytes": "4" - } - } - } -} \ No newline at end of file diff --git a/deployments/goerli/SchemaRegistry.json b/deployments/goerli/SchemaRegistry.json deleted file mode 100644 index 4c946bd..0000000 --- a/deployments/goerli/SchemaRegistry.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "address": "0x40E750bbDCC059cb5F3c24e1B5C84E2D3ea8D2Fc", - "abi": [ - { - "inputs": [], - "name": "AlreadyExists", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "address", - "name": "registerer", - "type": "address" - } - ], - "name": "Registered", - "type": "event" - }, - { - "inputs": [], - "name": "VERSION", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - } - ], - "name": "getSchema", - "outputs": [ - { - "components": [ - { - "internalType": "bytes32", - "name": "uuid", - "type": "bytes32" - }, - { - "internalType": "contract ISchemaResolver", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - }, - { - "internalType": "string", - "name": "schema", - "type": "string" - } - ], - "internalType": "struct SchemaRecord", - "name": "", - "type": "tuple" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "string", - "name": "schema", - "type": "string" - }, - { - "internalType": "contract ISchemaResolver", - "name": "resolver", - "type": "address" - }, - { - "internalType": "bool", - "name": "revocable", - "type": "bool" - } - ], - "name": "register", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } - ], - "transactionHash": "0x2bdae718c61bad455ee8a609f40fe687c64976c7f4110273939f7e6219940a0f", - "receipt": { - "to": null, - "from": "0x01a93612f26100B6E18a2e3dd57df5c3ccaFeca1", - "contractAddress": "0x40E750bbDCC059cb5F3c24e1B5C84E2D3ea8D2Fc", - "transactionIndex": 5, - "gasUsed": "477737", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x8c5da1b8e5205c27863cc9b0b64f81ab356d1a4dbe0212c62c93cd21ad03bd05", - "transactionHash": "0x2bdae718c61bad455ee8a609f40fe687c64976c7f4110273939f7e6219940a0f", - "logs": [], - "blockNumber": 8284410, - "cumulativeGasUsed": "2741526", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "b22fa35c9f5fddbbe076697098508faf", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registerer\",\"type\":\"address\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"getSchema\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"contract ISchemaResolver\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"schema\",\"type\":\"string\"}],\"internalType\":\"struct SchemaRecord\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"schema\",\"type\":\"string\"},{\"internalType\":\"contract ISchemaResolver\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"}],\"name\":\"register\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getSchema(bytes32)\":{\"details\":\"Returns an existing schema by UUID\",\"params\":{\"uuid\":\"The UUID of the schema to retrieve.\"},\"returns\":{\"_0\":\"The schema data members.\"}},\"register(string,address,bool)\":{\"details\":\"Submits and reserves a new schema\",\"params\":{\"resolver\":\"An optional schema resolver.\",\"revocable\":\"Whether the schema allows revocations explicitly.\",\"schema\":\"The schema data schema.\"},\"returns\":{\"_0\":\"The UUID of the new schema.\"}}},\"title\":\"The global schema registry.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/SchemaRegistry.sol\":\"SchemaRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":100000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/IEAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaRegistry } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @dev A struct representing a single attestation.\\n */\\nstruct Attestation {\\n bytes32 uuid; // A unique identifier of the attestation.\\n bytes32 schema; // The unique identifier of the schema.\\n bytes32 refUUID; // The UUID of the related attestation.\\n uint32 time; // The time when the attestation was created (Unix timestamp).\\n uint32 expirationTime; // The time when the attestation expires (Unix timestamp).\\n uint32 revocationTime; // The time when the attestation was revoked (Unix timestamp).\\n address recipient; // The recipient of the attestation.\\n address attester; // The attester/sender of the attestation.\\n bool revocable; // Whether the attestation is revocable.\\n bytes data; // Custom attestation data.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the attestation request.\\n */\\nstruct AttestationRequestData {\\n address recipient; // The recipient of the attestation.\\n uint32 expirationTime; // The time when the attestation expires (Unix timestamp).\\n bool revocable; // Whether the attestation is revocable.\\n bytes32 refUUID; // The UUID of the related attestation.\\n bytes data; // Custom attestation data.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the attestation request.\\n */\\nstruct AttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the full delegated attestation request.\\n */\\nstruct DelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi attestation request.\\n */\\nstruct MultiAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi attestation request.\\n */\\nstruct MultiDelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the revocation request.\\n */\\nstruct RevocationRequestData {\\n bytes32 uuid; // The UUID of the attestation to revoke.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the revocation request.\\n */\\nstruct RevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the full delegated revocation request.\\n */\\nstruct DelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi revocation request.\\n */\\nstruct MultiRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi revocation request.\\n */\\nstruct MultiDelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service interface.\\n */\\ninterface IEAS {\\n /**\\n * @dev Triggered when an attestation has been made.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param uuid The UUID the revoked attestation.\\n * @param schema The UUID of the schema.\\n */\\n event Attested(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Triggered when an attestation has been revoked.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param schema The UUID of the schema.\\n * @param uuid The UUID the revoked attestation.\\n */\\n event Revoked(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Returns the address of the global schema registry.\\n *\\n * @return The address of the global schema registry.\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry);\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param request The arguments of the attestation request.\\n *\\n * Example:\\n *\\n * attest({\\n * schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\",\\n * data: {\\n * recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\",\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\",\\n * data: \\\"0xF00D\\\",\\n * value: 0\\n * }\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attest(AttestationRequest calldata request) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to a specific schema via the provided EIP712 signature.\\n *\\n * @param delegatedRequest The arguments of the delegated attestation request.\\n *\\n * Example:\\n *\\n * attestByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * signature: {\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e'\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi attestation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttest([{\\n * schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 1000\\n * },\\n * {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f',\\n * data: '0x12345678',\\n * value: 0\\n * },\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Attests to multiple schemas using via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttestByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * {\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4'\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * Example:\\n *\\n * revoke({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d',\\n * value: 0\\n * }\\n * })\\n *\\n * @param request The arguments of the revocation request.\\n */\\n function revoke(RevocationRequest calldata request) external payable;\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema via the provided EIP712 signature.\\n *\\n * Example:\\n *\\n * revokeByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba',\\n * value: 0\\n * },\\n * signature: {\\n * v: 27,\\n * r: '0xb593...7142',\\n * s: '0x0f5b...2cce'\\n * },\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * })\\n *\\n * @param delegatedRequest The arguments of the delegated revocation request.\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi revocation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevoke([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019',\\n * value: 0\\n * },\\n * }])\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi revocation attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevokeByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * }])\\n *\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable;\\n\\n /**\\n * @dev Returns an existing attestation by UUID.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return The attestation data members.\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory);\\n\\n /**\\n * @dev Checks whether an attestation exists.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return Whether an attestation exists.\\n */\\n function isAttestationValid(bytes32 uuid) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x41f8ee4011dc8303b671784ce243a655c2a86bce1f18f07aaf786ed0a757df6f\",\"license\":\"MIT\"},\"contracts/ISchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title A struct representing a record for a submitted schema.\\n */\\nstruct SchemaRecord {\\n bytes32 uuid; // The unique identifier of the schema.\\n ISchemaResolver resolver; // Optional schema resolver.\\n bool revocable; // Whether the schema allows revocations explicitly.\\n string schema; // Custom specification of the schema (e.g., an ABI).\\n}\\n\\n/**\\n * @title The global schema registry interface.\\n */\\ninterface ISchemaRegistry {\\n /**\\n * @dev Triggered when a new schema has been registered\\n *\\n * @param uuid The schema UUID.\\n * @param registerer The address of the account used to register the schema.\\n */\\n event Registered(bytes32 indexed uuid, address registerer);\\n\\n /**\\n * @dev Submits and reserves a new schema\\n *\\n * @param schema The schema data schema.\\n * @param resolver An optional schema resolver.\\n * @param revocable Whether the schema allows revocations explicitly.\\n *\\n * @return The UUID of the new schema.\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32);\\n\\n /**\\n * @dev Returns an existing schema by UUID\\n *\\n * @param uuid The UUID of the schema to retrieve.\\n *\\n * @return The schema data members.\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory);\\n}\\n\",\"keccak256\":\"0xe38a6575a35f4459556f1dcdd16b6257d38d7f907a3cf8d669724541f6dad3aa\",\"license\":\"MIT\"},\"contracts/SchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { EMPTY_UUID } from \\\"./Types.sol\\\";\\nimport { ISchemaRegistry, SchemaRecord } from \\\"./ISchemaRegistry.sol\\\";\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title The global schema registry.\\n */\\ncontract SchemaRegistry is ISchemaRegistry {\\n error AlreadyExists();\\n\\n // The version of the contract.\\n string public constant VERSION = \\\"0.22\\\";\\n\\n // The global mapping between schema records and their IDs.\\n mapping(bytes32 => SchemaRecord) private _registry;\\n\\n /**\\n * @inheritdoc ISchemaRegistry\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32) {\\n SchemaRecord memory schemaRecord = SchemaRecord({\\n uuid: EMPTY_UUID,\\n schema: schema,\\n resolver: resolver,\\n revocable: revocable\\n });\\n\\n bytes32 uuid = _getUUID(schemaRecord);\\n if (_registry[uuid].uuid != EMPTY_UUID) {\\n revert AlreadyExists();\\n }\\n\\n schemaRecord.uuid = uuid;\\n _registry[uuid] = schemaRecord;\\n\\n emit Registered(uuid, msg.sender);\\n\\n return uuid;\\n }\\n\\n /**\\n * @inheritdoc ISchemaRegistry\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory) {\\n return _registry[uuid];\\n }\\n\\n /**\\n * @dev Calculates a UUID for a given schema.\\n *\\n * @param schemaRecord The input schema.\\n *\\n * @return schema UUID.\\n */\\n function _getUUID(SchemaRecord memory schemaRecord) private pure returns (bytes32) {\\n return keccak256(abi.encodePacked(schemaRecord.schema, schemaRecord.resolver, schemaRecord.revocable));\\n }\\n}\\n\",\"keccak256\":\"0x947dadafedb3a45bab6a8bb6617c621589f76db62a845059cd72dab139cb75ee\",\"license\":\"MIT\"},\"contracts/Types.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\n// A representation of an empty/uninitialized UUID.\\nbytes32 constant EMPTY_UUID = 0;\\n\\n/**\\n * @dev A struct representing EIP712 signature data.\\n */\\nstruct EIP712Signature {\\n uint8 v; // The recovery ID.\\n bytes32 r; // The x-coordinate of the nonce R.\\n bytes32 s; // The signature data.\\n}\\n\",\"keccak256\":\"0xda035d575e6fc7f857a23b795ca7cd7d9eb306f068224271ac0fec03e433de94\",\"license\":\"MIT\"},\"contracts/resolver/ISchemaResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Attestation } from \\\"../IEAS.sol\\\";\\n\\n/**\\n * @title The interface of an optional schema resolver.\\n */\\ninterface ISchemaResolver {\\n /**\\n * @dev Returns whether the resolver supports ETH transfers.\\n */\\n function isPayable() external pure returns (bool);\\n\\n /**\\n * @dev Processes an attestation and verifies whether it's valid.\\n *\\n * @param attestation The new attestation.\\n *\\n * @return Whether the attestation is valid.\\n */\\n function attest(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes multiple attestations and verifies whether they are valid.\\n *\\n * @param attestations The new attestations.\\n * @param values Explicit ETH amounts which were sent with each attestation.\\n *\\n * @return Whether all the attestations are valid.\\n */\\n function multiAttest(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n\\n /**\\n * @dev Processes an attestation revocation and verifies if it can be revoked.\\n *\\n * @param attestation The existing attestation to be revoked.\\n *\\n * @return Whether the attestation can be revoked.\\n */\\n function revoke(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes revocation of multiple attestation and verifies they can be revoked.\\n *\\n * @param attestations The existing attestations to be revoked.\\n * @param values Explicit ETH amounts which were sent with each revocation.\\n *\\n * @return Whether the attestations can be revoked.\\n */\\n function multiRevoke(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x070836a283c69af79de3a0c5319680d1cebc137c7e984fb3221269a75c29d2c2\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60808060405234610016576107b8908161001c8239f35b600080fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323200000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a", - "deployedBytecode": "0x60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323200000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a", - "devdoc": { - "kind": "dev", - "methods": { - "getSchema(bytes32)": { - "details": "Returns an existing schema by UUID", - "params": { - "uuid": "The UUID of the schema to retrieve." - }, - "returns": { - "_0": "The schema data members." - } - }, - "register(string,address,bool)": { - "details": "Submits and reserves a new schema", - "params": { - "resolver": "An optional schema resolver.", - "revocable": "Whether the schema allows revocations explicitly.", - "schema": "The schema data schema." - }, - "returns": { - "_0": "The UUID of the new schema." - } - } - }, - "title": "The global schema registry.", - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 4439, - "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", - "label": "_registry", - "offset": 0, - "slot": "0", - "type": "t_mapping(t_bytes32,t_struct(SchemaRecord)4386_storage)" - } - ], - "types": { - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_bytes32": { - "encoding": "inplace", - "label": "bytes32", - "numberOfBytes": "32" - }, - "t_contract(ISchemaResolver)4605": { - "encoding": "inplace", - "label": "contract ISchemaResolver", - "numberOfBytes": "20" - }, - "t_mapping(t_bytes32,t_struct(SchemaRecord)4386_storage)": { - "encoding": "mapping", - "key": "t_bytes32", - "label": "mapping(bytes32 => struct SchemaRecord)", - "numberOfBytes": "32", - "value": "t_struct(SchemaRecord)4386_storage" - }, - "t_string_storage": { - "encoding": "bytes", - "label": "string", - "numberOfBytes": "32" - }, - "t_struct(SchemaRecord)4386_storage": { - "encoding": "inplace", - "label": "struct SchemaRecord", - "members": [ - { - "astId": 4378, - "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", - "label": "uuid", - "offset": 0, - "slot": "0", - "type": "t_bytes32" - }, - { - "astId": 4381, - "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", - "label": "resolver", - "offset": 0, - "slot": "1", - "type": "t_contract(ISchemaResolver)4605" - }, - { - "astId": 4383, - "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", - "label": "revocable", - "offset": 20, - "slot": "1", - "type": "t_bool" - }, - { - "astId": 4385, - "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", - "label": "schema", - "offset": 0, - "slot": "2", - "type": "t_string_storage" - } - ], - "numberOfBytes": "96" - } - } - } -} \ No newline at end of file diff --git a/deployments/goerli/types/factories/contracts/EAS__factory.ts b/deployments/goerli/types/factories/contracts/EAS__factory.ts deleted file mode 100644 index 99e23bb..0000000 --- a/deployments/goerli/types/factories/contracts/EAS__factory.ts +++ /dev/null @@ -1,904 +0,0 @@ -/* Autogenerated file. Do not edit manually. */ -/* tslint:disable */ -/* eslint-disable */ -import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; -import type { Provider, TransactionRequest } from "@ethersproject/providers"; -import type { PromiseOrValue } from "../../common"; -import type { EAS, EASInterface } from "../../contracts/EAS"; - -const _abi = [ - { - inputs: [ - { - internalType: "contract ISchemaRegistry", - name: "registry", - type: "address", - }, - ], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "AccessDenied", - type: "error", - }, - { - inputs: [], - name: "AlreadyRevoked", - type: "error", - }, - { - inputs: [], - name: "InsufficientValue", - type: "error", - }, - { - inputs: [], - name: "InvalidAttestation", - type: "error", - }, - { - inputs: [], - name: "InvalidAttestations", - type: "error", - }, - { - inputs: [], - name: "InvalidExpirationTime", - type: "error", - }, - { - inputs: [], - name: "InvalidLength", - type: "error", - }, - { - inputs: [], - name: "InvalidOffset", - type: "error", - }, - { - inputs: [], - name: "InvalidRegistry", - type: "error", - }, - { - inputs: [], - name: "InvalidRevocation", - type: "error", - }, - { - inputs: [], - name: "InvalidRevocations", - type: "error", - }, - { - inputs: [], - name: "InvalidSchema", - type: "error", - }, - { - inputs: [], - name: "InvalidSignature", - type: "error", - }, - { - inputs: [], - name: "InvalidVerifier", - type: "error", - }, - { - inputs: [], - name: "Irrevocable", - type: "error", - }, - { - inputs: [], - name: "NotFound", - type: "error", - }, - { - inputs: [], - name: "NotPayable", - type: "error", - }, - { - inputs: [], - name: "WrongSchema", - type: "error", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "recipient", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "attester", - type: "address", - }, - { - indexed: false, - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - ], - name: "Attested", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "recipient", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "attester", - type: "address", - }, - { - indexed: false, - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - indexed: true, - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - ], - name: "Revoked", - type: "event", - }, - { - inputs: [], - name: "VERSION", - outputs: [ - { - internalType: "string", - name: "", - type: "string", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "uint32", - name: "expirationTime", - type: "uint32", - }, - { - internalType: "bool", - name: "revocable", - type: "bool", - }, - { - internalType: "bytes32", - name: "refUUID", - type: "bytes32", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct AttestationRequestData", - name: "data", - type: "tuple", - }, - ], - internalType: "struct AttestationRequest", - name: "request", - type: "tuple", - }, - ], - name: "attest", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "uint32", - name: "expirationTime", - type: "uint32", - }, - { - internalType: "bool", - name: "revocable", - type: "bool", - }, - { - internalType: "bytes32", - name: "refUUID", - type: "bytes32", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct AttestationRequestData", - name: "data", - type: "tuple", - }, - { - components: [ - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, - ], - internalType: "struct EIP712Signature", - name: "signature", - type: "tuple", - }, - { - internalType: "address", - name: "attester", - type: "address", - }, - ], - internalType: "struct DelegatedAttestationRequest", - name: "delegatedRequest", - type: "tuple", - }, - ], - name: "attestByDelegation", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [], - name: "getAttestTypeHash", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - ], - name: "getAttestation", - outputs: [ - { - components: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "refUUID", - type: "bytes32", - }, - { - internalType: "uint32", - name: "time", - type: "uint32", - }, - { - internalType: "uint32", - name: "expirationTime", - type: "uint32", - }, - { - internalType: "uint32", - name: "revocationTime", - type: "uint32", - }, - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "address", - name: "attester", - type: "address", - }, - { - internalType: "bool", - name: "revocable", - type: "bool", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - ], - internalType: "struct Attestation", - name: "", - type: "tuple", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getDomainSeparator", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "account", - type: "address", - }, - ], - name: "getNonce", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getRevokeTypeHash", - outputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "getSchemaRegistry", - outputs: [ - { - internalType: "contract ISchemaRegistry", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - ], - name: "isAttestationValid", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "uint32", - name: "expirationTime", - type: "uint32", - }, - { - internalType: "bool", - name: "revocable", - type: "bool", - }, - { - internalType: "bytes32", - name: "refUUID", - type: "bytes32", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct AttestationRequestData[]", - name: "data", - type: "tuple[]", - }, - ], - internalType: "struct MultiAttestationRequest[]", - name: "multiRequests", - type: "tuple[]", - }, - ], - name: "multiAttest", - outputs: [ - { - internalType: "bytes32[]", - name: "", - type: "bytes32[]", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "address", - name: "recipient", - type: "address", - }, - { - internalType: "uint32", - name: "expirationTime", - type: "uint32", - }, - { - internalType: "bool", - name: "revocable", - type: "bool", - }, - { - internalType: "bytes32", - name: "refUUID", - type: "bytes32", - }, - { - internalType: "bytes", - name: "data", - type: "bytes", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct AttestationRequestData[]", - name: "data", - type: "tuple[]", - }, - { - components: [ - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, - ], - internalType: "struct EIP712Signature[]", - name: "signatures", - type: "tuple[]", - }, - { - internalType: "address", - name: "attester", - type: "address", - }, - ], - internalType: "struct MultiDelegatedAttestationRequest[]", - name: "multiDelegatedRequests", - type: "tuple[]", - }, - ], - name: "multiAttestByDelegation", - outputs: [ - { - internalType: "bytes32[]", - name: "", - type: "bytes32[]", - }, - ], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct RevocationRequestData[]", - name: "data", - type: "tuple[]", - }, - ], - internalType: "struct MultiRevocationRequest[]", - name: "multiRequests", - type: "tuple[]", - }, - ], - name: "multiRevoke", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct RevocationRequestData[]", - name: "data", - type: "tuple[]", - }, - { - components: [ - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, - ], - internalType: "struct EIP712Signature[]", - name: "signatures", - type: "tuple[]", - }, - { - internalType: "address", - name: "revoker", - type: "address", - }, - ], - internalType: "struct MultiDelegatedRevocationRequest[]", - name: "multiDelegatedRequests", - type: "tuple[]", - }, - ], - name: "multiRevokeByDelegation", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct RevocationRequestData", - name: "data", - type: "tuple", - }, - ], - internalType: "struct RevocationRequest", - name: "request", - type: "tuple", - }, - ], - name: "revoke", - outputs: [], - stateMutability: "payable", - type: "function", - }, - { - inputs: [ - { - components: [ - { - internalType: "bytes32", - name: "schema", - type: "bytes32", - }, - { - components: [ - { - internalType: "bytes32", - name: "uuid", - type: "bytes32", - }, - { - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - internalType: "struct RevocationRequestData", - name: "data", - type: "tuple", - }, - { - components: [ - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, - ], - internalType: "struct EIP712Signature", - name: "signature", - type: "tuple", - }, - { - internalType: "address", - name: "revoker", - type: "address", - }, - ], - internalType: "struct DelegatedRevocationRequest", - name: "delegatedRequest", - type: "tuple", - }, - ], - name: "revokeByDelegation", - outputs: [], - stateMutability: "payable", - type: "function", - }, -] as const; - -const _bytecode = - "0x61016034620001b657601f62004ad338819003918201601f19168301926001600160401b0392909183851183861017620001a0578160209284926040978852833981010312620001b657516001600160a01b03811692838203620001b6578051926200006b84620001bb565b6004845260208401631817191960e11b81526003602084516200008e81620001bb565b828152016245415360e81b81522094519020948460e052610100958087524660a052835160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f978884528683015260608201524660808201523060a082015260a0815260c081019381851090851117620001a0578385525190206080523060c0526101209485521562000191575061014091825251916148fb9384620001d8853960805184614371015260a0518461442c015260c05184614342015260e051846143c0015251836143e60152518261439d0152518181816101a001528181610d170152818161154b0152818161280c01528181612ec801526131370152f35b6311a1e69760e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b03821117620001a05760405256fe61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611bce5750806316bc31ff14611461578063195bf9af14610bb65780632d0335ab14610b4e5780634692626714610af05780634cb7e9e5146109ee578063706c190a146108e9578063a3112a6414610882578063b83010d314610829578063e30bb563146107d5578063e45d03f91461059b578063e57a6b1b14610497578063ed24911d14610456578063ee5ad0f2146101c4578063f10b5cc8146101555763ffa1ad74146100d057600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505761014c60405161010e81611e04565b600481527f302e3232000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611cd5565b0390f35b600080fd5b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff81116101505761020e903690600401611c46565b610217816120ba565b916000918291345b82841061023f5761014c61023386886142be565b60405191829182611c77565b9091929361024e858585612261565b61025b6020820182612161565b90918115801561043e575b61041457908491888860005b8481106102fd5750936102d6936102cd936102c660019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6020990114946102be60608401612099565b9336916121b5565b903561279a565b94855190612225565b930180516102e4888a611f78565b526102ef8789611f78565b50515101940192919061021f565b9293945050506103128160051b850185611f38565b9061032060408401846122a1565b8293919310156103e55761033660608501612099565b926040519081608081011067ffffffffffffffff6080840111176103b65760019461039a73ffffffffffffffffffffffffffffffffffffffff926103896103aa96608087016040528a3587523690611f8c565b60208601523690606088020161205b565b6040840152166060820152614452565b01908888879493610272565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b5061044c60408201826122a1565b9050821415610266565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061048f61432b565b604051908152f35b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576040516104cd81611db0565b6004358082526104dc36612344565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c3601126101505760405161051781611de8565b60643560ff81168103610150578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff811681036101505761056d83826060610599960152614828565b6105756122f5565b61057e36612344565b61058782611f6b565b5261059181611f6b565b503492612e7b565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff600435818111610150576105e883913690600401611c46565b909234926000915b8383106105f957005b610604838588612261565b94608086360312610150576040519561061c87611db0565b803587528381013583811161015057810194601f953687820112156101505761064b903690878135910161238a565b928589019384526040830135858111610150578301963690880112156101505786359461067786611eb8565b97610685604051998a611e3d565b868952878901886060809902830101913683116101505789808a9201925b8484106107bd57505090506106c1915060408c01958a875201611c25565b94868b019586525197885180159182156107b1575b50506104145760005b8851811015610747576001906107418c516106fa838d611f78565b51610706848a51611f78565b5173ffffffffffffffffffffffffffffffffffffffff8b5116916040519361072d85611db0565b84528d84015260408301528a820152614828565b016106df565b509860019550819350906107a1929a976107a79592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916130e9565b90612225565b95019194936105f0565b51141590508c806106d6565b6107c7368561205b565b8152019101908989916106a3565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057602061081f6004356000526001602052604060002054151590565b6040519015158152f35b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610150576108b96123fc565b50600435600052600160205261014c6108d5604060002061249a565b604051918291602083526020830190611d18565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043567ffffffffffffffff811161015057610934903690600401611c46565b610940819392936120ba565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b8086106109815761014c610233888a6142be565b909192939495600190856109c56109bc8a888861099f838a8f612121565b6102c66109ae88830183612161565b9390951494339336916121b5565b96875190612225565b950180516109d38a8c611f78565b526109de898b611f78565b505151019601949392919061096d565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505767ffffffffffffffff9060043582811161015057610a3b903690600401611c46565b929091600090345b858310610a4c57005b610a57838787612121565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561015057810191823592868411610150578401928060061b3603841361015057600193826107a192610ae895610ae17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161238a565b90356130e9565b920191610a43565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057610599610b256122f5565b610b2e36612344565b610b3782611f6b565b52610b4181611f6b565b5034903390600435612e7b565b346101505760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101505760043573ffffffffffffffffffffffffffffffffffffffff81168091036101505760005260006020526020604060002054604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101505760043567ffffffffffffffff81116101505760c0816004019282360301126101505760405190610c1082611db0565b82358252602481019182359167ffffffffffffffff83116101505760a4610c7091610c44610ca59560043691840101611f8c565b6020850152610c56366044830161205b565b60408501520191610c6683611c25565b6060820152614452565b610c8c610c7b611ed0565b93610c87369187611f38565b611f8c565b610c9584611f6b565b52610c9f83611f6b565b50612099565b90610cae6125f0565b50805190610cba6125f0565b60c052610cc68261260a565b602060c05101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561145557600060a052611430575b5060a0515115611406579091610d5e8361272d565b60e052610d6a8361260a565b6080526000915b838310610da757610d8a3460805160e05160a0516133b7565b60c051526020610d9e8160c0510151611f6b565b51604051908152f35b610db18382611f78565b519063ffffffff60208301511680151590816113f5575b506113cb57604060a051015115806113be575b6113945760608201519463ffffffff60208401511673ffffffffffffffffffffffffffffffffffffffff845116604085015115159060808601519260405199610e238b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c0880151610f64609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b8301918860e01b1690820152036075810184520182611e3d565b51902080600052600160205260406000205415610f8a575060010163ffffffff16610e7b565b9195929496905081815281600052600160205260406000208151815560208201516001820155604082015160028201556003810163ffffffff6060840151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608087015160201b1692161717815561105163ffffffff60a08501511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08301516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff82116103b6576111206005840154612447565b601f811161134d575b50602090601f8311600114611283576005929160009183611278575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b60608401518061122c575b5060019373ffffffffffffffffffffffffffffffffffffffff916111a98560e051611f78565b526111b68460e051611f78565b5060a08101516111c885608051611f78565b52826111da85602060c0510151611f78565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a401919290610d71565b611243906000526001602052604060002054151590565b1561124e5788611183565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b015190508c80611145565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106113355750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060059716106112fe575b505050811b01910155611178565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80806112f0565b91926020600181928685015181550194019201611294565b600584016000526020600020601f840160051c81016020851061138d575b601f830160051c82018110611381575050611129565b6000815560010161136b565b508061136b565b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408201511515610ddb565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905063ffffffff4216101587610dc8565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b61144c903d806000833e6114448183611e3d565b810190612666565b60a05284610d49565b6040513d6000823e3d90fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610150576004359067ffffffffffffffff821161015057604082600401918336030112610150576114c96114ba611ed0565b92610c87602436920184611f38565b6114d283611f6b565b526114dc82611f6b565b506114e56125f0565b508151916114f16125f0565b916114fb8461260a565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa94851561145557600095611bb1575b50845115611406579161158e8361272d565b916115988461260a565b936000925b8184106115c0576020610d9e81896115b7348b8b8f6133b7565b81520151611f6b565b6115d284829994969893959799611f78565b519263ffffffff6020850151168015159081611ba0575b506113cb5760408101511580611b93575b6113945760608401519463ffffffff60208601511673ffffffffffffffffffffffffffffffffffffffff8651166040870151151590608088015192604051996116428b611e20565b60008b528b3560208c015260408b015263ffffffff421660608b015260808a0152600060a08a015260c08901523360e089015261010088015261012087015260005b602087015160c0880151611753609560e08b015160608c015160808d0151908d6101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415611779575060010163ffffffff16611684565b91969050999791999896949293988181528160005260016020526040600020908051825560208101516001830155604081015160028301556003820163ffffffff6060830151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff00000000608086015160201b1692161717815561184863ffffffff60a08401511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08201516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff83116103b657838c938c938f96600561191e910154612447565b601f8111611b1f575b50602090601f8311600114611a42576005929160009183611a37575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180611a0c575b5085602073ffffffffffffffffffffffffffffffffffffffff95600199956119b984876119d1976119b3838e9b611f78565b52611f78565b506119c98460a089015192611f78565b520151611f78565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a401929061159d565b91509250611a2891506000526001602052604060002054151590565b1561124e5788888b928e611981565b015190503880611943565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110611af45750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610611abd575b505050811b01910155611976565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080611aaf565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693611a53565b9295509295509250600584016000526020600020601f840160051c810160208510611b8c575b928f9693928f9693928f96935b601f830160051c82018110611b68575050611927565b60019396995080929598506000919497505501928f9693928f9693928f9693611b52565b5080611b45565b50604084015115156115fa565b905063ffffffff421610158a6115e9565b611bc79195503d806000833e6114448183611e3d565b938561157c565b346101505760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015057807f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce960209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361015057565b9181601f840112156101505782359167ffffffffffffffff8311610150576020808501948460051b01011161015057565b6020908160408183019282815285518094520193019160005b828110611c9e575050505090565b835185529381019392810192600101611c90565b60005b838110611cc55750506000910152565b8181015183820152602001611cb5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611d1181518092818752878088019101611cb2565b0116010190565b90611dad9180518252602081015160208301526040810151604083015263ffffffff80606083015116606084015280608083015116608084015260a08201511660a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611cd5565b90565b6080810190811067ffffffffffffffff8211176103b657604052565b60c0810190811067ffffffffffffffff8211176103b657604052565b6060810190811067ffffffffffffffff8211176103b657604052565b6040810190811067ffffffffffffffff8211176103b657604052565b610140810190811067ffffffffffffffff8211176103b657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103b657604052565b67ffffffffffffffff81116103b657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116103b65760051b60200190565b604090815191611edf83611e04565b60018352829160005b602080821015611f3057835160209291611f0182611dcc565b6000825260008183015260008683015260606000818401526080830152600060a0830152828801015201611ee8565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610150570190565b8051156103e55760200190565b80518210156103e55760209160051b010190565b919060c083820312610150576040519067ffffffffffffffff9060c08301828111848210176103b6576040528294611fc381611c25565b84526020928382013563ffffffff811681036101505784860152604082013580151581036101505760408601526060820135606086015260808201359081116101505781019180601f840112156101505782359261202084611e7e565b9161202e6040519384611e3d565b84835285858301011161015057848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101505760405161207381611de8565b8092803560ff811681036101505760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101505790565b906120c482611eb8565b6120d16040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120ff8294611eb8565b019060005b82811061211057505050565b806060602080938501015201612104565b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff821161015057602001918160051b3603831361015057565b929190926121c284611eb8565b916121d06040519384611e3d565b829480845260208094019060051b8301928284116101505780915b8483106121fa57505050505050565b823567ffffffffffffffff811161015057869161221a8684938601611f8c565b8152019201916121eb565b9190820391821161223257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156103e55760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610150570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610150570180359067ffffffffffffffff82116101505760200191606082023603831361015057565b60409081519161230483611e04565b600183528291600091825b60208082101561233b5782516020929161232882611e04565b868252868183015282890101520161230f565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610150576040519061237b82611e04565b60243582526044356020830152565b92919261239682611eb8565b6040926123a584519283611e3d565b819581835260208093019160061b84019381851161015057915b8483106123ce57505050505050565b85838303126101505783869182516123e581611e04565b8535815282860135838201528152019201916123bf565b6040519061240982611e20565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612490575b602083101461246157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612456565b90604051916124a883611e20565b82815481526001600581840154936020948585015260028101546040850152600381015463ffffffff80821660608701528082881c1660808701528160401c1660a086015260601c60c085015260ff600482015473ffffffffffffffffffffffffffffffffffffffff811660e087015260a01c161515610100850152019060405193849260009281549161253b83612447565b808752928281169081156125b0575060011461256a575b505050506101209291612566910384611e3d565b0152565b60009081528381209695945091905b8183106125985750939450919250908201018161256661012038612552565b86548884018501529586019587945091830191612579565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b83010190508161256661012038612552565b604051906125fd82611e04565b6060602083600081520152565b9061261482611eb8565b6126216040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061264f8294611eb8565b0190602036910137565b5190811515820361015057565b906020808383031261015057825167ffffffffffffffff93848211610150570192608084840312610150576040519361269e85611db0565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361015057838601526126d360408201612659565b60408601526060810151918211610150570182601f82011215610150578051906126fc82611e7e565b9361270a6040519586611e3d565b82855283838301011161015057826127259385019101611cb2565b606082015290565b9061273782611eb8565b6127446040519182611e3d565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06127728294611eb8565b019060005b82811061278357505050565b60209061278e6123fc565b82828501015201612777565b92909493916127a76125f0565b508551936127b36125f0565b946127bd8161260a565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa91821561145557600092612e5e575b5081511561140657929790916128528461272d565b9861285c8561260a565b946000935b81851061287e5750505050509561287994959661361e565b815290565b919593989496999092976128928a84611f78565b519a63ffffffff60208d0151168015159081612e4d575b506113cb5760408901511580612e40575b61139457899860608d01518d602081015163ffffffff16815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f9061290682611e20565b600082526020820152604001528d4263ffffffff1660608201526080015260a08d016000905260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612a2d609560c08301519260e08101519060608101516080820151916101008101511515610120604083015192015192604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffff000000000000000000000000000000000000000000000000000000009485809260e01b16606888015260e01b16606c86015260f81b607085015260718401528051610f4a8160919360208588019101611cb2565b51902080600052600160205260406000205415612a53575060010163ffffffff1661295c565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155604085015160028401556003830163ffffffff6060870151168154907fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000067ffffffff0000000060808a015160201b16921617178155612b2563ffffffff60a08801511682907fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff6bffffffff000000000000000083549260401b169116179055565b60c08601516bffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083549260601b1691161790556004830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff81116103b6578894612bf66005840154612447565b601f8111612de5575b50602090601f8311600114612d18576005929160009183612d0d575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612ce0575b5086602073ffffffffffffffffffffffffffffffffffffffff959487946119b9848660019e6119b383612c8e9a611f78565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612861565b92505050612cfd9193506000526001602052604060002054151590565b1561124e5785918d8b8b38612c5c565b015190503880612c1b565b906005840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612dca5750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06005971610612d93575b505050811b01910155612c4e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612d85565b8183015184558c985060019093019260209283019201612d29565b90919293949550600584016000526020600020601f840160051c810160208510612e39575b908b979695949392915b601f830160051c82018110612e2a575050612bff565b600081558c9850600101612e14565b5080612e0a565b5060408c015115156128ba565b905063ffffffff42161015386128a9565b612e749192503d806000833e6114448183611e3d565b903861283d565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916130ce575b50805115611406578251612f0c8161272d565b92612f168261260a565b9460005b838110612f305750505050611dad9495506137ff565b612f3a8183611f78565b51908151600052600160205260406000209182541561124e578460018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff0000000000000000161790556001928c91612ffe8261249a565b613008858c611f78565b52613013848b611f78565b506020810151613023858d611f78565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87600386015460601c9451950154956040519586521693a401612f1a565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6130e391503d806000833e6114448183611e3d565b38612ef9565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611455576000916132e8575b5080511561140657865161317b8161272d565b926131858261260a565b9460005b83811061319f5750505050611dad9596506139fe565b6131a9818c611f78565b51908151600052600160205260406000209182541561124e578360018401540361140657600483015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036130a45760a01c60ff16156113945763ffffffff600384015460401c1661307a576003830180547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff164260401b6bffffffff00000000000000001617905560019261326b8161249a565b613275848b611f78565b52613280838a611f78565b506020820151613290848c611f78565b5283600382015460601c9251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613189565b6132fd91503d806000833e6114448183611e3d565b38613168565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061336c57505050508281830391015281808451928381520193019160005b828110613358575050505090565b83518552938101939281019260010161334a565b909192959485806133a7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611d18565b9798019493919091019101613329565b9092918351936001908186146135fd5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156135cd579560009687915b8083106134bf575050509183929161343a9492876040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613488575b5090501561345e57611dad9061418f565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116134b8575b61349c8183611e3d565b810103126134b557506134ae90612659565b803861344d565b80fd5b503d613492565b909197966134cd8987611f78565b5180151580613547575b61351d578181116134f3578084920398019801909190916133f1565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161358e575b50156134d7565b908982813d83116135bc575b6135a48183611e3d565b810103126134b557506135b690612659565b38613587565b503d61359a565b513d6000823e3d90fd5b9594505050905060005b8281106135e75750505050600090565b6135f18183611f78565b5161351d5783016135d7565b611dad9550613617915061361090611f6b565b5191611f6b565b5191613bd6565b9093918451946001908187146137e25773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137b1579660009788915b80831061370157505050918392916136a19492886040518097819582947f9a3353ec00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916136cd575b5090501561345e576136c4575090565b611dad9061418f565b82813d83116136fa575b6136e18183611e3d565b810103126134b557506136f390612659565b80386136b4565b503d6136d7565b9091989761370f8a87611f78565b5180151580613735575b61351d578181116134f357808492039901990190919091613658565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161377c575b5015613719565b908982813d83116137aa575b6137928183611e3d565b810103126134b557506137a490612659565b38613775565b503d613788565b969550505091505060005b8281106137cc5750505050600090565b6137d68183611f78565b5161351d5783016137bc565b611dad96506137f8915061361090959495611f6b565b5191613d5d565b9092918351936001908186146139e45773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139b4579560009687915b80831061390457505050918392916138829492876040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af1908115611455576000916138d0575b509050156138a657611dad9061418f565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d83116138fd575b6138e48183611e3d565b810103126134b557506138f690612659565b8038613895565b503d6138da565b909197966139128987611f78565b5180151580613938575b61351d578181116134f357808492039801980190919091613839565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c3575060009161397f575b501561391c565b908982813d83116139ad575b6139958183611e3d565b810103126134b557506139a790612659565b38613978565b503d61398b565b9594505050905060005b8281106139ce5750505050600090565b6139d88183611f78565b5161351d5783016139be565b611dad95506139f7915061361090611f6b565b5191613ec5565b909391845194600190818714613bb95773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613b88579660009788915b808310613ad85750505091839291613a819492886040518097819582947f3c76d99c00000000000000000000000000000000000000000000000000000000845260048401613303565b03925af190811561145557600091613aa4575b509050156138a6576136c4575090565b82813d8311613ad1575b613ab88183611e3d565b810103126134b55750613aca90612659565b8038613a94565b503d613aae565b90919897613ae68a87611f78565b5180151580613b0c575b61351d578181116134f357808492039901990190919091613a38565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156135c35750600091613b53575b5015613af0565b908982813d8311613b81575b613b698183611e3d565b810103126134b55750613b7b90612659565b38613b4c565b503d613b5f565b969550505091505060005b828110613ba35750505050600090565b613bad8183611f78565b5161351d578301613b93565b611dad9650613bcf915061361090959495611f6b565b519161403f565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613cd6575b61351d578385116134f357613c52829186946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613ca2575b50905015613c785781611dad910361418f565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613ccf575b613cb68183611e3d565b810103126134b55750613cc890612659565b8038613c65565b503d613cac565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613d1b575b5015613c04565b908382813d8311613d49575b613d318183611e3d565b810103126134b55750613d4390612659565b38613d14565b503d613d27565b5050505061351d57600090565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580613e3d575b61351d578486116134f357613dd9829187946040519586809481937f3085d6990000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613e09575b50905015613c78578290613dff57505090565b611dad910361418f565b82813d8311613e36575b613e1d8183611e3d565b810103126134b55750613e2f90612659565b8038613dec565b503d613e13565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa90811561145557600091613e82575b5015613d8b565b908382813d8311613eb0575b613e988183611e3d565b810103126134b55750613eaa90612659565b38613e7b565b503d613e8e565b505050505061351d57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613d505784151580613fc5575b61351d578385116134f357613f41829186946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af190811561145557600091613f91575b50905015613f675781611dad910361418f565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613fbe575b613fa58183611e3d565b810103126134b55750613fb790612659565b8038613f54565b503d613f9b565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161400a575b5015613ef3565b908382813d8311614038575b6140208183611e3d565b810103126134b5575061403290612659565b38614003565b503d614016565b93919373ffffffffffffffffffffffffffffffffffffffff602080920151168015613eb75785151580614115575b61351d578486116134f3576140bb829187946040519586809481937f4fda5cea0000000000000000000000000000000000000000000000000000000083528760048401526024830190611d18565b03925af1908115611455576000916140e1575b50905015613f67578290613dff57505090565b82813d831161410e575b6140f58183611e3d565b810103126134b5575061410790612659565b80386140ce565b503d6140eb565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa9081156114555760009161415a575b501561406d565b908382813d8311614188575b6141708183611e3d565b810103126134b5575061418290612659565b38614153565b503d614166565b806141975750565b80471061426057600080808093335af13d1561425b573d6141b781611e7e565b906141c56040519283611e3d565b8152600060203d92013e5b156141d757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b6141d0565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906142c89061260a565b60009283925b805184101561432357936142e28486611f78565b519160005b8351811015614312576142fa8185611f78565b516143058487611f78565b52600192830192016142e7565b5090946001909401939091506142ce565b509250905090565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614429575b15614393577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a0815261442381611dcc565b51902090565b507f0000000000000000000000000000000000000000000000000000000000000000461461436a565b602080820151906040928381015192606082019073ffffffffffffffffffffffffffffffffffffffff93848351166000526000815286600020938454946001860190555193858351169263ffffffff83820151169089810151151560806060830151920151858151910120928b5196868801997f790a6069414c6efe8e6aa1d915482176ee1e2e7d73c6f34d03df1813c5cb4ce98b528d8901526060880152608087015260a086015260c085015260e08401526101009081840152825261012082019582871067ffffffffffffffff8811176103b65761453f86956145539461455b998b525190206147c5565b918860ff8351169183015192015192614729565b949094614590565b51169116036145675750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156146fa57806145a15750565b600181036146075760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b6002810361466d5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461467657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083116147b95791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa156147ac57815173ffffffffffffffffffffffffffffffffffffffff8116156147a6579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b6147cd61432b565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176103b65760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff8711176103b6576148d985946145539361455b988a525190206147c5565b9060ff8151168860208301519201519261472956fea164736f6c6343000811000a"; - -type EASConstructorParams = - | [signer?: Signer] - | ConstructorParameters; - -const isSuperArgs = ( - xs: EASConstructorParams -): xs is ConstructorParameters => xs.length > 1; - -export class EAS__factory extends ContractFactory { - constructor(...args: EASConstructorParams) { - if (isSuperArgs(args)) { - super(...args); - } else { - super(_abi, _bytecode, args[0]); - } - } - - override deploy( - registry: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): Promise { - return super.deploy(registry, overrides || {}) as Promise; - } - override getDeployTransaction( - registry: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): TransactionRequest { - return super.getDeployTransaction(registry, overrides || {}); - } - override attach(address: string): EAS { - return super.attach(address) as EAS; - } - override connect(signer: Signer): EAS__factory { - return super.connect(signer) as EAS__factory; - } - - static readonly bytecode = _bytecode; - static readonly abi = _abi; - static createInterface(): EASInterface { - return new utils.Interface(_abi) as EASInterface; - } - static connect(address: string, signerOrProvider: Signer | Provider): EAS { - return new Contract(address, _abi, signerOrProvider) as EAS; - } -} diff --git a/deployments/sepolia/.chainId b/deployments/sepolia/.chainId new file mode 100644 index 0000000..1b14418 --- /dev/null +++ b/deployments/sepolia/.chainId @@ -0,0 +1 @@ +11155111 diff --git a/deployments/sepolia/.migrations.json b/deployments/sepolia/.migrations.json new file mode 100644 index 0000000..98bfb90 --- /dev/null +++ b/deployments/sepolia/.migrations.json @@ -0,0 +1,7 @@ +{ + "000001-registry": 1674848224, + "000002-eas": 1674848246, + "000003-register-initial-schemas": 1674848545, + "000004-name-initial-schemas": 1674848824, + "000100-test-seed": 1674849073 +} \ No newline at end of file diff --git a/deployments/sepolia/EAS.json b/deployments/sepolia/EAS.json new file mode 100644 index 0000000..b1d9837 --- /dev/null +++ b/deployments/sepolia/EAS.json @@ -0,0 +1,1271 @@ +{ + "address": "0x50DB967C805A88FAebA43a2049AAc78052ff9f8F", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ISchemaRegistry", + "name": "registry", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AccessDenied", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyRevoked", + "type": "error" + }, + { + "inputs": [], + "name": "AlreadyTimestamped", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientValue", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAttestation", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAttestations", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidExpirationTime", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidOffset", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRegistry", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRevocation", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRevocations", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSchema", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidVerifier", + "type": "error" + }, + { + "inputs": [], + "name": "Irrevocable", + "type": "error" + }, + { + "inputs": [], + "name": "NotFound", + "type": "error" + }, + { + "inputs": [], + "name": "NotPayable", + "type": "error" + }, + { + "inputs": [], + "name": "WrongSchema", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + } + ], + "name": "Attested", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + } + ], + "name": "Revoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "data", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "uint64", + "name": "timestamp", + "type": "uint64" + } + ], + "name": "Timestamped", + "type": "event" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData", + "name": "data", + "type": "tuple" + } + ], + "internalType": "struct AttestationRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "attest", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData", + "name": "data", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct EIP712Signature", + "name": "signature", + "type": "tuple" + }, + { + "internalType": "address", + "name": "attester", + "type": "address" + } + ], + "internalType": "struct DelegatedAttestationRequest", + "name": "delegatedRequest", + "type": "tuple" + } + ], + "name": "attestByDelegation", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getAttestTypeHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + } + ], + "name": "getAttestation", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "internalType": "uint64", + "name": "time", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "revocationTime", + "type": "uint64" + }, + { + "internalType": "bytes32", + "name": "refUUID", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "address", + "name": "attester", + "type": "address" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct Attestation", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRevokeTypeHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getSchemaRegistry", + "outputs": [ + { + "internalType": "contract ISchemaRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "data", + "type": "bytes32" + } + ], + "name": "getTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + } + ], + "name": "isAttestationValid", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData[]", + "name": "data", + "type": "tuple[]" + } + ], + "internalType": "struct MultiAttestationRequest[]", + "name": "multiRequests", + "type": "tuple[]" + } + ], + "name": "multiAttest", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint64", + "name": "expirationTime", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "bytes32", + "name": "refUUID", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct AttestationRequestData[]", + "name": "data", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct EIP712Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "attester", + "type": "address" + } + ], + "internalType": "struct MultiDelegatedAttestationRequest[]", + "name": "multiDelegatedRequests", + "type": "tuple[]" + } + ], + "name": "multiAttestByDelegation", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData[]", + "name": "data", + "type": "tuple[]" + } + ], + "internalType": "struct MultiRevocationRequest[]", + "name": "multiRequests", + "type": "tuple[]" + } + ], + "name": "multiRevoke", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData[]", + "name": "data", + "type": "tuple[]" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct EIP712Signature[]", + "name": "signatures", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "revoker", + "type": "address" + } + ], + "internalType": "struct MultiDelegatedRevocationRequest[]", + "name": "multiDelegatedRequests", + "type": "tuple[]" + } + ], + "name": "multiRevokeByDelegation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "data", + "type": "bytes32[]" + } + ], + "name": "multiTimestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData", + "name": "data", + "type": "tuple" + } + ], + "internalType": "struct RevocationRequest", + "name": "request", + "type": "tuple" + } + ], + "name": "revoke", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "schema", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct RevocationRequestData", + "name": "data", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "internalType": "struct EIP712Signature", + "name": "signature", + "type": "tuple" + }, + { + "internalType": "address", + "name": "revoker", + "type": "address" + } + ], + "internalType": "struct DelegatedRevocationRequest", + "name": "delegatedRequest", + "type": "tuple" + } + ], + "name": "revokeByDelegation", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "data", + "type": "bytes32" + } + ], + "name": "timestamp", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x37b634ef00a0103cfb48bb62695ddbb49318ec88a830981d2dab0529433e0252", + "receipt": { + "to": null, + "from": "0x01a93612f26100B6E18a2e3dd57df5c3ccaFeca1", + "contractAddress": "0x50DB967C805A88FAebA43a2049AAc78052ff9f8F", + "transactionIndex": 0, + "gasUsed": "4228426", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3308d1cd95bdd1837780cad5b49ac1f7322bd5574ec78a4f06e2367cf26d273f", + "transactionHash": "0x37b634ef00a0103cfb48bb62695ddbb49318ec88a830981d2dab0529433e0252", + "logs": [], + "blockNumber": 2778242, + "cumulativeGasUsed": "4228426", + "status": 1, + "byzantium": true + }, + "args": [ + "0x16399b867877D7f59deE9f04bD79B07fa8D17f7A" + ], + "numDeployments": 1, + "solcInputHash": "04f9ff8892dd62e5b44635f16b58cd9f", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ISchemaRegistry\",\"name\":\"registry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessDenied\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyRevoked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyTimestamped\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAttestation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAttestations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExpirationTime\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidOffset\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRevocation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRevocations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSchema\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidVerifier\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Irrevocable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongSchema\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"}],\"name\":\"Attested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"}],\"name\":\"Revoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"data\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"}],\"name\":\"Timestamped\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct AttestationRequest\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"attest\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData\",\"name\":\"data\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature\",\"name\":\"signature\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"}],\"internalType\":\"struct DelegatedAttestationRequest\",\"name\":\"delegatedRequest\",\"type\":\"tuple\"}],\"name\":\"attestByDelegation\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAttestTypeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"getAttestation\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"time\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"revocationTime\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct Attestation\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDomainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRevokeTypeHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSchemaRegistry\",\"outputs\":[{\"internalType\":\"contract ISchemaRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"data\",\"type\":\"bytes32\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"isAttestationValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiAttestationRequest[]\",\"name\":\"multiRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiAttest\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"expirationTime\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"refUUID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct AttestationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"attester\",\"type\":\"address\"}],\"internalType\":\"struct MultiDelegatedAttestationRequest[]\",\"name\":\"multiDelegatedRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiAttestByDelegation\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"internalType\":\"struct MultiRevocationRequest[]\",\"name\":\"multiRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiRevoke\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData[]\",\"name\":\"data\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature[]\",\"name\":\"signatures\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"revoker\",\"type\":\"address\"}],\"internalType\":\"struct MultiDelegatedRevocationRequest[]\",\"name\":\"multiDelegatedRequests\",\"type\":\"tuple[]\"}],\"name\":\"multiRevokeByDelegation\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"data\",\"type\":\"bytes32[]\"}],\"name\":\"multiTimestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct RevocationRequest\",\"name\":\"request\",\"type\":\"tuple\"}],\"name\":\"revoke\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"schema\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct RevocationRequestData\",\"name\":\"data\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"internalType\":\"struct EIP712Signature\",\"name\":\"signature\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"revoker\",\"type\":\"address\"}],\"internalType\":\"struct DelegatedRevocationRequest\",\"name\":\"delegatedRequest\",\"type\":\"tuple\"}],\"name\":\"revokeByDelegation\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"data\",\"type\":\"bytes32\"}],\"name\":\"timestamp\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))\":{\"details\":\"Attests to a specific schema.\",\"params\":{\"request\":\"The arguments of the attestation request. Example: attest({ schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\", data: { recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\", expirationTime: 0, revocable: true, refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\", data: \\\"0xF00D\\\", value: 0 } })\"},\"returns\":{\"_0\":\"The UUID of the new attestation.\"}},\"attestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))\":{\"details\":\"Attests to a specific schema via the provided EIP712 signature.\",\"params\":{\"delegatedRequest\":\"The arguments of the delegated attestation request. Example: attestByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, signature: { v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e' })\"},\"returns\":{\"_0\":\"The UUID of the new attestation.\"}},\"constructor\":{\"details\":\"Creates a new EAS instance.\",\"params\":{\"registry\":\"The address of the global schema registry.\"}},\"getAttestation(bytes32)\":{\"details\":\"Returns an existing attestation by UUID.\",\"params\":{\"uuid\":\"The UUID of the attestation to retrieve.\"},\"returns\":{\"_0\":\"The attestation data members.\"}},\"getDomainSeparator()\":{\"details\":\"Returns the domain separator used in the encoding of the signatures for attest, and revoke.\"},\"getNonce(address)\":{\"details\":\"Returns the current nonce per-account.\",\"params\":{\"account\":\"The requested account.\"},\"returns\":{\"_0\":\"The current nonce.\"}},\"getSchemaRegistry()\":{\"details\":\"Returns the address of the global schema registry.\",\"returns\":{\"_0\":\"The address of the global schema registry.\"}},\"getTimestamp(bytes32)\":{\"details\":\"Returns the timestamp that the specified data was timestamped with.\",\"params\":{\"data\":\"The data to query.\"},\"returns\":{\"_0\":\"The timestamp the data was timestamped with.\"}},\"isAttestationValid(bytes32)\":{\"details\":\"Checks whether an attestation exists.\",\"params\":{\"uuid\":\"The UUID of the attestation to retrieve.\"},\"returns\":{\"_0\":\"Whether an attestation exists.\"}},\"multiAttest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[])[])\":{\"details\":\"Attests to multiple schemas.\",\"params\":{\"multiRequests\":\"The arguments of the multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttest([{ schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 1000 }, { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 0, revocable: false, refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174', data: '0x00', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: true, refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f', data: '0x12345678', value: 0 }, }])\"},\"returns\":{\"_0\":\"The UUIDs of the new attestations.\"}},\"multiAttestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])\":{\"details\":\"Attests to multiple schemas using via provided EIP712 signatures.\",\"params\":{\"multiDelegatedRequests\":\"The arguments of the delegated multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttestByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, { recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: false, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x00', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4' }])\"},\"returns\":{\"_0\":\"The UUIDs of the new attestations.\"}},\"multiRevoke((bytes32,(bytes32,uint256)[])[])\":{\"details\":\"Revokes existing attestations to multiple schemas.\",\"params\":{\"multiRequests\":\"The arguments of the multi revocation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevoke([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019', value: 0 }, }])\"}},\"multiRevokeByDelegation((bytes32,(bytes32,uint256)[],(uint8,bytes32,bytes32)[],address)[])\":{\"details\":\"Revokes existing attestations to multiple schemas via provided EIP712 signatures.\",\"params\":{\"multiDelegatedRequests\":\"The arguments of the delegated multi revocation attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevokeByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' }])\"}},\"multiTimestamp(bytes32[])\":{\"details\":\"Timestamps the specified multiple bytes32 data.\",\"params\":{\"data\":\"The data to timestamp.\"},\"returns\":{\"_0\":\"The timestamp the data was timestamped with.\"}},\"revoke((bytes32,(bytes32,uint256)))\":{\"details\":\"Revokes an existing attestation to a specific schema. Example: revoke({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d', value: 0 } })\",\"params\":{\"request\":\"The arguments of the revocation request.\"}},\"revokeByDelegation((bytes32,(bytes32,uint256),(uint8,bytes32,bytes32),address))\":{\"details\":\"Revokes an existing attestation to a specific schema via the provided EIP712 signature. Example: revokeByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba', value: 0 }, signature: { v: 27, r: '0xb593...7142', s: '0x0f5b...2cce' }, revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' })\",\"params\":{\"delegatedRequest\":\"The arguments of the delegated revocation request.\"}},\"timestamp(bytes32)\":{\"details\":\"Timestamps the specified bytes32 data.\",\"params\":{\"data\":\"The data to timestamp.\"},\"returns\":{\"_0\":\"The timestamp the data was timestamped with.\"}}},\"title\":\"EAS - Ethereum Attestation Service\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getAttestTypeHash()\":{\"notice\":\"Returns the EIP712 type hash for the attest function.\"},\"getRevokeTypeHash()\":{\"notice\":\"Returns the EIP712 type hash for the revoke function.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/EAS.sol\":\"EAS\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ECDSA.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712 {\\n /* solhint-disable var-name-mixedcase */\\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\\n // invalidate the cached domain separator if the chain id changes.\\n bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;\\n uint256 private immutable _CACHED_CHAIN_ID;\\n address private immutable _CACHED_THIS;\\n\\n bytes32 private immutable _HASHED_NAME;\\n bytes32 private immutable _HASHED_VERSION;\\n bytes32 private immutable _TYPE_HASH;\\n\\n /* solhint-enable var-name-mixedcase */\\n\\n /**\\n * @dev Initializes the domain separator and parameter caches.\\n *\\n * The meaning of `name` and `version` is specified in\\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n *\\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n * - `version`: the current major version of the signing domain.\\n *\\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n * contract upgrade].\\n */\\n constructor(string memory name, string memory version) {\\n bytes32 hashedName = keccak256(bytes(name));\\n bytes32 hashedVersion = keccak256(bytes(version));\\n bytes32 typeHash = keccak256(\\n \\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"\\n );\\n _HASHED_NAME = hashedName;\\n _HASHED_VERSION = hashedVersion;\\n _CACHED_CHAIN_ID = block.chainid;\\n _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);\\n _CACHED_THIS = address(this);\\n _TYPE_HASH = typeHash;\\n }\\n\\n /**\\n * @dev Returns the domain separator for the current chain.\\n */\\n function _domainSeparatorV4() internal view returns (bytes32) {\\n if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {\\n return _CACHED_DOMAIN_SEPARATOR;\\n } else {\\n return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);\\n }\\n }\\n\\n function _buildDomainSeparator(\\n bytes32 typeHash,\\n bytes32 nameHash,\\n bytes32 versionHash\\n ) private view returns (bytes32) {\\n return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));\\n }\\n\\n /**\\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n * function returns the hash of the fully encoded EIP712 message for this domain.\\n *\\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n *\\n * ```solidity\\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n * keccak256(\\\"Mail(address to,string contents)\\\"),\\n * mailTo,\\n * keccak256(bytes(mailContents))\\n * )));\\n * address signer = ECDSA.recover(digest, signature);\\n * ```\\n */\\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\\n }\\n}\\n\",\"keccak256\":\"0x948d8b2d18f38141ec78c5229d770d950ebc781ed3f44cc9e3ccbb9fded5846a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"},\"contracts/EAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nimport { EMPTY_UUID, EIP712Signature } from \\\"./Types.sol\\\";\\n\\n// prettier-ignore\\nimport {\\n Attestation,\\n AttestationRequest,\\n AttestationRequestData,\\n DelegatedAttestationRequest,\\n DelegatedRevocationRequest,\\n IEAS,\\n MultiAttestationRequest,\\n MultiDelegatedAttestationRequest,\\n MultiDelegatedRevocationRequest,\\n MultiRevocationRequest,\\n RevocationRequest,\\n RevocationRequestData\\n} from \\\"./IEAS.sol\\\";\\nimport { ISchemaRegistry, SchemaRecord } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Verifier } from \\\"./EIP712Verifier.sol\\\";\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\nstruct AttestationsResult {\\n uint256 usedValue; // Total ETH amount that was sent to resolvers.\\n bytes32[] uuids; // UUIDs of the new attestations.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service\\n */\\ncontract EAS is IEAS, EIP712Verifier {\\n using Address for address payable;\\n\\n error AccessDenied();\\n error AlreadyRevoked();\\n error AlreadyTimestamped();\\n error InsufficientValue();\\n error InvalidAttestation();\\n error InvalidAttestations();\\n error InvalidExpirationTime();\\n error InvalidLength();\\n error InvalidOffset();\\n error InvalidRegistry();\\n error InvalidRevocation();\\n error InvalidRevocations();\\n error InvalidSchema();\\n error InvalidVerifier();\\n error Irrevocable();\\n error NotFound();\\n error NotPayable();\\n error WrongSchema();\\n\\n // The version of the contract.\\n string public constant VERSION = \\\"0.24\\\";\\n\\n // A zero expiration represents an non-expiring attestation.\\n uint64 private constant NO_EXPIRATION_TIME = 0;\\n\\n // The global schema registry.\\n ISchemaRegistry private immutable _schemaRegistry;\\n\\n // The global mapping between attestations and their UUIDs.\\n mapping(bytes32 => Attestation) private _db;\\n\\n // The global mapping between data and their timestamps.\\n mapping(bytes32 => uint64) private _timestamps;\\n\\n /**\\n * @dev Creates a new EAS instance.\\n *\\n * @param registry The address of the global schema registry.\\n */\\n constructor(ISchemaRegistry registry) EIP712Verifier(VERSION) {\\n if (address(registry) == address(0)) {\\n revert InvalidRegistry();\\n }\\n\\n _schemaRegistry = registry;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry) {\\n return _schemaRegistry;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function attest(AttestationRequest calldata request) public payable virtual returns (bytes32) {\\n AttestationRequestData[] memory requests = new AttestationRequestData[](1);\\n requests[0] = request.data;\\n\\n return _attest(request.schema, requests, msg.sender, msg.value, true).uuids[0];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) public payable virtual returns (bytes32) {\\n _verifyAttest(delegatedRequest);\\n\\n AttestationRequestData[] memory data = new AttestationRequestData[](1);\\n data[0] = delegatedRequest.data;\\n\\n return _attest(delegatedRequest.schema, data, delegatedRequest.attester, msg.value, true).uuids[0];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory) {\\n // Since a multi-attest call is going to make multiple attestations for multiple schemas, we'd need to collect\\n // all the returned UUIDs into a single list.\\n bytes32[][] memory totalUuids = new bytes32[][](multiRequests.length);\\n uint256 totalUuidsCount = 0;\\n\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiRequests.length - 1;\\n }\\n\\n // Process the current batch of attestations.\\n MultiAttestationRequest calldata multiRequest = multiRequests[i];\\n AttestationsResult memory res = _attest(\\n multiRequest.schema,\\n multiRequest.data,\\n msg.sender,\\n availableValue,\\n last\\n );\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= res.usedValue;\\n\\n // Collect UUIDs (and merge them later).\\n totalUuids[i] = res.uuids;\\n unchecked {\\n totalUuidsCount += res.uuids.length;\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Merge all the collected UUIDs and return them as a flatten array.\\n return _mergeUUIDs(totalUuids, totalUuidsCount);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory) {\\n // Since a multi-attest call is going to make multiple attestations for multiple schemas, we'd need to collect\\n // all the returned UUIDs into a single list.\\n bytes32[][] memory totalUuids = new bytes32[][](multiDelegatedRequests.length);\\n uint256 totalUuidsCount = 0;\\n\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiDelegatedRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiDelegatedRequests.length - 1;\\n }\\n\\n MultiDelegatedAttestationRequest calldata multiDelegatedRequest = multiDelegatedRequests[i];\\n AttestationRequestData[] calldata data = multiDelegatedRequest.data;\\n\\n // Ensure that no inputs are missing.\\n if (data.length == 0 || data.length != multiDelegatedRequest.signatures.length) {\\n revert InvalidLength();\\n }\\n\\n // Verify EIP712 signatures. Please note that the signatures are assumed to be signed with increasing nonces.\\n for (uint256 j = 0; j < data.length; ) {\\n _verifyAttest(\\n DelegatedAttestationRequest({\\n schema: multiDelegatedRequest.schema,\\n data: data[j],\\n signature: multiDelegatedRequest.signatures[j],\\n attester: multiDelegatedRequest.attester\\n })\\n );\\n\\n unchecked {\\n ++j;\\n }\\n }\\n\\n // Process the current batch of attestations.\\n AttestationsResult memory res = _attest(\\n multiDelegatedRequest.schema,\\n data,\\n multiDelegatedRequest.attester,\\n availableValue,\\n last\\n );\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= res.usedValue;\\n\\n // Collect UUIDs (and merge them later).\\n totalUuids[i] = res.uuids;\\n unchecked {\\n totalUuidsCount += res.uuids.length;\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n // Merge all the collected UUIDs and return them as a flatten array.\\n return _mergeUUIDs(totalUuids, totalUuidsCount);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function revoke(RevocationRequest calldata request) public payable virtual {\\n RevocationRequestData[] memory requests = new RevocationRequestData[](1);\\n requests[0] = request.data;\\n\\n _revoke(request.schema, requests, msg.sender, msg.value, true);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) public payable virtual {\\n _verifyRevoke(delegatedRequest);\\n\\n RevocationRequestData[] memory data = new RevocationRequestData[](1);\\n data[0] = delegatedRequest.data;\\n\\n _revoke(delegatedRequest.schema, data, delegatedRequest.revoker, msg.value, true);\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable {\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiRequests.length - 1;\\n }\\n\\n MultiRevocationRequest calldata multiRequest = multiRequests[i];\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= _revoke(multiRequest.schema, multiRequest.data, msg.sender, availableValue, last);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable {\\n // We are keeping track of the total available ETH amount that can be sent to resolvers and will keep deducting\\n // from it to verify that there isn't any attempt to send too much ETH to resolvers. Please note that unless\\n // some ETH was stuck in the contract by accident (which shouldn't happen in normal conditions), it won't be\\n // possible to send too much ETH anyway.\\n uint availableValue = msg.value;\\n\\n for (uint256 i = 0; i < multiDelegatedRequests.length; ) {\\n // The last batch is handled slightly differently: if the total available ETH wasn't spent in full and there\\n // is a remainder - it will be refunded back to the attester (something that we can only verify during the\\n // last and final batch).\\n bool last;\\n unchecked {\\n last = i == multiDelegatedRequests.length - 1;\\n }\\n\\n MultiDelegatedRevocationRequest memory multiDelegatedRequest = multiDelegatedRequests[i];\\n RevocationRequestData[] memory data = multiDelegatedRequest.data;\\n\\n // Ensure that no inputs are missing.\\n if (data.length == 0 || data.length != multiDelegatedRequest.signatures.length) {\\n revert InvalidLength();\\n }\\n\\n // Verify EIP712 signatures. Please note that the signatures are assumed to be signed with increasing nonces.\\n for (uint256 j = 0; j < data.length; ) {\\n _verifyRevoke(\\n DelegatedRevocationRequest({\\n schema: multiDelegatedRequest.schema,\\n data: data[j],\\n signature: multiDelegatedRequest.signatures[j],\\n revoker: multiDelegatedRequest.revoker\\n })\\n );\\n\\n unchecked {\\n ++j;\\n }\\n }\\n\\n // Ensure to deduct the ETH that was forwarded to the resolver during the processing of this batch.\\n availableValue -= _revoke(\\n multiDelegatedRequest.schema,\\n data,\\n multiDelegatedRequest.revoker,\\n availableValue,\\n last\\n );\\n\\n unchecked {\\n ++i;\\n }\\n }\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function timestamp(bytes32 data) external returns (uint64) {\\n uint64 time = _time();\\n\\n _timestamp(data, time);\\n\\n return time;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function multiTimestamp(bytes32[] calldata data) external returns (uint64) {\\n uint64 time = _time();\\n\\n uint256 length = data.length;\\n for (uint256 i = 0; i < length; ) {\\n _timestamp(data[i], time);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return time;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory) {\\n return _db[uuid];\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function isAttestationValid(bytes32 uuid) public view returns (bool) {\\n return _db[uuid].uuid != 0;\\n }\\n\\n /**\\n * @inheritdoc IEAS\\n */\\n function getTimestamp(bytes32 data) external view returns (uint64) {\\n return _timestamps[data];\\n }\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param schema // the unique identifier of the schema to attest to.\\n * @param data The arguments of the attestation requests.\\n * @param attester The attesting account.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return The UUID of the new attestations and the total sent ETH amount.\\n */\\n function _attest(\\n bytes32 schema,\\n AttestationRequestData[] memory data,\\n address attester,\\n uint256 availableValue,\\n bool last\\n ) private returns (AttestationsResult memory) {\\n uint256 length = data.length;\\n\\n AttestationsResult memory res;\\n res.uuids = new bytes32[](length);\\n\\n // Ensure that we aren't attempting to attest to a non-existing schema.\\n SchemaRecord memory schemaRecord = _schemaRegistry.getSchema(schema);\\n if (schemaRecord.uuid == EMPTY_UUID) {\\n revert InvalidSchema();\\n }\\n\\n Attestation[] memory attestations = new Attestation[](length);\\n uint256[] memory values = new uint256[](length);\\n\\n for (uint256 i = 0; i < length; ) {\\n AttestationRequestData memory request = data[i];\\n\\n // Ensure that either no expiration time was set or that it was set in the future.\\n if (request.expirationTime != NO_EXPIRATION_TIME && request.expirationTime <= _time()) {\\n revert InvalidExpirationTime();\\n }\\n\\n // Ensure that we aren't trying to make a revocable attestation for a non-revocable schema.\\n if (!schemaRecord.revocable && request.revocable) {\\n revert Irrevocable();\\n }\\n\\n Attestation memory attestation = Attestation({\\n uuid: EMPTY_UUID,\\n schema: schema,\\n refUUID: request.refUUID,\\n time: _time(),\\n expirationTime: request.expirationTime,\\n revocationTime: 0,\\n recipient: request.recipient,\\n attester: attester,\\n revocable: request.revocable,\\n data: request.data\\n });\\n\\n // Look for the first non-existing UUID (and use a bump seed/nonce in the rare case of a conflict).\\n bytes32 uuid;\\n uint32 bump = 0;\\n while (true) {\\n uuid = _getUUID(attestation, bump);\\n if (_db[uuid].uuid == EMPTY_UUID) {\\n break;\\n }\\n\\n unchecked {\\n ++bump;\\n }\\n }\\n attestation.uuid = uuid;\\n\\n _db[uuid] = attestation;\\n\\n if (request.refUUID != 0) {\\n // Ensure that we aren't trying to attest to a non-existing referenced UUID.\\n if (!isAttestationValid(request.refUUID)) {\\n revert NotFound();\\n }\\n }\\n\\n attestations[i] = attestation;\\n values[i] = request.value;\\n\\n res.uuids[i] = uuid;\\n\\n emit Attested(request.recipient, attester, uuid, schema);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n res.usedValue = _resolveAttestations(schemaRecord, attestations, values, false, availableValue, last);\\n\\n return res;\\n }\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * @param schema The unique identifier of the schema to attest to.\\n * @param data The arguments of the revocation requests.\\n * @param revoker The revoking account.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _revoke(\\n bytes32 schema,\\n RevocationRequestData[] memory data,\\n address revoker,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n // Ensure that a non-existing schema ID wasn't passed by accident.\\n SchemaRecord memory schemaRecord = _schemaRegistry.getSchema(schema);\\n if (schemaRecord.uuid == EMPTY_UUID) {\\n revert InvalidSchema();\\n }\\n\\n uint256 length = data.length;\\n Attestation[] memory attestations = new Attestation[](length);\\n uint256[] memory values = new uint256[](length);\\n\\n for (uint256 i = 0; i < length; ) {\\n RevocationRequestData memory request = data[i];\\n\\n Attestation storage attestation = _db[request.uuid];\\n\\n // Ensure that we aren't attempting to revoke a non-existing attestation.\\n if (attestation.uuid == EMPTY_UUID) {\\n revert NotFound();\\n }\\n\\n // Ensure that a wrong schema ID wasn't passed by accident.\\n if (attestation.schema != schema) {\\n revert InvalidSchema();\\n }\\n\\n // Allow only original attesters to revoke their attestations.\\n if (attestation.attester != revoker) {\\n revert AccessDenied();\\n }\\n\\n // Please note that also checking of the schema itself is revocable is unnecessary, since it's not possible to\\n // make revocable attestations to an irrevocable schema.\\n if (!attestation.revocable) {\\n revert Irrevocable();\\n }\\n\\n // Ensure that we aren't trying to revoke the same attestation twice.\\n if (attestation.revocationTime != 0) {\\n revert AlreadyRevoked();\\n }\\n attestation.revocationTime = _time();\\n\\n attestations[i] = attestation;\\n values[i] = request.value;\\n\\n emit Revoked(attestation.recipient, revoker, request.uuid, attestation.schema);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return _resolveAttestations(schemaRecord, attestations, values, true, availableValue, last);\\n }\\n\\n /**\\n * @dev Resolves a new attestation or a revocation of an existing attestation.\\n *\\n * @param schemaRecord The schema of the attestation.\\n * @param attestation The data of the attestation to make/revoke.\\n * @param value An explicit ETH amount to send to the resolver.\\n * @param isRevocation Whether to resolve an attestation or its revocation.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _resolveAttestation(\\n SchemaRecord memory schemaRecord,\\n Attestation memory attestation,\\n uint256 value,\\n bool isRevocation,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n ISchemaResolver resolver = schemaRecord.resolver;\\n if (address(resolver) == address(0)) {\\n // Ensure that we don't accept payments if there is no resolver.\\n if (value != 0) {\\n revert NotPayable();\\n }\\n\\n return 0;\\n }\\n\\n // Ensure that we don't accept payments which can't be forwarded to the resolver.\\n if (value != 0 && !resolver.isPayable()) {\\n revert NotPayable();\\n }\\n\\n // Ensure that the attester/revoker doesn't try to spend more than available.\\n if (value > availableValue) {\\n revert InsufficientValue();\\n }\\n\\n // Ensure to deduct the sent value explicitly.\\n unchecked {\\n availableValue -= value;\\n }\\n\\n if (isRevocation) {\\n if (!resolver.revoke{ value: value }(attestation)) {\\n revert InvalidRevocation();\\n }\\n } else if (!resolver.attest{ value: value }(attestation)) {\\n revert InvalidAttestation();\\n }\\n\\n if (last) {\\n _refund(availableValue);\\n }\\n\\n return value;\\n }\\n\\n /**\\n * @dev Resolves multiple attestations or revocations of existing attestations.\\n *\\n * @param schemaRecord The schema of the attestation.\\n * @param attestations The data of the attestations to make/revoke.\\n * @param values Explicit ETH amounts to send to the resolver.\\n * @param isRevocation Whether to resolve an attestation or its revocation.\\n * @param availableValue The total available ETH amount that can be sent to the resolver.\\n * @param last Whether this is the last attestations/revocations set.\\n *\\n * @return Returns the total sent ETH amount.\\n */\\n function _resolveAttestations(\\n SchemaRecord memory schemaRecord,\\n Attestation[] memory attestations,\\n uint256[] memory values,\\n bool isRevocation,\\n uint256 availableValue,\\n bool last\\n ) private returns (uint256) {\\n uint256 length = attestations.length;\\n if (length == 1) {\\n return _resolveAttestation(schemaRecord, attestations[0], values[0], isRevocation, availableValue, last);\\n }\\n\\n ISchemaResolver resolver = schemaRecord.resolver;\\n if (address(resolver) == address(0)) {\\n // Ensure that we don't accept payments if there is no resolver.\\n for (uint256 i = 0; i < length; ) {\\n if (values[i] != 0) {\\n revert NotPayable();\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return 0;\\n }\\n\\n uint256 totalUsedValue = 0;\\n\\n for (uint256 i = 0; i < length; ) {\\n uint256 value = values[i];\\n\\n // Ensure that we don't accept payments which can't be forwarded to the resolver.\\n if (value != 0 && !resolver.isPayable()) {\\n revert NotPayable();\\n }\\n\\n // Ensure that the attester/revoker doesn't try to spend more than available.\\n if (value > availableValue) {\\n revert InsufficientValue();\\n }\\n\\n // Ensure to deduct the sent value explicitly and add it to the total used value by the batch.\\n unchecked {\\n availableValue -= value;\\n totalUsedValue += value;\\n\\n ++i;\\n }\\n }\\n\\n if (isRevocation) {\\n if (!resolver.multiRevoke{ value: totalUsedValue }(attestations, values)) {\\n revert InvalidRevocations();\\n }\\n } else if (!resolver.multiAttest{ value: totalUsedValue }(attestations, values)) {\\n revert InvalidAttestations();\\n }\\n\\n if (last) {\\n _refund(availableValue);\\n }\\n\\n return totalUsedValue;\\n }\\n\\n /**\\n * @dev Calculates a UUID for a given attestation.\\n *\\n * @param attestation The input attestation.\\n * @param bump A bump value to use in case of a UUID conflict.\\n *\\n * @return Attestation UUID.\\n */\\n function _getUUID(Attestation memory attestation, uint32 bump) private pure returns (bytes32) {\\n return\\n keccak256(\\n abi.encodePacked(\\n attestation.schema,\\n attestation.recipient,\\n attestation.attester,\\n attestation.time,\\n attestation.expirationTime,\\n attestation.revocable,\\n attestation.refUUID,\\n attestation.data,\\n bump\\n )\\n );\\n }\\n\\n /**\\n * @dev Refunds remaining ETH amount to the attester.\\n *\\n * @param remainingValue The remaining ETH amount that was not sent to the resolver.\\n */\\n function _refund(uint256 remainingValue) private {\\n if (remainingValue > 0) {\\n // Using a regular transfer here might revert, for some non-EOA attesters, due to exceeding of the 2300\\n // gas limit which is why we're using call instead (via sendValue), which the 2300 gas limit does not\\n // apply for.\\n payable(msg.sender).sendValue(remainingValue);\\n }\\n }\\n\\n /**\\n * @dev Merges lists of UUIDs.\\n *\\n * @param uuidLists The provided lists of UUIDs.\\n * @param uuidsCount Total UUIDs count.\\n *\\n * @return A merged and flatten list of all the UUIDs.\\n */\\n function _mergeUUIDs(bytes32[][] memory uuidLists, uint256 uuidsCount) private pure returns (bytes32[] memory) {\\n bytes32[] memory uuids = new bytes32[](uuidsCount);\\n\\n uint256 currentIndex = 0;\\n for (uint256 i = 0; i < uuidLists.length; ) {\\n bytes32[] memory currentUuids = uuidLists[i];\\n for (uint256 j = 0; j < currentUuids.length; ) {\\n uuids[currentIndex] = currentUuids[j];\\n\\n unchecked {\\n ++j;\\n ++currentIndex;\\n }\\n }\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return uuids;\\n }\\n\\n /**\\n * @dev Timestamps the specified bytes32 data.\\n *\\n * @param data The data to timestamp.\\n * @param time The timestamp.\\n */\\n function _timestamp(bytes32 data, uint64 time) private {\\n if (_timestamps[data] != 0) {\\n revert AlreadyTimestamped();\\n }\\n\\n _timestamps[data] = time;\\n\\n emit Timestamped(data, time);\\n }\\n\\n /**\\n * @dev Returns the current's block timestamp. This method is overridden during tests and used to simulate the\\n * current block time.\\n */\\n function _time() internal view virtual returns (uint64) {\\n return uint64(block.timestamp);\\n }\\n}\\n\",\"keccak256\":\"0x03bdc15132549a8e8008d33397126dd4e9c049b5d7ce901d737c4639cba85ef3\",\"license\":\"MIT\"},\"contracts/EIP712Verifier.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { EIP712 } from \\\"@openzeppelin/contracts/utils/cryptography/EIP712.sol\\\";\\nimport { ECDSA } from \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\n\\n// prettier-ignore\\nimport {\\n AttestationRequest,\\n AttestationRequestData,\\n DelegatedAttestationRequest,\\n DelegatedRevocationRequest,\\n RevocationRequest,\\n RevocationRequestData\\n} from \\\"./IEAS.sol\\\";\\n\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @title EIP712 typed signatures verifier for EAS delegated attestations.\\n */\\nabstract contract EIP712Verifier is EIP712 {\\n error InvalidSignature();\\n\\n // The hash of the data type used to relay calls to the attest function. It's the value of\\n // keccak256(\\\"Attest(bytes32 schema,address recipient,uint64 expirationTime,bool revocable,bytes32 refUUID,bytes data,uint256 nonce)\\\").\\n bytes32 private constant ATTEST_TYPEHASH = 0x6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c2;\\n\\n // The hash of the data type used to relay calls to the revoke function. It's the value of\\n // keccak256(\\\"Revoke(bytes32 schema,bytes32 uuid,uint256 nonce)\\\").\\n bytes32 private constant REVOKE_TYPEHASH = 0xf4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e;\\n\\n // Replay protection nonces.\\n mapping(address => uint256) private _nonces;\\n\\n /**\\n * @dev Creates a new EIP712Verifier instance.\\n *\\n * @param version The current major version of the signing domain\\n */\\n constructor(string memory version) EIP712(\\\"EAS\\\", version) {}\\n\\n /**\\n * @dev Returns the domain separator used in the encoding of the signatures for attest, and revoke.\\n */\\n function getDomainSeparator() external view returns (bytes32) {\\n return _domainSeparatorV4();\\n }\\n\\n /**\\n * @dev Returns the current nonce per-account.\\n *\\n * @param account The requested account.\\n *\\n * @return The current nonce.\\n */\\n function getNonce(address account) external view returns (uint256) {\\n return _nonces[account];\\n }\\n\\n /**\\n * Returns the EIP712 type hash for the attest function.\\n */\\n function getAttestTypeHash() external pure returns (bytes32) {\\n return ATTEST_TYPEHASH;\\n }\\n\\n /**\\n * Returns the EIP712 type hash for the revoke function.\\n */\\n function getRevokeTypeHash() external pure returns (bytes32) {\\n return REVOKE_TYPEHASH;\\n }\\n\\n /**\\n * @dev Verifies delegated attestation request.\\n *\\n * @param request The arguments of the delegated attestation request.\\n */\\n function _verifyAttest(DelegatedAttestationRequest memory request) internal {\\n AttestationRequestData memory data = request.data;\\n EIP712Signature memory signature = request.signature;\\n\\n uint256 nonce;\\n unchecked {\\n nonce = _nonces[request.attester]++;\\n }\\n\\n bytes32 digest = _hashTypedDataV4(\\n keccak256(\\n abi.encode(\\n ATTEST_TYPEHASH,\\n request.schema,\\n data.recipient,\\n data.expirationTime,\\n data.revocable,\\n data.refUUID,\\n keccak256(data.data),\\n nonce\\n )\\n )\\n );\\n\\n if (ECDSA.recover(digest, signature.v, signature.r, signature.s) != request.attester) {\\n revert InvalidSignature();\\n }\\n }\\n\\n /**\\n * @dev Verifies delegated revocation request.\\n *\\n * @param request The arguments of the delegated revocation request.\\n */\\n function _verifyRevoke(DelegatedRevocationRequest memory request) internal {\\n RevocationRequestData memory data = request.data;\\n EIP712Signature memory signature = request.signature;\\n\\n uint256 nonce;\\n unchecked {\\n nonce = _nonces[request.revoker]++;\\n }\\n\\n bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(REVOKE_TYPEHASH, request.schema, data.uuid, nonce)));\\n\\n if (ECDSA.recover(digest, signature.v, signature.r, signature.s) != request.revoker) {\\n revert InvalidSignature();\\n }\\n }\\n}\\n\",\"keccak256\":\"0x89feb3fa806c74becca2b25f62cbb48bebd535f3bdf87a8fead01ceb21130f98\",\"license\":\"MIT\"},\"contracts/IEAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaRegistry } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @dev A struct representing a single attestation.\\n */\\nstruct Attestation {\\n bytes32 uuid; // A unique identifier of the attestation.\\n bytes32 schema; // The unique identifier of the schema.\\n uint64 time; // The time when the attestation was created (Unix timestamp).\\n uint64 expirationTime; // The time when the attestation expires (Unix timestamp).\\n uint64 revocationTime; // The time when the attestation was revoked (Unix timestamp).\\n bytes32 refUUID; // The UUID of the related attestation.\\n address recipient; // The recipient of the attestation.\\n address attester; // The attester/sender of the attestation.\\n bool revocable; // Whether the attestation is revocable.\\n bytes data; // Custom attestation data.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the attestation request.\\n */\\nstruct AttestationRequestData {\\n address recipient; // The recipient of the attestation.\\n uint64 expirationTime; // The time when the attestation expires (Unix timestamp).\\n bool revocable; // Whether the attestation is revocable.\\n bytes32 refUUID; // The UUID of the related attestation.\\n bytes data; // Custom attestation data.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the attestation request.\\n */\\nstruct AttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the full delegated attestation request.\\n */\\nstruct DelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi attestation request.\\n */\\nstruct MultiAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi attestation request.\\n */\\nstruct MultiDelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the revocation request.\\n */\\nstruct RevocationRequestData {\\n bytes32 uuid; // The UUID of the attestation to revoke.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the revocation request.\\n */\\nstruct RevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the full delegated revocation request.\\n */\\nstruct DelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi revocation request.\\n */\\nstruct MultiRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi revocation request.\\n */\\nstruct MultiDelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service interface.\\n */\\ninterface IEAS {\\n /**\\n * @dev Emitted when an attestation has been made.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param uuid The UUID the revoked attestation.\\n * @param schema The UUID of the schema.\\n */\\n event Attested(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Emitted when an attestation has been revoked.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param schema The UUID of the schema.\\n * @param uuid The UUID the revoked attestation.\\n */\\n event Revoked(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Emitted when a data has been timestamped.\\n *\\n * @param data The data.\\n * @param timestamp The timestamp.\\n */\\n event Timestamped(bytes32 indexed data, uint64 indexed timestamp);\\n\\n /**\\n * @dev Returns the address of the global schema registry.\\n *\\n * @return The address of the global schema registry.\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry);\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param request The arguments of the attestation request.\\n *\\n * Example:\\n *\\n * attest({\\n * schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\",\\n * data: {\\n * recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\",\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\",\\n * data: \\\"0xF00D\\\",\\n * value: 0\\n * }\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attest(AttestationRequest calldata request) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to a specific schema via the provided EIP712 signature.\\n *\\n * @param delegatedRequest The arguments of the delegated attestation request.\\n *\\n * Example:\\n *\\n * attestByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * signature: {\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e'\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi attestation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttest([{\\n * schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 1000\\n * },\\n * {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f',\\n * data: '0x12345678',\\n * value: 0\\n * },\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Attests to multiple schemas using via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttestByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * {\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4'\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * Example:\\n *\\n * revoke({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d',\\n * value: 0\\n * }\\n * })\\n *\\n * @param request The arguments of the revocation request.\\n */\\n function revoke(RevocationRequest calldata request) external payable;\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema via the provided EIP712 signature.\\n *\\n * Example:\\n *\\n * revokeByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba',\\n * value: 0\\n * },\\n * signature: {\\n * v: 27,\\n * r: '0xb593...7142',\\n * s: '0x0f5b...2cce'\\n * },\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * })\\n *\\n * @param delegatedRequest The arguments of the delegated revocation request.\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi revocation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevoke([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019',\\n * value: 0\\n * },\\n * }])\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi revocation attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevokeByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * }])\\n *\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable;\\n\\n /**\\n * @dev Timestamps the specified bytes32 data.\\n *\\n * @param data The data to timestamp.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function timestamp(bytes32 data) external returns (uint64);\\n\\n /**\\n * @dev Timestamps the specified multiple bytes32 data.\\n *\\n * @param data The data to timestamp.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function multiTimestamp(bytes32[] calldata data) external returns (uint64);\\n\\n /**\\n * @dev Returns an existing attestation by UUID.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return The attestation data members.\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory);\\n\\n /**\\n * @dev Checks whether an attestation exists.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return Whether an attestation exists.\\n */\\n function isAttestationValid(bytes32 uuid) external view returns (bool);\\n\\n /**\\n * @dev Returns the timestamp that the specified data was timestamped with.\\n *\\n * @param data The data to query.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function getTimestamp(bytes32 data) external view returns (uint64);\\n}\\n\",\"keccak256\":\"0xeb67cb6f9e51eb5e742f1f14e291b9647ee5f8f0914d0513e094b9ae3f36515d\",\"license\":\"MIT\"},\"contracts/ISchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title A struct representing a record for a submitted schema.\\n */\\nstruct SchemaRecord {\\n bytes32 uuid; // The unique identifier of the schema.\\n ISchemaResolver resolver; // Optional schema resolver.\\n bool revocable; // Whether the schema allows revocations explicitly.\\n string schema; // Custom specification of the schema (e.g., an ABI).\\n}\\n\\n/**\\n * @title The global schema registry interface.\\n */\\ninterface ISchemaRegistry {\\n /**\\n * @dev Emitted when a new schema has been registered\\n *\\n * @param uuid The schema UUID.\\n * @param registerer The address of the account used to register the schema.\\n */\\n event Registered(bytes32 indexed uuid, address registerer);\\n\\n /**\\n * @dev Submits and reserves a new schema\\n *\\n * @param schema The schema data schema.\\n * @param resolver An optional schema resolver.\\n * @param revocable Whether the schema allows revocations explicitly.\\n *\\n * @return The UUID of the new schema.\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32);\\n\\n /**\\n * @dev Returns an existing schema by UUID\\n *\\n * @param uuid The UUID of the schema to retrieve.\\n *\\n * @return The schema data members.\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory);\\n}\\n\",\"keccak256\":\"0x87507ef31d547426def5bc7a808c1c5035d30f4555b2a58c022d6ae49ffea852\",\"license\":\"MIT\"},\"contracts/Types.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\n// A representation of an empty/uninitialized UUID.\\nbytes32 constant EMPTY_UUID = 0;\\n\\n/**\\n * @dev A struct representing EIP712 signature data.\\n */\\nstruct EIP712Signature {\\n uint8 v; // The recovery ID.\\n bytes32 r; // The x-coordinate of the nonce R.\\n bytes32 s; // The signature data.\\n}\\n\",\"keccak256\":\"0xda035d575e6fc7f857a23b795ca7cd7d9eb306f068224271ac0fec03e433de94\",\"license\":\"MIT\"},\"contracts/resolver/ISchemaResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Attestation } from \\\"../IEAS.sol\\\";\\n\\n/**\\n * @title The interface of an optional schema resolver.\\n */\\ninterface ISchemaResolver {\\n /**\\n * @dev Returns whether the resolver supports ETH transfers.\\n */\\n function isPayable() external pure returns (bool);\\n\\n /**\\n * @dev Processes an attestation and verifies whether it's valid.\\n *\\n * @param attestation The new attestation.\\n *\\n * @return Whether the attestation is valid.\\n */\\n function attest(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes multiple attestations and verifies whether they are valid.\\n *\\n * @param attestations The new attestations.\\n * @param values Explicit ETH amounts which were sent with each attestation.\\n *\\n * @return Whether all the attestations are valid.\\n */\\n function multiAttest(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n\\n /**\\n * @dev Processes an attestation revocation and verifies if it can be revoked.\\n *\\n * @param attestation The existing attestation to be revoked.\\n *\\n * @return Whether the attestation can be revoked.\\n */\\n function revoke(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes revocation of multiple attestation and verifies they can be revoked.\\n *\\n * @param attestations The existing attestations to be revoked.\\n * @param values Explicit ETH amounts which were sent with each revocation.\\n *\\n * @return Whether the attestations can be revoked.\\n */\\n function multiRevoke(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x070836a283c69af79de3a0c5319680d1cebc137c7e984fb3221269a75c29d2c2\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x61016034620001b657601f62004da838819003918201601f19168301926001600160401b0392909183851183861017620001a0578160209284926040978852833981010312620001b657516001600160a01b03811692838203620001b6578051926200006b84620001bb565b6004845260208401630c0b8c8d60e21b81526003602084516200008e81620001bb565b828152016245415360e81b81522094519020948460e052610100958087524660a052835160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f978884528683015260608201524660808201523060a082015260a0815260c081019381851090851117620001a0578385525190206080523060c052610120948552156200019157506101409182525191614bd09384620001d8853960805184614648015260a05184614703015260c05184614619015260e05184614697015251836146bd0152518261467401525181818161026501528181610a9301528181611093015281816129d9015281816130c701526133450152f35b6311a1e69760e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b03821117620001a05760405256fe61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611d91575080632d0335ab14611d2957806344adc90e14611c245780634692626714611bc65780634cb7e9e514611ac45780634d00307014611a7c578063831e05a114611843578063a3112a64146117dc578063b83010d314611783578063d45c44351461172f578063e13458fc14610f37578063e30bb56314610ee3578063e45d03f914610c7f578063e57a6b1b14610b7b578063e71ff36514610af8578063ed24911d14610ab7578063f10b5cc814610a48578063f17325e7146101765763ffa1ad74146100f157600080fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715761016d60405161012f81611fcb565b600481527f302e3234000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611e98565b0390f35b600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610171576004359067ffffffffffffffff821161017157604082600401918336030112610171576101e36101cf612097565b926101de6024369201846120ff565b612153565b6101ec83612132565b526101f682612132565b506101ff6127bd565b5081519161020b6127bd565b91610215846127d7565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa948515610a3c57600095610a17575b508451156109ed57916102a8836128fa565b916102b2846127d7565b936000925b8184106102e35760206102da81896102d1348b8b8f6135e8565b81520151612132565b51604051908152f35b6102f58482999496989395979961213f565b519267ffffffffffffffff60208501511680151590816109d8575b506109ae57604081015115806109a1575b6109775760608401519467ffffffffffffffff6020860151169573ffffffffffffffffffffffffffffffffffffffff86511660408701511515906080880151926040519961036e8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c08901523360e089015261010088015261012087015260005b602087015160c08801516104bd609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b8201907fffffffff000000000000000000000000000000000000000000000000000000008860e01b169082015203607d810184520182612004565b519020806000526001602052604060002054156104e3575060010163ffffffff166103b4565b919690509997919998969492939881815281600052600160205260406000209080518255602081015160018301556105c26002830167ffffffffffffffff6040840151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606087015160401b1692161717815567ffffffffffffffff6080840151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a081015160038301556004820173ffffffffffffffffffffffffffffffffffffffff60c0830151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff831161094857838c938c938f9660066106a991015461260a565b601f81116108d4575b50602090601f83116001146107f75760069291600091836107ec575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180610797575b5085602073ffffffffffffffffffffffffffffffffffffffff9560019995610744848761075c9761073e838e9b61213f565b5261213f565b506107548460a08901519261213f565b52015161213f565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a40192906102b7565b915092506107b391506000526001602052604060002054151590565b156107c25788888b928e61070c565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b0151905038806106ce565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106108a95750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610610872575b505050811b01910155610701565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610864565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693610808565b9295509295509250600684016000526020600020601f840160051c810160208510610941575b928f9693928f9693928f96935b601f830160051c8201811061091d5750506106b2565b60019396995080929598506000919497505501928f9693928f9693928f9693610907565b50806108fa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408401511515610321565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905067ffffffffffffffff421610158a610310565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b610a359195503d806000833e610a2d8183612004565b810190612833565b9385610296565b6040513d6000823e3d90fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610af0614602565b604051908152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610b48903690600401611e09565b909142169160005b828110610b6257602084604051908152f35b80610b758560019360051b85013561455c565b01610b50565b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157604051610bb181611f77565b600435808252610bc036612507565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c36011261017157604051610bfb81611faf565b60643560ff81168103610171578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff8116810361017157610c5183826060610c7d960152614afd565b610c596124b8565b610c6236612507565b610c6b82612132565b52610c7581612132565b50349261307a565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610ccc83913690600401611e09565b909234926000915b838310610cdd57005b610ce8838588612424565b946080863603126101715760405195610d0087611f77565b803587528381013583811161017157810194601f9536878201121561017157610d2f903690878135910161254d565b9285890193845260408301358581116101715783019636908801121561017157863594610d5b8661207f565b97610d69604051998a612004565b868952878901886060809902830101913683116101715789808a9201925b848410610ecb5750509050610da5915060408c01958a875201611de8565b94868b01958652519788518015918215610ebf575b5050610e955760005b8851811015610e2b57600190610e258c51610dde838d61213f565b51610dea848a5161213f565b5173ffffffffffffffffffffffffffffffffffffffff8b51169160405193610e1185611f77565b84528d84015260408301528a820152614afd565b01610dc3565b50986001955081935090610e85929a97610e8b9592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916132f7565b906123e8565b9501919493610cd4565b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b51141590508c80610dba565b610ed5368561221e565b815201910190898991610d87565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610f2d6004356000526001602052604060002054151590565b6040519015158152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101715760043567ffffffffffffffff81116101715760c0816004019282360301126101715760405190610f9182611f77565b82358252602481019182359167ffffffffffffffff83116101715760a4610ff191610fc56110219560043691840101612153565b6020850152610fd7366044830161221e565b60408501520191610fe783611de8565b6060820152614729565b611008610ffc612097565b936101de3691876120ff565b61101184612132565b5261101b83612132565b5061225c565b9061102a6127bd565b508051906110366127bd565b608052611042826127d7565b602060805101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610a3c57600060c052611712575b5060c05151156109ed5790916110da836128fa565b60a0526110e6836127d7565b60e0526000915b83831061111a576111063460e05160a05160c0516135e8565b6080515260206102da816080510151612132565b611124838261213f565b519067ffffffffffffffff60208301511680151590816116fd575b506109ae57604060c051015115806116f0575b6109775760608201519467ffffffffffffffff6020840151169573ffffffffffffffffffffffffffffffffffffffff84511660408501511515906080860151926040519961119f8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c08801516112c9609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b519020806000526001602052604060002054156112ef575060010163ffffffff166111fb565b91959294969050818152816000526001602052604060002081518155602082015160018201556113c66002820167ffffffffffffffff6040850151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606088015160401b1692161717815567ffffffffffffffff6080850151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a082015160038201556004810173ffffffffffffffffffffffffffffffffffffffff60c0840151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff8211610948576114a6600684015461260a565b601f81116116a9575b50602090601f83116001146115df5760069291600091836115d4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b6060840151806115b2575b5060019373ffffffffffffffffffffffffffffffffffffffff9161152f8560a05161213f565b5261153c8460a05161213f565b5060a081015161154e8560e05161213f565b5282611560856020608051015161213f565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a4019192906110ed565b6115c9906000526001602052604060002054151590565b156107c25788611509565b015190508c806114cb565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106116915750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0600697161061165a575b505050811b019101556114fe565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c808061164c565b919260206001819286850151815501940192016115f0565b600684016000526020600020601f840160051c8101602085106116e9575b601f830160051c820181106116dd5750506114af565b600081556001016116c7565b50806116c7565b5060408201511515611152565b905067ffffffffffffffff421610158761113f565b611726903d806000833e610a2d8183612004565b60c052846110c5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576004356000526002602052602067ffffffffffffffff60406000205416604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576118136125bf565b50600435600052600160205261016d61182f604060002061265d565b604051918291602083526020830190611edb565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff81116101715761188d903690600401611e09565b6118968161227d565b916000918291345b8284106118be5761016d6118b286886144ef565b60405191829182611e3a565b909192936118cd858585612424565b6118da6020820182612324565b909181158015611a64575b610e9557908491888860005b84811061197c5750936119559361194c9361194560019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209901149461193d6060840161225c565b933691612378565b9035612967565b948551906123e8565b93018051611963888a61213f565b5261196e878961213f565b50515101940192919061189e565b9293945050506119918160051b8501856120ff565b9061199f6040840184612464565b829391931015611a35576119b56060850161225c565b926040519081608081011067ffffffffffffffff60808401111761094857600194611a1973ffffffffffffffffffffffffffffffffffffffff92611a08611a2996608087016040528a3587523690612153565b60208601523690606088020161221e565b6040840152166060820152614729565b019088888794936118f1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b50611a726040820182612464565b90508214156118e5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602067ffffffffffffffff4216610af08160043561455c565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff9060043582811161017157611b11903690600401611e09565b929091600090345b858310611b2257005b611b2d8387876122e4565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561017157810191823592868411610171578401928060061b360384136101715760019382610e8592611bbe95611bb77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161254d565b90356132f7565b920191611b19565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157610c7d611bfb6124b8565b611c0436612507565b611c0d82612132565b52611c1781612132565b503490339060043561307a565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff811161017157611c6f903690600401611e09565b611c7b8193929361227d565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b808610611cbc5761016d6118b2888a6144ef565b90919293949560019085611d00611cf78a8888611cda838a8f6122e4565b611945611ce988830183612324565b939095149433933691612378565b968751906123e8565b95018051611d0e8a8c61213f565b52611d19898b61213f565b5051510196019493929190611ca8565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043573ffffffffffffffffffffffffffffffffffffffff81168091036101715760005260006020526020604060002054604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157807f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c260209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361017157565b9181601f840112156101715782359167ffffffffffffffff8311610171576020808501948460051b01011161017157565b6020908160408183019282815285518094520193019160005b828110611e61575050505090565b835185529381019392810192600101611e53565b60005b838110611e885750506000910152565b8181015183820152602001611e78565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611ed481518092818752878088019101611e75565b0116010190565b90611f7491805182526020810151602083015267ffffffffffffffff806040830151166040840152806060830151166060840152608082015116608083015260a081015160a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611e98565b90565b6080810190811067ffffffffffffffff82111761094857604052565b60c0810190811067ffffffffffffffff82111761094857604052565b6060810190811067ffffffffffffffff82111761094857604052565b6040810190811067ffffffffffffffff82111761094857604052565b610140810190811067ffffffffffffffff82111761094857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094857604052565b67ffffffffffffffff811161094857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116109485760051b60200190565b6040908151916120a683611fcb565b60018352829160005b6020808210156120f7578351602092916120c882611f93565b6000825260008183015260008683015260606000818401526080830152600060a08301528288010152016120af565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610171570190565b805115611a355760200190565b8051821015611a355760209160051b010190565b919060c083820312610171576040519067ffffffffffffffff9060c083018281118482101761094857604052829461218a81611de8565b84526020928382013581811681036101715784860152604082013580151581036101715760408601526060820135606086015260808201359081116101715781019180601f84011215610171578235926121e384612045565b916121f16040519384612004565b84835285858301011161017157848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101715760405161223681611faf565b8092803560ff811681036101715760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101715790565b906122878261207f565b6122946040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06122c2829461207f565b019060005b8281106122d357505050565b8060606020809385010152016122c7565b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff821161017157602001918160051b3603831361017157565b929190926123858461207f565b916123936040519384612004565b829480845260208094019060051b8301928284116101715780915b8483106123bd57505050505050565b823567ffffffffffffffff81116101715786916123dd8684938601612153565b8152019201916123ae565b919082039182116123f557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff82116101715760200191606082023603831361017157565b6040908151916124c783611fcb565b600183528291600091825b6020808210156124fe578251602092916124eb82611fcb565b86825286818301528289010152016124d2565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610171576040519061253e82611fcb565b60243582526044356020830152565b9291926125598261207f565b60409261256884519283612004565b819581835260208093019160061b84019381851161017157915b84831061259157505050505050565b85838303126101715783869182516125a881611fcb565b853581528286013583820152815201920191612582565b604051906125cc82611fe7565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612653575b602083101461262457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612619565b906040519161266b83611fe7565b828154815260016006818401549360209485850152600281015467ffffffffffffffff908181166040870152818160401c16606087015260801c166080850152600381015460a085015260ff73ffffffffffffffffffffffffffffffffffffffff8060048401541660c0870152600583015490811660e087015260a01c16151561010085015201906040519384926000928154916127088361260a565b8087529282811690811561277d5750600114612737575b505050506101209291612733910384612004565b0152565b60009081528381209695945091905b818310612765575093945091925090820101816127336101203861271f565b86548884018501529586019587945091830191612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b8301019050816127336101203861271f565b604051906127ca82611fcb565b6060602083600081520152565b906127e18261207f565b6127ee6040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061281c829461207f565b0190602036910137565b5190811515820361017157565b906020808383031261017157825167ffffffffffffffff93848211610171570192608084840312610171576040519361286b85611f77565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361017157838601526128a060408201612826565b60408601526060810151918211610171570182601f82011215610171578051906128c982612045565b936128d76040519586612004565b82855283838301011161017157826128f29385019101611e75565b606082015290565b906129048261207f565b6129116040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061293f829461207f565b019060005b82811061295057505050565b60209061295b6125bf565b82828501015201612944565b92909493916129746127bd565b508551936129806127bd565b9461298a816127d7565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa918215610a3c5760009261305d575b508151156109ed5792979091612a1f846128fa565b98612a29856127d7565b946000935b818510612a4b57505050505095612a4694959661384f565b815290565b91959398949699909297612a5f8a8461213f565b519a67ffffffffffffffff60208d0151168015159081613048575b506109ae576040890151158061303b575b61097757899860608d01518d602081015167ffffffffffffffff1691815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f90612adc82611fe7565b6000825260208201524267ffffffffffffffff166040820152606001528d608081016000905260a0015260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612c07609d60c08301519260e08101519060408101519060608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b51902080600052600160205260406000205415612c2d575060010163ffffffff16612b36565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155612d0f6002840167ffffffffffffffff6040880151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000060608b015160401b1692161717815567ffffffffffffffff6080880151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a085015160038401556004830173ffffffffffffffffffffffffffffffffffffffff60c0870151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff8111610948578894612df1600684015461260a565b601f8111612fe0575b50602090601f8311600114612f13576006929160009183612f08575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612edb575b5086602073ffffffffffffffffffffffffffffffffffffffff95948794610744848660019e61073e83612e899a61213f565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612a2e565b92505050612ef89193506000526001602052604060002054151590565b156107c25785918d8b8b38612e57565b015190503880612e16565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612fc55750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610612f8e575b505050811b01910155612e49565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612f80565b8183015184558c985060019093019260209283019201612f24565b90919293949550600684016000526020600020601f840160051c810160208510613034575b908b979695949392915b601f830160051c82018110613025575050612dfa565b600081558c985060010161300f565b5080613005565b5060408c01511515612a8b565b905067ffffffffffffffff4216101538612a7a565b6130739192503d806000833e610a2d8183612004565b9038612a0a565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c576000916132dc575b508051156109ed57825161310b816128fa565b92613115826127d7565b9460005b83811061312f5750505050611f74949550613a30565b613139818361213f565b5190815160005260016020526040600020918254156107c257846001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001928c9161320d8261265d565b613217858c61213f565b52613222848b61213f565b506020810151613232858d61213f565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87816004870154169451950154956040519586521693a401613119565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6132f191503d806000833e610a2d8183612004565b386130f8565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c57600091613519575b508051156109ed578651613389816128fa565b92613393826127d7565b9460005b8381106133ad5750505050611f74959650613c2f565b6133b7818c61213f565b5190815160005260016020526040600020918254156107c257836001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001926134898161265d565b613493848b61213f565b5261349e838a61213f565b5060208201516134ae848c61213f565b528373ffffffffffffffffffffffffffffffffffffffff6004830154169251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613397565b61352e91503d806000833e610a2d8183612004565b38613376565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061359d57505050508281830391015281808451928381520193019160005b828110613589575050505090565b83518552938101939281019260010161357b565b909192959485806135d8837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611edb565b979801949391909101910161355a565b90929183519360019081861461382e5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137fe579560009687915b8083106136f0575050509183929161366b9492876040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916136b9575b5090501561368f57611f74906143c0565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116136e9575b6136cd8183612004565b810103126136e657506136df90612826565b803861367e565b80fd5b503d6136c3565b909197966136fe898761213f565b5180151580613778575b61374e5781811161372457808492039801980190919091613622565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916137bf575b5015613708565b908982813d83116137ed575b6137d58183612004565b810103126136e657506137e790612826565b386137b8565b503d6137cb565b513d6000823e3d90fd5b9594505050905060005b8281106138185750505050600090565b613822818361213f565b5161374e578301613808565b611f749550613848915061384190612132565b5191612132565b5191613e07565b909391845194600190818714613a135773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139e2579660009788915b80831061393257505050918392916138d29492886040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916138fe575b5090501561368f576138f5575090565b611f74906143c0565b82813d831161392b575b6139128183612004565b810103126136e6575061392490612826565b80386138e5565b503d613908565b909198976139408a8761213f565b5180151580613966575b61374e5781811161372457808492039901990190919091613889565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916139ad575b501561394a565b908982813d83116139db575b6139c38183612004565b810103126136e657506139d590612826565b386139a6565b503d6139b9565b969550505091505060005b8281106139fd5750505050600090565b613a07818361213f565b5161374e5783016139ed565b611f749650613a29915061384190959495612132565b5191613f8e565b909291835193600190818614613c155773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613be5579560009687915b808310613b355750505091839291613ab39492876040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613b01575b50905015613ad757611f74906143c0565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613b2e575b613b158183612004565b810103126136e65750613b2790612826565b8038613ac6565b503d613b0b565b90919796613b43898761213f565b5180151580613b69575b61374e5781811161372457808492039801980190919091613a6a565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613bb0575b5015613b4d565b908982813d8311613bde575b613bc68183612004565b810103126136e65750613bd890612826565b38613ba9565b503d613bbc565b9594505050905060005b828110613bff5750505050600090565b613c09818361213f565b5161374e578301613bef565b611f749550613c28915061384190612132565b51916140f6565b909391845194600190818714613dea5773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613db9579660009788915b808310613d095750505091839291613cb29492886040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613cd5575b50905015613ad7576138f5575090565b82813d8311613d02575b613ce98183612004565b810103126136e65750613cfb90612826565b8038613cc5565b503d613cdf565b90919897613d178a8761213f565b5180151580613d3d575b61374e5781811161372457808492039901990190919091613c69565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613d84575b5015613d21565b908982813d8311613db2575b613d9a8183612004565b810103126136e65750613dac90612826565b38613d7d565b503d613d90565b969550505091505060005b828110613dd45750505050600090565b613dde818361213f565b5161374e578301613dc4565b611f749650613e00915061384190959495612132565b5191614270565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f815784151580613f07575b61374e5783851161372457613e83829186946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091613ed3575b50905015613ea95781611f7491036143c0565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613f00575b613ee78183612004565b810103126136e65750613ef990612826565b8038613e96565b503d613edd565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c57600091613f4c575b5015613e35565b908382813d8311613f7a575b613f628183612004565b810103126136e65750613f7490612826565b38613f45565b503d613f58565b5050505061374e57600090565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e8578515158061406e575b61374e578486116137245761400a829187946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c5760009161403a575b50905015613ea957829061403057505090565b611f7491036143c0565b82813d8311614067575b61404e8183612004565b810103126136e6575061406090612826565b803861401d565b503d614044565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c576000916140b3575b5015613fbc565b908382813d83116140e1575b6140c98183612004565b810103126136e657506140db90612826565b386140ac565b503d6140bf565b505050505061374e57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f8157841515806141f6575b61374e5783851161372457614172829186946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c576000916141c2575b509050156141985781611f7491036143c0565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d83116141ef575b6141d68183612004565b810103126136e657506141e890612826565b8038614185565b503d6141cc565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161423b575b5015614124565b908382813d8311614269575b6142518183612004565b810103126136e6575061426390612826565b38614234565b503d614247565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e85785151580614346575b61374e57848611613724576142ec829187946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091614312575b5090501561419857829061403057505090565b82813d831161433f575b6143268183612004565b810103126136e6575061433890612826565b80386142ff565b503d61431c565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161438b575b501561429e565b908382813d83116143b9575b6143a18183612004565b810103126136e657506143b390612826565b38614384565b503d614397565b806143c85750565b80471061449157600080808093335af13d1561448c573d6143e881612045565b906143f66040519283612004565b8152600060203d92013e5b1561440857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b614401565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906144f9906127d7565b60009283925b80518410156145545793614513848661213f565b519160005b83518110156145435761452b818561213f565b51614536848761213f565b5260019283019201614518565b5090946001909401939091506144ff565b509250905090565b6000818152600260205267ffffffffffffffff90816040822054166145d8577f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f91838252600260205260408220941693847fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905580a3565b60046040517f2e267946000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614700575b1561466a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a081526146fa81611f93565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614614641565b6020908181015190604080938183015192606081019173ffffffffffffffffffffffffffffffffffffffff948584511660005260008252846000209283549360018501905551928688511667ffffffffffffffff988985820151168882015115159060806060840151930151878151910120938a5198888a019b7f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c28d528a01526060890152608088015260a087015260c086015260e0850152610100908185015283526101208301968388109088111761094857614814869561482894614830998b52519020614a9a565b918860ff83511691830151920151926149fe565b949094614865565b511691160361483c5750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156149cf57806148765750565b600181036148dc5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b600281036149425760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461494b57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311614a8e5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15614a8157815173ffffffffffffffffffffffffffffffffffffffff811615614a7b579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b614aa2614602565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176109485760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff87111761094857614bae859461482893614830988a52519020614a9a565b9060ff815116886020830151920151926149fe56fea164736f6c6343000811000a", + "deployedBytecode": "0x61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611d91575080632d0335ab14611d2957806344adc90e14611c245780634692626714611bc65780634cb7e9e514611ac45780634d00307014611a7c578063831e05a114611843578063a3112a64146117dc578063b83010d314611783578063d45c44351461172f578063e13458fc14610f37578063e30bb56314610ee3578063e45d03f914610c7f578063e57a6b1b14610b7b578063e71ff36514610af8578063ed24911d14610ab7578063f10b5cc814610a48578063f17325e7146101765763ffa1ad74146100f157600080fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715761016d60405161012f81611fcb565b600481527f302e3234000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611e98565b0390f35b600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610171576004359067ffffffffffffffff821161017157604082600401918336030112610171576101e36101cf612097565b926101de6024369201846120ff565b612153565b6101ec83612132565b526101f682612132565b506101ff6127bd565b5081519161020b6127bd565b91610215846127d7565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa948515610a3c57600095610a17575b508451156109ed57916102a8836128fa565b916102b2846127d7565b936000925b8184106102e35760206102da81896102d1348b8b8f6135e8565b81520151612132565b51604051908152f35b6102f58482999496989395979961213f565b519267ffffffffffffffff60208501511680151590816109d8575b506109ae57604081015115806109a1575b6109775760608401519467ffffffffffffffff6020860151169573ffffffffffffffffffffffffffffffffffffffff86511660408701511515906080880151926040519961036e8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c08901523360e089015261010088015261012087015260005b602087015160c08801516104bd609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b8201907fffffffff000000000000000000000000000000000000000000000000000000008860e01b169082015203607d810184520182612004565b519020806000526001602052604060002054156104e3575060010163ffffffff166103b4565b919690509997919998969492939881815281600052600160205260406000209080518255602081015160018301556105c26002830167ffffffffffffffff6040840151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606087015160401b1692161717815567ffffffffffffffff6080840151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a081015160038301556004820173ffffffffffffffffffffffffffffffffffffffff60c0830151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff831161094857838c938c938f9660066106a991015461260a565b601f81116108d4575b50602090601f83116001146107f75760069291600091836107ec575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180610797575b5085602073ffffffffffffffffffffffffffffffffffffffff9560019995610744848761075c9761073e838e9b61213f565b5261213f565b506107548460a08901519261213f565b52015161213f565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a40192906102b7565b915092506107b391506000526001602052604060002054151590565b156107c25788888b928e61070c565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b0151905038806106ce565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106108a95750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610610872575b505050811b01910155610701565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610864565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693610808565b9295509295509250600684016000526020600020601f840160051c810160208510610941575b928f9693928f9693928f96935b601f830160051c8201811061091d5750506106b2565b60019396995080929598506000919497505501928f9693928f9693928f9693610907565b50806108fa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408401511515610321565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905067ffffffffffffffff421610158a610310565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b610a359195503d806000833e610a2d8183612004565b810190612833565b9385610296565b6040513d6000823e3d90fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610af0614602565b604051908152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610b48903690600401611e09565b909142169160005b828110610b6257602084604051908152f35b80610b758560019360051b85013561455c565b01610b50565b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157604051610bb181611f77565b600435808252610bc036612507565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c36011261017157604051610bfb81611faf565b60643560ff81168103610171578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff8116810361017157610c5183826060610c7d960152614afd565b610c596124b8565b610c6236612507565b610c6b82612132565b52610c7581612132565b50349261307a565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610ccc83913690600401611e09565b909234926000915b838310610cdd57005b610ce8838588612424565b946080863603126101715760405195610d0087611f77565b803587528381013583811161017157810194601f9536878201121561017157610d2f903690878135910161254d565b9285890193845260408301358581116101715783019636908801121561017157863594610d5b8661207f565b97610d69604051998a612004565b868952878901886060809902830101913683116101715789808a9201925b848410610ecb5750509050610da5915060408c01958a875201611de8565b94868b01958652519788518015918215610ebf575b5050610e955760005b8851811015610e2b57600190610e258c51610dde838d61213f565b51610dea848a5161213f565b5173ffffffffffffffffffffffffffffffffffffffff8b51169160405193610e1185611f77565b84528d84015260408301528a820152614afd565b01610dc3565b50986001955081935090610e85929a97610e8b9592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916132f7565b906123e8565b9501919493610cd4565b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b51141590508c80610dba565b610ed5368561221e565b815201910190898991610d87565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610f2d6004356000526001602052604060002054151590565b6040519015158152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101715760043567ffffffffffffffff81116101715760c0816004019282360301126101715760405190610f9182611f77565b82358252602481019182359167ffffffffffffffff83116101715760a4610ff191610fc56110219560043691840101612153565b6020850152610fd7366044830161221e565b60408501520191610fe783611de8565b6060820152614729565b611008610ffc612097565b936101de3691876120ff565b61101184612132565b5261101b83612132565b5061225c565b9061102a6127bd565b508051906110366127bd565b608052611042826127d7565b602060805101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610a3c57600060c052611712575b5060c05151156109ed5790916110da836128fa565b60a0526110e6836127d7565b60e0526000915b83831061111a576111063460e05160a05160c0516135e8565b6080515260206102da816080510151612132565b611124838261213f565b519067ffffffffffffffff60208301511680151590816116fd575b506109ae57604060c051015115806116f0575b6109775760608201519467ffffffffffffffff6020840151169573ffffffffffffffffffffffffffffffffffffffff84511660408501511515906080860151926040519961119f8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c08801516112c9609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b519020806000526001602052604060002054156112ef575060010163ffffffff166111fb565b91959294969050818152816000526001602052604060002081518155602082015160018201556113c66002820167ffffffffffffffff6040850151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606088015160401b1692161717815567ffffffffffffffff6080850151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a082015160038201556004810173ffffffffffffffffffffffffffffffffffffffff60c0840151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff8211610948576114a6600684015461260a565b601f81116116a9575b50602090601f83116001146115df5760069291600091836115d4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b6060840151806115b2575b5060019373ffffffffffffffffffffffffffffffffffffffff9161152f8560a05161213f565b5261153c8460a05161213f565b5060a081015161154e8560e05161213f565b5282611560856020608051015161213f565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a4019192906110ed565b6115c9906000526001602052604060002054151590565b156107c25788611509565b015190508c806114cb565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106116915750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0600697161061165a575b505050811b019101556114fe565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c808061164c565b919260206001819286850151815501940192016115f0565b600684016000526020600020601f840160051c8101602085106116e9575b601f830160051c820181106116dd5750506114af565b600081556001016116c7565b50806116c7565b5060408201511515611152565b905067ffffffffffffffff421610158761113f565b611726903d806000833e610a2d8183612004565b60c052846110c5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576004356000526002602052602067ffffffffffffffff60406000205416604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576118136125bf565b50600435600052600160205261016d61182f604060002061265d565b604051918291602083526020830190611edb565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff81116101715761188d903690600401611e09565b6118968161227d565b916000918291345b8284106118be5761016d6118b286886144ef565b60405191829182611e3a565b909192936118cd858585612424565b6118da6020820182612324565b909181158015611a64575b610e9557908491888860005b84811061197c5750936119559361194c9361194560019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209901149461193d6060840161225c565b933691612378565b9035612967565b948551906123e8565b93018051611963888a61213f565b5261196e878961213f565b50515101940192919061189e565b9293945050506119918160051b8501856120ff565b9061199f6040840184612464565b829391931015611a35576119b56060850161225c565b926040519081608081011067ffffffffffffffff60808401111761094857600194611a1973ffffffffffffffffffffffffffffffffffffffff92611a08611a2996608087016040528a3587523690612153565b60208601523690606088020161221e565b6040840152166060820152614729565b019088888794936118f1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b50611a726040820182612464565b90508214156118e5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602067ffffffffffffffff4216610af08160043561455c565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff9060043582811161017157611b11903690600401611e09565b929091600090345b858310611b2257005b611b2d8387876122e4565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561017157810191823592868411610171578401928060061b360384136101715760019382610e8592611bbe95611bb77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161254d565b90356132f7565b920191611b19565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157610c7d611bfb6124b8565b611c0436612507565b611c0d82612132565b52611c1781612132565b503490339060043561307a565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff811161017157611c6f903690600401611e09565b611c7b8193929361227d565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b808610611cbc5761016d6118b2888a6144ef565b90919293949560019085611d00611cf78a8888611cda838a8f6122e4565b611945611ce988830183612324565b939095149433933691612378565b968751906123e8565b95018051611d0e8a8c61213f565b52611d19898b61213f565b5051510196019493929190611ca8565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043573ffffffffffffffffffffffffffffffffffffffff81168091036101715760005260006020526020604060002054604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157807f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c260209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361017157565b9181601f840112156101715782359167ffffffffffffffff8311610171576020808501948460051b01011161017157565b6020908160408183019282815285518094520193019160005b828110611e61575050505090565b835185529381019392810192600101611e53565b60005b838110611e885750506000910152565b8181015183820152602001611e78565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611ed481518092818752878088019101611e75565b0116010190565b90611f7491805182526020810151602083015267ffffffffffffffff806040830151166040840152806060830151166060840152608082015116608083015260a081015160a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611e98565b90565b6080810190811067ffffffffffffffff82111761094857604052565b60c0810190811067ffffffffffffffff82111761094857604052565b6060810190811067ffffffffffffffff82111761094857604052565b6040810190811067ffffffffffffffff82111761094857604052565b610140810190811067ffffffffffffffff82111761094857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094857604052565b67ffffffffffffffff811161094857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116109485760051b60200190565b6040908151916120a683611fcb565b60018352829160005b6020808210156120f7578351602092916120c882611f93565b6000825260008183015260008683015260606000818401526080830152600060a08301528288010152016120af565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610171570190565b805115611a355760200190565b8051821015611a355760209160051b010190565b919060c083820312610171576040519067ffffffffffffffff9060c083018281118482101761094857604052829461218a81611de8565b84526020928382013581811681036101715784860152604082013580151581036101715760408601526060820135606086015260808201359081116101715781019180601f84011215610171578235926121e384612045565b916121f16040519384612004565b84835285858301011161017157848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101715760405161223681611faf565b8092803560ff811681036101715760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101715790565b906122878261207f565b6122946040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06122c2829461207f565b019060005b8281106122d357505050565b8060606020809385010152016122c7565b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff821161017157602001918160051b3603831361017157565b929190926123858461207f565b916123936040519384612004565b829480845260208094019060051b8301928284116101715780915b8483106123bd57505050505050565b823567ffffffffffffffff81116101715786916123dd8684938601612153565b8152019201916123ae565b919082039182116123f557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff82116101715760200191606082023603831361017157565b6040908151916124c783611fcb565b600183528291600091825b6020808210156124fe578251602092916124eb82611fcb565b86825286818301528289010152016124d2565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610171576040519061253e82611fcb565b60243582526044356020830152565b9291926125598261207f565b60409261256884519283612004565b819581835260208093019160061b84019381851161017157915b84831061259157505050505050565b85838303126101715783869182516125a881611fcb565b853581528286013583820152815201920191612582565b604051906125cc82611fe7565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612653575b602083101461262457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612619565b906040519161266b83611fe7565b828154815260016006818401549360209485850152600281015467ffffffffffffffff908181166040870152818160401c16606087015260801c166080850152600381015460a085015260ff73ffffffffffffffffffffffffffffffffffffffff8060048401541660c0870152600583015490811660e087015260a01c16151561010085015201906040519384926000928154916127088361260a565b8087529282811690811561277d5750600114612737575b505050506101209291612733910384612004565b0152565b60009081528381209695945091905b818310612765575093945091925090820101816127336101203861271f565b86548884018501529586019587945091830191612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b8301019050816127336101203861271f565b604051906127ca82611fcb565b6060602083600081520152565b906127e18261207f565b6127ee6040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061281c829461207f565b0190602036910137565b5190811515820361017157565b906020808383031261017157825167ffffffffffffffff93848211610171570192608084840312610171576040519361286b85611f77565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361017157838601526128a060408201612826565b60408601526060810151918211610171570182601f82011215610171578051906128c982612045565b936128d76040519586612004565b82855283838301011161017157826128f29385019101611e75565b606082015290565b906129048261207f565b6129116040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061293f829461207f565b019060005b82811061295057505050565b60209061295b6125bf565b82828501015201612944565b92909493916129746127bd565b508551936129806127bd565b9461298a816127d7565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa918215610a3c5760009261305d575b508151156109ed5792979091612a1f846128fa565b98612a29856127d7565b946000935b818510612a4b57505050505095612a4694959661384f565b815290565b91959398949699909297612a5f8a8461213f565b519a67ffffffffffffffff60208d0151168015159081613048575b506109ae576040890151158061303b575b61097757899860608d01518d602081015167ffffffffffffffff1691815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f90612adc82611fe7565b6000825260208201524267ffffffffffffffff166040820152606001528d608081016000905260a0015260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612c07609d60c08301519260e08101519060408101519060608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b51902080600052600160205260406000205415612c2d575060010163ffffffff16612b36565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155612d0f6002840167ffffffffffffffff6040880151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000060608b015160401b1692161717815567ffffffffffffffff6080880151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a085015160038401556004830173ffffffffffffffffffffffffffffffffffffffff60c0870151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff8111610948578894612df1600684015461260a565b601f8111612fe0575b50602090601f8311600114612f13576006929160009183612f08575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612edb575b5086602073ffffffffffffffffffffffffffffffffffffffff95948794610744848660019e61073e83612e899a61213f565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612a2e565b92505050612ef89193506000526001602052604060002054151590565b156107c25785918d8b8b38612e57565b015190503880612e16565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612fc55750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610612f8e575b505050811b01910155612e49565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612f80565b8183015184558c985060019093019260209283019201612f24565b90919293949550600684016000526020600020601f840160051c810160208510613034575b908b979695949392915b601f830160051c82018110613025575050612dfa565b600081558c985060010161300f565b5080613005565b5060408c01511515612a8b565b905067ffffffffffffffff4216101538612a7a565b6130739192503d806000833e610a2d8183612004565b9038612a0a565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c576000916132dc575b508051156109ed57825161310b816128fa565b92613115826127d7565b9460005b83811061312f5750505050611f74949550613a30565b613139818361213f565b5190815160005260016020526040600020918254156107c257846001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001928c9161320d8261265d565b613217858c61213f565b52613222848b61213f565b506020810151613232858d61213f565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87816004870154169451950154956040519586521693a401613119565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6132f191503d806000833e610a2d8183612004565b386130f8565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c57600091613519575b508051156109ed578651613389816128fa565b92613393826127d7565b9460005b8381106133ad5750505050611f74959650613c2f565b6133b7818c61213f565b5190815160005260016020526040600020918254156107c257836001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001926134898161265d565b613493848b61213f565b5261349e838a61213f565b5060208201516134ae848c61213f565b528373ffffffffffffffffffffffffffffffffffffffff6004830154169251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613397565b61352e91503d806000833e610a2d8183612004565b38613376565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061359d57505050508281830391015281808451928381520193019160005b828110613589575050505090565b83518552938101939281019260010161357b565b909192959485806135d8837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611edb565b979801949391909101910161355a565b90929183519360019081861461382e5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137fe579560009687915b8083106136f0575050509183929161366b9492876040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916136b9575b5090501561368f57611f74906143c0565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116136e9575b6136cd8183612004565b810103126136e657506136df90612826565b803861367e565b80fd5b503d6136c3565b909197966136fe898761213f565b5180151580613778575b61374e5781811161372457808492039801980190919091613622565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916137bf575b5015613708565b908982813d83116137ed575b6137d58183612004565b810103126136e657506137e790612826565b386137b8565b503d6137cb565b513d6000823e3d90fd5b9594505050905060005b8281106138185750505050600090565b613822818361213f565b5161374e578301613808565b611f749550613848915061384190612132565b5191612132565b5191613e07565b909391845194600190818714613a135773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139e2579660009788915b80831061393257505050918392916138d29492886040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916138fe575b5090501561368f576138f5575090565b611f74906143c0565b82813d831161392b575b6139128183612004565b810103126136e6575061392490612826565b80386138e5565b503d613908565b909198976139408a8761213f565b5180151580613966575b61374e5781811161372457808492039901990190919091613889565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916139ad575b501561394a565b908982813d83116139db575b6139c38183612004565b810103126136e657506139d590612826565b386139a6565b503d6139b9565b969550505091505060005b8281106139fd5750505050600090565b613a07818361213f565b5161374e5783016139ed565b611f749650613a29915061384190959495612132565b5191613f8e565b909291835193600190818614613c155773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613be5579560009687915b808310613b355750505091839291613ab39492876040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613b01575b50905015613ad757611f74906143c0565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613b2e575b613b158183612004565b810103126136e65750613b2790612826565b8038613ac6565b503d613b0b565b90919796613b43898761213f565b5180151580613b69575b61374e5781811161372457808492039801980190919091613a6a565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613bb0575b5015613b4d565b908982813d8311613bde575b613bc68183612004565b810103126136e65750613bd890612826565b38613ba9565b503d613bbc565b9594505050905060005b828110613bff5750505050600090565b613c09818361213f565b5161374e578301613bef565b611f749550613c28915061384190612132565b51916140f6565b909391845194600190818714613dea5773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613db9579660009788915b808310613d095750505091839291613cb29492886040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613cd5575b50905015613ad7576138f5575090565b82813d8311613d02575b613ce98183612004565b810103126136e65750613cfb90612826565b8038613cc5565b503d613cdf565b90919897613d178a8761213f565b5180151580613d3d575b61374e5781811161372457808492039901990190919091613c69565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613d84575b5015613d21565b908982813d8311613db2575b613d9a8183612004565b810103126136e65750613dac90612826565b38613d7d565b503d613d90565b969550505091505060005b828110613dd45750505050600090565b613dde818361213f565b5161374e578301613dc4565b611f749650613e00915061384190959495612132565b5191614270565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f815784151580613f07575b61374e5783851161372457613e83829186946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091613ed3575b50905015613ea95781611f7491036143c0565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613f00575b613ee78183612004565b810103126136e65750613ef990612826565b8038613e96565b503d613edd565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c57600091613f4c575b5015613e35565b908382813d8311613f7a575b613f628183612004565b810103126136e65750613f7490612826565b38613f45565b503d613f58565b5050505061374e57600090565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e8578515158061406e575b61374e578486116137245761400a829187946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c5760009161403a575b50905015613ea957829061403057505090565b611f7491036143c0565b82813d8311614067575b61404e8183612004565b810103126136e6575061406090612826565b803861401d565b503d614044565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c576000916140b3575b5015613fbc565b908382813d83116140e1575b6140c98183612004565b810103126136e657506140db90612826565b386140ac565b503d6140bf565b505050505061374e57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f8157841515806141f6575b61374e5783851161372457614172829186946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c576000916141c2575b509050156141985781611f7491036143c0565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d83116141ef575b6141d68183612004565b810103126136e657506141e890612826565b8038614185565b503d6141cc565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161423b575b5015614124565b908382813d8311614269575b6142518183612004565b810103126136e6575061426390612826565b38614234565b503d614247565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e85785151580614346575b61374e57848611613724576142ec829187946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091614312575b5090501561419857829061403057505090565b82813d831161433f575b6143268183612004565b810103126136e6575061433890612826565b80386142ff565b503d61431c565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161438b575b501561429e565b908382813d83116143b9575b6143a18183612004565b810103126136e657506143b390612826565b38614384565b503d614397565b806143c85750565b80471061449157600080808093335af13d1561448c573d6143e881612045565b906143f66040519283612004565b8152600060203d92013e5b1561440857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b614401565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906144f9906127d7565b60009283925b80518410156145545793614513848661213f565b519160005b83518110156145435761452b818561213f565b51614536848761213f565b5260019283019201614518565b5090946001909401939091506144ff565b509250905090565b6000818152600260205267ffffffffffffffff90816040822054166145d8577f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f91838252600260205260408220941693847fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905580a3565b60046040517f2e267946000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614700575b1561466a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a081526146fa81611f93565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614614641565b6020908181015190604080938183015192606081019173ffffffffffffffffffffffffffffffffffffffff948584511660005260008252846000209283549360018501905551928688511667ffffffffffffffff988985820151168882015115159060806060840151930151878151910120938a5198888a019b7f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c28d528a01526060890152608088015260a087015260c086015260e0850152610100908185015283526101208301968388109088111761094857614814869561482894614830998b52519020614a9a565b918860ff83511691830151920151926149fe565b949094614865565b511691160361483c5750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156149cf57806148765750565b600181036148dc5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b600281036149425760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461494b57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311614a8e5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15614a8157815173ffffffffffffffffffffffffffffffffffffffff811615614a7b579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b614aa2614602565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176109485760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff87111761094857614bae859461482893614830988a52519020614a9a565b9060ff815116886020830151920151926149fe56fea164736f6c6343000811000a", + "devdoc": { + "kind": "dev", + "methods": { + "attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))": { + "details": "Attests to a specific schema.", + "params": { + "request": "The arguments of the attestation request. Example: attest({ schema: \"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\", data: { recipient: \"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\", expirationTime: 0, revocable: true, refUUID: \"0x0000000000000000000000000000000000000000000000000000000000000000\", data: \"0xF00D\", value: 0 } })" + }, + "returns": { + "_0": "The UUID of the new attestation." + } + }, + "attestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))": { + "details": "Attests to a specific schema via the provided EIP712 signature.", + "params": { + "delegatedRequest": "The arguments of the delegated attestation request. Example: attestByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, signature: { v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e' })" + }, + "returns": { + "_0": "The UUID of the new attestation." + } + }, + "constructor": { + "details": "Creates a new EAS instance.", + "params": { + "registry": "The address of the global schema registry." + } + }, + "getAttestation(bytes32)": { + "details": "Returns an existing attestation by UUID.", + "params": { + "uuid": "The UUID of the attestation to retrieve." + }, + "returns": { + "_0": "The attestation data members." + } + }, + "getDomainSeparator()": { + "details": "Returns the domain separator used in the encoding of the signatures for attest, and revoke." + }, + "getNonce(address)": { + "details": "Returns the current nonce per-account.", + "params": { + "account": "The requested account." + }, + "returns": { + "_0": "The current nonce." + } + }, + "getSchemaRegistry()": { + "details": "Returns the address of the global schema registry.", + "returns": { + "_0": "The address of the global schema registry." + } + }, + "getTimestamp(bytes32)": { + "details": "Returns the timestamp that the specified data was timestamped with.", + "params": { + "data": "The data to query." + }, + "returns": { + "_0": "The timestamp the data was timestamped with." + } + }, + "isAttestationValid(bytes32)": { + "details": "Checks whether an attestation exists.", + "params": { + "uuid": "The UUID of the attestation to retrieve." + }, + "returns": { + "_0": "Whether an attestation exists." + } + }, + "multiAttest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[])[])": { + "details": "Attests to multiple schemas.", + "params": { + "multiRequests": "The arguments of the multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttest([{ schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 1000 }, { recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 0, revocable: false, refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174', data: '0x00', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: true, refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f', data: '0x12345678', value: 0 }, }])" + }, + "returns": { + "_0": "The UUIDs of the new attestations." + } + }, + "multiAttestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])": { + "details": "Attests to multiple schemas using via provided EIP712 signatures.", + "params": { + "multiDelegatedRequests": "The arguments of the delegated multi attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiAttestByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', expirationTime: 1673891048, revocable: true, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x1234', value: 0 }, { recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf', expirationTime: 0, revocable: false, refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000', data: '0x00', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4' }])" + }, + "returns": { + "_0": "The UUIDs of the new attestations." + } + }, + "multiRevoke((bytes32,(bytes32,uint256)[])[])": { + "details": "Revokes existing attestations to multiple schemas.", + "params": { + "multiRequests": "The arguments of the multi revocation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevoke([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], }, { schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425', data: [{ uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019', value: 0 }, }])" + } + }, + "multiRevokeByDelegation((bytes32,(bytes32,uint256)[],(uint8,bytes32,bytes32)[],address)[])": { + "details": "Revokes existing attestations to multiple schemas via provided EIP712 signatures.", + "params": { + "multiDelegatedRequests": "The arguments of the delegated multi revocation attestation requests. The requests should be grouped by distinct schema ids to benefit from the best batching optimization. Example: multiRevokeByDelegation([{ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: [{ uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25', value: 1000 }, { uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade', value: 0 }], signatures: [{ v: 28, r: '0x148c...b25b', s: '0x5a72...be22' }, { v: 28, r: '0x487s...67bb', s: '0x12ad...2366' }], revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' }])" + } + }, + "multiTimestamp(bytes32[])": { + "details": "Timestamps the specified multiple bytes32 data.", + "params": { + "data": "The data to timestamp." + }, + "returns": { + "_0": "The timestamp the data was timestamped with." + } + }, + "revoke((bytes32,(bytes32,uint256)))": { + "details": "Revokes an existing attestation to a specific schema. Example: revoke({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d', value: 0 } })", + "params": { + "request": "The arguments of the revocation request." + } + }, + "revokeByDelegation((bytes32,(bytes32,uint256),(uint8,bytes32,bytes32),address))": { + "details": "Revokes an existing attestation to a specific schema via the provided EIP712 signature. Example: revokeByDelegation({ schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc', data: { uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba', value: 0 }, signature: { v: 27, r: '0xb593...7142', s: '0x0f5b...2cce' }, revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992' })", + "params": { + "delegatedRequest": "The arguments of the delegated revocation request." + } + }, + "timestamp(bytes32)": { + "details": "Timestamps the specified bytes32 data.", + "params": { + "data": "The data to timestamp." + }, + "returns": { + "_0": "The timestamp the data was timestamped with." + } + } + }, + "title": "EAS - Ethereum Attestation Service", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "getAttestTypeHash()": { + "notice": "Returns the EIP712 type hash for the attest function." + }, + "getRevokeTypeHash()": { + "notice": "Returns the EIP712 type hash for the revoke function." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 4686, + "contract": "contracts/EAS.sol:EAS", + "label": "_nonces", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 3004, + "contract": "contracts/EAS.sol:EAS", + "label": "_db", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_struct(Attestation)4908_storage)" + }, + { + "astId": 3008, + "contract": "contracts/EAS.sol:EAS", + "label": "_timestamps", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_bytes32,t_uint64)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(Attestation)4908_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct Attestation)", + "numberOfBytes": "32", + "value": "t_struct(Attestation)4908_storage" + }, + "t_mapping(t_bytes32,t_uint64)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => uint64)", + "numberOfBytes": "32", + "value": "t_uint64" + }, + "t_struct(Attestation)4908_storage": { + "encoding": "inplace", + "label": "struct Attestation", + "members": [ + { + "astId": 4889, + "contract": "contracts/EAS.sol:EAS", + "label": "uuid", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 4891, + "contract": "contracts/EAS.sol:EAS", + "label": "schema", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + }, + { + "astId": 4893, + "contract": "contracts/EAS.sol:EAS", + "label": "time", + "offset": 0, + "slot": "2", + "type": "t_uint64" + }, + { + "astId": 4895, + "contract": "contracts/EAS.sol:EAS", + "label": "expirationTime", + "offset": 8, + "slot": "2", + "type": "t_uint64" + }, + { + "astId": 4897, + "contract": "contracts/EAS.sol:EAS", + "label": "revocationTime", + "offset": 16, + "slot": "2", + "type": "t_uint64" + }, + { + "astId": 4899, + "contract": "contracts/EAS.sol:EAS", + "label": "refUUID", + "offset": 0, + "slot": "3", + "type": "t_bytes32" + }, + { + "astId": 4901, + "contract": "contracts/EAS.sol:EAS", + "label": "recipient", + "offset": 0, + "slot": "4", + "type": "t_address" + }, + { + "astId": 4903, + "contract": "contracts/EAS.sol:EAS", + "label": "attester", + "offset": 0, + "slot": "5", + "type": "t_address" + }, + { + "astId": 4905, + "contract": "contracts/EAS.sol:EAS", + "label": "revocable", + "offset": 20, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 4907, + "contract": "contracts/EAS.sol:EAS", + "label": "data", + "offset": 0, + "slot": "6", + "type": "t_bytes_storage" + } + ], + "numberOfBytes": "224" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + } +} \ No newline at end of file diff --git a/deployments/sepolia/SchemaRegistry.json b/deployments/sepolia/SchemaRegistry.json new file mode 100644 index 0000000..b71143d --- /dev/null +++ b/deployments/sepolia/SchemaRegistry.json @@ -0,0 +1,246 @@ +{ + "address": "0x16399b867877D7f59deE9f04bD79B07fa8D17f7A", + "abi": [ + { + "inputs": [], + "name": "AlreadyExists", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "registerer", + "type": "address" + } + ], + "name": "Registered", + "type": "event" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + } + ], + "name": "getSchema", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "uuid", + "type": "bytes32" + }, + { + "internalType": "contract ISchemaResolver", + "name": "resolver", + "type": "address" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + }, + { + "internalType": "string", + "name": "schema", + "type": "string" + } + ], + "internalType": "struct SchemaRecord", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "schema", + "type": "string" + }, + { + "internalType": "contract ISchemaResolver", + "name": "resolver", + "type": "address" + }, + { + "internalType": "bool", + "name": "revocable", + "type": "bool" + } + ], + "name": "register", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x3c3148b9dc501803c4b20b8b12c0aa6a7c15e175bc40ac03a3a6924f83ea598c", + "receipt": { + "to": null, + "from": "0x01a93612f26100B6E18a2e3dd57df5c3ccaFeca1", + "contractAddress": "0x16399b867877D7f59deE9f04bD79B07fa8D17f7A", + "transactionIndex": 0, + "gasUsed": "477737", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x03c0197c9641574191338fe32f61afa63899f13929868987de1576b3fbf48ebd", + "transactionHash": "0x3c3148b9dc501803c4b20b8b12c0aa6a7c15e175bc40ac03a3a6924f83ea598c", + "logs": [], + "blockNumber": 2778240, + "cumulativeGasUsed": "477737", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "04f9ff8892dd62e5b44635f16b58cd9f", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AlreadyExists\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registerer\",\"type\":\"address\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"}],\"name\":\"getSchema\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"uuid\",\"type\":\"bytes32\"},{\"internalType\":\"contract ISchemaResolver\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"},{\"internalType\":\"string\",\"name\":\"schema\",\"type\":\"string\"}],\"internalType\":\"struct SchemaRecord\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"schema\",\"type\":\"string\"},{\"internalType\":\"contract ISchemaResolver\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"revocable\",\"type\":\"bool\"}],\"name\":\"register\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getSchema(bytes32)\":{\"details\":\"Returns an existing schema by UUID\",\"params\":{\"uuid\":\"The UUID of the schema to retrieve.\"},\"returns\":{\"_0\":\"The schema data members.\"}},\"register(string,address,bool)\":{\"details\":\"Submits and reserves a new schema\",\"params\":{\"resolver\":\"An optional schema resolver.\",\"revocable\":\"Whether the schema allows revocations explicitly.\",\"schema\":\"The schema data schema.\"},\"returns\":{\"_0\":\"The UUID of the new schema.\"}}},\"title\":\"The global schema registry.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/SchemaRegistry.sol\":\"SchemaRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/IEAS.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaRegistry } from \\\"./ISchemaRegistry.sol\\\";\\nimport { EIP712Signature } from \\\"./Types.sol\\\";\\n\\n/**\\n * @dev A struct representing a single attestation.\\n */\\nstruct Attestation {\\n bytes32 uuid; // A unique identifier of the attestation.\\n bytes32 schema; // The unique identifier of the schema.\\n uint64 time; // The time when the attestation was created (Unix timestamp).\\n uint64 expirationTime; // The time when the attestation expires (Unix timestamp).\\n uint64 revocationTime; // The time when the attestation was revoked (Unix timestamp).\\n bytes32 refUUID; // The UUID of the related attestation.\\n address recipient; // The recipient of the attestation.\\n address attester; // The attester/sender of the attestation.\\n bool revocable; // Whether the attestation is revocable.\\n bytes data; // Custom attestation data.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the attestation request.\\n */\\nstruct AttestationRequestData {\\n address recipient; // The recipient of the attestation.\\n uint64 expirationTime; // The time when the attestation expires (Unix timestamp).\\n bool revocable; // Whether the attestation is revocable.\\n bytes32 refUUID; // The UUID of the related attestation.\\n bytes data; // Custom attestation data.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the attestation request.\\n */\\nstruct AttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the full delegated attestation request.\\n */\\nstruct DelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData data; // The arguments of the attestation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi attestation request.\\n */\\nstruct MultiAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi attestation request.\\n */\\nstruct MultiDelegatedAttestationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n AttestationRequestData[] data; // The arguments of the attestation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address attester; // The attesting account.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the revocation request.\\n */\\nstruct RevocationRequestData {\\n bytes32 uuid; // The UUID of the attestation to revoke.\\n uint256 value; // An explicit ETH amount to send to the resolver. This is important to prevent accidental user errors.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the revocation request.\\n */\\nstruct RevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the arguments of the full delegated revocation request.\\n */\\nstruct DelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData data; // The arguments of the revocation request.\\n EIP712Signature signature; // The EIP712 signature data.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the multi revocation request.\\n */\\nstruct MultiRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation request.\\n}\\n\\n/**\\n * @dev A struct representing the full arguments of the delegated multi revocation request.\\n */\\nstruct MultiDelegatedRevocationRequest {\\n bytes32 schema; // The unique identifier of the schema.\\n RevocationRequestData[] data; // The arguments of the revocation requests.\\n EIP712Signature[] signatures; // The EIP712 signatures data. Please note that the signatures are assumed to be signed with increasing nonces.\\n address revoker; // The revoking account.\\n}\\n\\n/**\\n * @title EAS - Ethereum Attestation Service interface.\\n */\\ninterface IEAS {\\n /**\\n * @dev Emitted when an attestation has been made.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param uuid The UUID the revoked attestation.\\n * @param schema The UUID of the schema.\\n */\\n event Attested(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Emitted when an attestation has been revoked.\\n *\\n * @param recipient The recipient of the attestation.\\n * @param attester The attesting account.\\n * @param schema The UUID of the schema.\\n * @param uuid The UUID the revoked attestation.\\n */\\n event Revoked(address indexed recipient, address indexed attester, bytes32 uuid, bytes32 indexed schema);\\n\\n /**\\n * @dev Emitted when a data has been timestamped.\\n *\\n * @param data The data.\\n * @param timestamp The timestamp.\\n */\\n event Timestamped(bytes32 indexed data, uint64 indexed timestamp);\\n\\n /**\\n * @dev Returns the address of the global schema registry.\\n *\\n * @return The address of the global schema registry.\\n */\\n function getSchemaRegistry() external view returns (ISchemaRegistry);\\n\\n /**\\n * @dev Attests to a specific schema.\\n *\\n * @param request The arguments of the attestation request.\\n *\\n * Example:\\n *\\n * attest({\\n * schema: \\\"0facc36681cbe2456019c1b0d1e7bedd6d1d40f6f324bf3dd3a4cef2999200a0\\\",\\n * data: {\\n * recipient: \\\"0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf\\\",\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: \\\"0x0000000000000000000000000000000000000000000000000000000000000000\\\",\\n * data: \\\"0xF00D\\\",\\n * value: 0\\n * }\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attest(AttestationRequest calldata request) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to a specific schema via the provided EIP712 signature.\\n *\\n * @param delegatedRequest The arguments of the delegated attestation request.\\n *\\n * Example:\\n *\\n * attestByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * signature: {\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * attester: '0xc5E8740aD971409492b1A63Db8d83025e0Fc427e'\\n * })\\n *\\n * @return The UUID of the new attestation.\\n */\\n function attestByDelegation(\\n DelegatedAttestationRequest calldata delegatedRequest\\n ) external payable returns (bytes32);\\n\\n /**\\n * @dev Attests to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi attestation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttest([{\\n * schema: '0x33e9094830a5cba5554d1954310e4fbed2ef5f859ec1404619adea4207f391fd',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 1000\\n * },\\n * {\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x480df4a039efc31b11bfdf491b383ca138b6bde160988222a2a3509c02cee174',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: true,\\n * refUUID: '0x75bf2ed8dca25a8190c50c52db136664de25b2449535839008ccfdab469b214f',\\n * data: '0x12345678',\\n * value: 0\\n * },\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttest(MultiAttestationRequest[] calldata multiRequests) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Attests to multiple schemas using via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiAttestByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * recipient: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',\\n * expirationTime: 1673891048,\\n * revocable: true,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x1234',\\n * value: 0\\n * },\\n * {\\n * recipient: '0xdEADBeAFdeAdbEafdeadbeafDeAdbEAFdeadbeaf',\\n * expirationTime: 0,\\n * revocable: false,\\n * refUUID: '0x0000000000000000000000000000000000000000000000000000000000000000',\\n * data: '0x00',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * attester: '0x1D86495b2A7B524D747d2839b3C645Bed32e8CF4'\\n * }])\\n *\\n * @return The UUIDs of the new attestations.\\n */\\n function multiAttestByDelegation(\\n MultiDelegatedAttestationRequest[] calldata multiDelegatedRequests\\n ) external payable returns (bytes32[] memory);\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema.\\n *\\n * Example:\\n *\\n * revoke({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0x101032e487642ee04ee17049f99a70590c735b8614079fc9275f9dd57c00966d',\\n * value: 0\\n * }\\n * })\\n *\\n * @param request The arguments of the revocation request.\\n */\\n function revoke(RevocationRequest calldata request) external payable;\\n\\n /**\\n * @dev Revokes an existing attestation to a specific schema via the provided EIP712 signature.\\n *\\n * Example:\\n *\\n * revokeByDelegation({\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: {\\n * uuid: '0xcbbc12102578c642a0f7b34fe7111e41afa25683b6cd7b5a14caf90fa14d24ba',\\n * value: 0\\n * },\\n * signature: {\\n * v: 27,\\n * r: '0xb593...7142',\\n * s: '0x0f5b...2cce'\\n * },\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * })\\n *\\n * @param delegatedRequest The arguments of the delegated revocation request.\\n */\\n function revokeByDelegation(DelegatedRevocationRequest calldata delegatedRequest) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas.\\n *\\n * @param multiRequests The arguments of the multi revocation requests. The requests should be grouped by distinct\\n * schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevoke([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * },\\n * {\\n * schema: '0x5ac273ce41e3c8bfa383efe7c03e54c5f0bff29c9f11ef6ffa930fc84ca32425',\\n * data: [{\\n * uuid: '0x053d42abce1fd7c8fcddfae21845ad34dae287b2c326220b03ba241bc5a8f019',\\n * value: 0\\n * },\\n * }])\\n */\\n function multiRevoke(MultiRevocationRequest[] calldata multiRequests) external payable;\\n\\n /**\\n * @dev Revokes existing attestations to multiple schemas via provided EIP712 signatures.\\n *\\n * @param multiDelegatedRequests The arguments of the delegated multi revocation attestation requests. The requests should be\\n * grouped by distinct schema ids to benefit from the best batching optimization.\\n *\\n * Example:\\n *\\n * multiRevokeByDelegation([{\\n * schema: '0x8e72f5bc0a8d4be6aa98360baa889040c50a0e51f32dbf0baa5199bd93472ebc',\\n * data: [{\\n * uuid: '0x211296a1ca0d7f9f2cfebf0daaa575bea9b20e968d81aef4e743d699c6ac4b25',\\n * value: 1000\\n * },\\n * {\\n * uuid: '0xe160ac1bd3606a287b4d53d5d1d6da5895f65b4b4bab6d93aaf5046e48167ade',\\n * value: 0\\n * }],\\n * signatures: [{\\n * v: 28,\\n * r: '0x148c...b25b',\\n * s: '0x5a72...be22'\\n * },\\n * {\\n * v: 28,\\n * r: '0x487s...67bb',\\n * s: '0x12ad...2366'\\n * }],\\n * revoker: '0x244934dd3e31bE2c81f84ECf0b3E6329F5381992'\\n * }])\\n *\\n */\\n function multiRevokeByDelegation(\\n MultiDelegatedRevocationRequest[] calldata multiDelegatedRequests\\n ) external payable;\\n\\n /**\\n * @dev Timestamps the specified bytes32 data.\\n *\\n * @param data The data to timestamp.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function timestamp(bytes32 data) external returns (uint64);\\n\\n /**\\n * @dev Timestamps the specified multiple bytes32 data.\\n *\\n * @param data The data to timestamp.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function multiTimestamp(bytes32[] calldata data) external returns (uint64);\\n\\n /**\\n * @dev Returns an existing attestation by UUID.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return The attestation data members.\\n */\\n function getAttestation(bytes32 uuid) external view returns (Attestation memory);\\n\\n /**\\n * @dev Checks whether an attestation exists.\\n *\\n * @param uuid The UUID of the attestation to retrieve.\\n *\\n * @return Whether an attestation exists.\\n */\\n function isAttestationValid(bytes32 uuid) external view returns (bool);\\n\\n /**\\n * @dev Returns the timestamp that the specified data was timestamped with.\\n *\\n * @param data The data to query.\\n *\\n * @return The timestamp the data was timestamped with.\\n */\\n function getTimestamp(bytes32 data) external view returns (uint64);\\n}\\n\",\"keccak256\":\"0xeb67cb6f9e51eb5e742f1f14e291b9647ee5f8f0914d0513e094b9ae3f36515d\",\"license\":\"MIT\"},\"contracts/ISchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title A struct representing a record for a submitted schema.\\n */\\nstruct SchemaRecord {\\n bytes32 uuid; // The unique identifier of the schema.\\n ISchemaResolver resolver; // Optional schema resolver.\\n bool revocable; // Whether the schema allows revocations explicitly.\\n string schema; // Custom specification of the schema (e.g., an ABI).\\n}\\n\\n/**\\n * @title The global schema registry interface.\\n */\\ninterface ISchemaRegistry {\\n /**\\n * @dev Emitted when a new schema has been registered\\n *\\n * @param uuid The schema UUID.\\n * @param registerer The address of the account used to register the schema.\\n */\\n event Registered(bytes32 indexed uuid, address registerer);\\n\\n /**\\n * @dev Submits and reserves a new schema\\n *\\n * @param schema The schema data schema.\\n * @param resolver An optional schema resolver.\\n * @param revocable Whether the schema allows revocations explicitly.\\n *\\n * @return The UUID of the new schema.\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32);\\n\\n /**\\n * @dev Returns an existing schema by UUID\\n *\\n * @param uuid The UUID of the schema to retrieve.\\n *\\n * @return The schema data members.\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory);\\n}\\n\",\"keccak256\":\"0x87507ef31d547426def5bc7a808c1c5035d30f4555b2a58c022d6ae49ffea852\",\"license\":\"MIT\"},\"contracts/SchemaRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { EMPTY_UUID } from \\\"./Types.sol\\\";\\nimport { ISchemaRegistry, SchemaRecord } from \\\"./ISchemaRegistry.sol\\\";\\n\\nimport { ISchemaResolver } from \\\"./resolver/ISchemaResolver.sol\\\";\\n\\n/**\\n * @title The global schema registry.\\n */\\ncontract SchemaRegistry is ISchemaRegistry {\\n error AlreadyExists();\\n\\n // The version of the contract.\\n string public constant VERSION = \\\"0.24\\\";\\n\\n // The global mapping between schema records and their IDs.\\n mapping(bytes32 => SchemaRecord) private _registry;\\n\\n /**\\n * @inheritdoc ISchemaRegistry\\n */\\n function register(string calldata schema, ISchemaResolver resolver, bool revocable) external returns (bytes32) {\\n SchemaRecord memory schemaRecord = SchemaRecord({\\n uuid: EMPTY_UUID,\\n schema: schema,\\n resolver: resolver,\\n revocable: revocable\\n });\\n\\n bytes32 uuid = _getUUID(schemaRecord);\\n if (_registry[uuid].uuid != EMPTY_UUID) {\\n revert AlreadyExists();\\n }\\n\\n schemaRecord.uuid = uuid;\\n _registry[uuid] = schemaRecord;\\n\\n emit Registered(uuid, msg.sender);\\n\\n return uuid;\\n }\\n\\n /**\\n * @inheritdoc ISchemaRegistry\\n */\\n function getSchema(bytes32 uuid) external view returns (SchemaRecord memory) {\\n return _registry[uuid];\\n }\\n\\n /**\\n * @dev Calculates a UUID for a given schema.\\n *\\n * @param schemaRecord The input schema.\\n *\\n * @return schema UUID.\\n */\\n function _getUUID(SchemaRecord memory schemaRecord) private pure returns (bytes32) {\\n return keccak256(abi.encodePacked(schemaRecord.schema, schemaRecord.resolver, schemaRecord.revocable));\\n }\\n}\\n\",\"keccak256\":\"0x72908893dd17fa5b09c26b34a44947bc88c53646354269acfb120eea661cbdc8\",\"license\":\"MIT\"},\"contracts/Types.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\n// A representation of an empty/uninitialized UUID.\\nbytes32 constant EMPTY_UUID = 0;\\n\\n/**\\n * @dev A struct representing EIP712 signature data.\\n */\\nstruct EIP712Signature {\\n uint8 v; // The recovery ID.\\n bytes32 r; // The x-coordinate of the nonce R.\\n bytes32 s; // The signature data.\\n}\\n\",\"keccak256\":\"0xda035d575e6fc7f857a23b795ca7cd7d9eb306f068224271ac0fec03e433de94\",\"license\":\"MIT\"},\"contracts/resolver/ISchemaResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.17;\\n\\nimport { Attestation } from \\\"../IEAS.sol\\\";\\n\\n/**\\n * @title The interface of an optional schema resolver.\\n */\\ninterface ISchemaResolver {\\n /**\\n * @dev Returns whether the resolver supports ETH transfers.\\n */\\n function isPayable() external pure returns (bool);\\n\\n /**\\n * @dev Processes an attestation and verifies whether it's valid.\\n *\\n * @param attestation The new attestation.\\n *\\n * @return Whether the attestation is valid.\\n */\\n function attest(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes multiple attestations and verifies whether they are valid.\\n *\\n * @param attestations The new attestations.\\n * @param values Explicit ETH amounts which were sent with each attestation.\\n *\\n * @return Whether all the attestations are valid.\\n */\\n function multiAttest(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n\\n /**\\n * @dev Processes an attestation revocation and verifies if it can be revoked.\\n *\\n * @param attestation The existing attestation to be revoked.\\n *\\n * @return Whether the attestation can be revoked.\\n */\\n function revoke(Attestation calldata attestation) external payable returns (bool);\\n\\n /**\\n * @dev Processes revocation of multiple attestation and verifies they can be revoked.\\n *\\n * @param attestations The existing attestations to be revoked.\\n * @param values Explicit ETH amounts which were sent with each revocation.\\n *\\n * @return Whether the attestations can be revoked.\\n */\\n function multiRevoke(\\n Attestation[] calldata attestations,\\n uint256[] calldata values\\n ) external payable returns (bool);\\n}\\n\",\"keccak256\":\"0x070836a283c69af79de3a0c5319680d1cebc137c7e984fb3221269a75c29d2c2\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60808060405234610016576107b8908161001c8239f35b600080fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323400000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a", + "deployedBytecode": "0x60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323400000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a", + "devdoc": { + "kind": "dev", + "methods": { + "getSchema(bytes32)": { + "details": "Returns an existing schema by UUID", + "params": { + "uuid": "The UUID of the schema to retrieve." + }, + "returns": { + "_0": "The schema data members." + } + }, + "register(string,address,bool)": { + "details": "Submits and reserves a new schema", + "params": { + "resolver": "An optional schema resolver.", + "revocable": "Whether the schema allows revocations explicitly.", + "schema": "The schema data schema." + }, + "returns": { + "_0": "The UUID of the new schema." + } + } + }, + "title": "The global schema registry.", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 5217, + "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", + "label": "_registry", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(SchemaRecord)5164_storage)" + } + ], + "types": { + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(ISchemaResolver)5383": { + "encoding": "inplace", + "label": "contract ISchemaResolver", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_struct(SchemaRecord)5164_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct SchemaRecord)", + "numberOfBytes": "32", + "value": "t_struct(SchemaRecord)5164_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(SchemaRecord)5164_storage": { + "encoding": "inplace", + "label": "struct SchemaRecord", + "members": [ + { + "astId": 5156, + "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", + "label": "uuid", + "offset": 0, + "slot": "0", + "type": "t_bytes32" + }, + { + "astId": 5159, + "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", + "label": "resolver", + "offset": 0, + "slot": "1", + "type": "t_contract(ISchemaResolver)5383" + }, + { + "astId": 5161, + "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", + "label": "revocable", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 5163, + "contract": "contracts/SchemaRegistry.sol:SchemaRegistry", + "label": "schema", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + } + ], + "numberOfBytes": "96" + } + } + } +} \ No newline at end of file diff --git a/deployments/goerli/types/contracts/EAS.ts b/deployments/sepolia/types/contracts/EAS.ts similarity index 85% rename from deployments/goerli/types/contracts/EAS.ts rename to deployments/sepolia/types/contracts/EAS.ts index 3b4b2ce..3acc1dd 100644 --- a/deployments/goerli/types/contracts/EAS.ts +++ b/deployments/sepolia/types/contracts/EAS.ts @@ -8,6 +8,7 @@ import type { BytesLike, CallOverrides, ContractTransaction, + Overrides, PayableOverrides, PopulatedTransaction, Signer, @@ -38,14 +39,14 @@ export type AttestationRequestDataStruct = { export type AttestationRequestDataStructOutput = [ string, - number, + BigNumber, boolean, string, string, BigNumber ] & { recipient: string; - expirationTime: number; + expirationTime: BigNumber; revocable: boolean; refUUID: string; data: string; @@ -96,10 +97,10 @@ export type DelegatedAttestationRequestStructOutput = [ export type AttestationStruct = { uuid: PromiseOrValue; schema: PromiseOrValue; - refUUID: PromiseOrValue; time: PromiseOrValue; expirationTime: PromiseOrValue; revocationTime: PromiseOrValue; + refUUID: PromiseOrValue; recipient: PromiseOrValue; attester: PromiseOrValue; revocable: PromiseOrValue; @@ -109,10 +110,10 @@ export type AttestationStruct = { export type AttestationStructOutput = [ string, string, + BigNumber, + BigNumber, + BigNumber, string, - number, - number, - number, string, string, boolean, @@ -120,10 +121,10 @@ export type AttestationStructOutput = [ ] & { uuid: string; schema: string; + time: BigNumber; + expirationTime: BigNumber; + revocationTime: BigNumber; refUUID: string; - time: number; - expirationTime: number; - revocationTime: number; recipient: string; attester: string; revocable: boolean; @@ -230,21 +231,24 @@ export type DelegatedRevocationRequestStructOutput = [ export interface EASInterface extends utils.Interface { functions: { "VERSION()": FunctionFragment; - "attest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)))": FunctionFragment; - "attestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))": FunctionFragment; + "attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))": FunctionFragment; + "attestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256),(uint8,bytes32,bytes32),address))": FunctionFragment; "getAttestTypeHash()": FunctionFragment; "getAttestation(bytes32)": FunctionFragment; "getDomainSeparator()": FunctionFragment; "getNonce(address)": FunctionFragment; "getRevokeTypeHash()": FunctionFragment; "getSchemaRegistry()": FunctionFragment; + "getTimestamp(bytes32)": FunctionFragment; "isAttestationValid(bytes32)": FunctionFragment; - "multiAttest((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[])[])": FunctionFragment; - "multiAttestByDelegation((bytes32,(address,uint32,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])": FunctionFragment; + "multiAttest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[])[])": FunctionFragment; + "multiAttestByDelegation((bytes32,(address,uint64,bool,bytes32,bytes,uint256)[],(uint8,bytes32,bytes32)[],address)[])": FunctionFragment; "multiRevoke((bytes32,(bytes32,uint256)[])[])": FunctionFragment; "multiRevokeByDelegation((bytes32,(bytes32,uint256)[],(uint8,bytes32,bytes32)[],address)[])": FunctionFragment; + "multiTimestamp(bytes32[])": FunctionFragment; "revoke((bytes32,(bytes32,uint256)))": FunctionFragment; "revokeByDelegation((bytes32,(bytes32,uint256),(uint8,bytes32,bytes32),address))": FunctionFragment; + "timestamp(bytes32)": FunctionFragment; }; getFunction( @@ -258,13 +262,16 @@ export interface EASInterface extends utils.Interface { | "getNonce" | "getRevokeTypeHash" | "getSchemaRegistry" + | "getTimestamp" | "isAttestationValid" | "multiAttest" | "multiAttestByDelegation" | "multiRevoke" | "multiRevokeByDelegation" + | "multiTimestamp" | "revoke" | "revokeByDelegation" + | "timestamp" ): FunctionFragment; encodeFunctionData(functionFragment: "VERSION", values?: undefined): string; @@ -300,6 +307,10 @@ export interface EASInterface extends utils.Interface { functionFragment: "getSchemaRegistry", values?: undefined ): string; + encodeFunctionData( + functionFragment: "getTimestamp", + values: [PromiseOrValue] + ): string; encodeFunctionData( functionFragment: "isAttestationValid", values: [PromiseOrValue] @@ -320,6 +331,10 @@ export interface EASInterface extends utils.Interface { functionFragment: "multiRevokeByDelegation", values: [MultiDelegatedRevocationRequestStruct[]] ): string; + encodeFunctionData( + functionFragment: "multiTimestamp", + values: [PromiseOrValue[]] + ): string; encodeFunctionData( functionFragment: "revoke", values: [RevocationRequestStruct] @@ -328,6 +343,10 @@ export interface EASInterface extends utils.Interface { functionFragment: "revokeByDelegation", values: [DelegatedRevocationRequestStruct] ): string; + encodeFunctionData( + functionFragment: "timestamp", + values: [PromiseOrValue] + ): string; decodeFunctionResult(functionFragment: "VERSION", data: BytesLike): Result; decodeFunctionResult(functionFragment: "attest", data: BytesLike): Result; @@ -356,6 +375,10 @@ export interface EASInterface extends utils.Interface { functionFragment: "getSchemaRegistry", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "getTimestamp", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "isAttestationValid", data: BytesLike @@ -376,19 +399,26 @@ export interface EASInterface extends utils.Interface { functionFragment: "multiRevokeByDelegation", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "multiTimestamp", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "revoke", data: BytesLike): Result; decodeFunctionResult( functionFragment: "revokeByDelegation", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "timestamp", data: BytesLike): Result; events: { "Attested(address,address,bytes32,bytes32)": EventFragment; "Revoked(address,address,bytes32,bytes32)": EventFragment; + "Timestamped(bytes32,uint64)": EventFragment; }; getEvent(nameOrSignatureOrTopic: "Attested"): EventFragment; getEvent(nameOrSignatureOrTopic: "Revoked"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Timestamped"): EventFragment; } export interface AttestedEventObject { @@ -417,6 +447,17 @@ export type RevokedEvent = TypedEvent< export type RevokedEventFilter = TypedEventFilter; +export interface TimestampedEventObject { + data: string; + timestamp: BigNumber; +} +export type TimestampedEvent = TypedEvent< + [string, BigNumber], + TimestampedEventObject +>; + +export type TimestampedEventFilter = TypedEventFilter; + export interface EAS extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; @@ -474,6 +515,11 @@ export interface EAS extends BaseContract { getSchemaRegistry(overrides?: CallOverrides): Promise<[string]>; + getTimestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + isAttestationValid( uuid: PromiseOrValue, overrides?: CallOverrides @@ -499,6 +545,11 @@ export interface EAS extends BaseContract { overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + multiTimestamp( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + revoke( request: RevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } @@ -508,6 +559,11 @@ export interface EAS extends BaseContract { delegatedRequest: DelegatedRevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + + timestamp( + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; }; VERSION(overrides?: CallOverrides): Promise; @@ -540,6 +596,11 @@ export interface EAS extends BaseContract { getSchemaRegistry(overrides?: CallOverrides): Promise; + getTimestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + isAttestationValid( uuid: PromiseOrValue, overrides?: CallOverrides @@ -565,6 +626,11 @@ export interface EAS extends BaseContract { overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + multiTimestamp( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + revoke( request: RevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } @@ -575,6 +641,11 @@ export interface EAS extends BaseContract { overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + timestamp( + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + callStatic: { VERSION(overrides?: CallOverrides): Promise; @@ -606,6 +677,11 @@ export interface EAS extends BaseContract { getSchemaRegistry(overrides?: CallOverrides): Promise; + getTimestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + isAttestationValid( uuid: PromiseOrValue, overrides?: CallOverrides @@ -631,6 +707,11 @@ export interface EAS extends BaseContract { overrides?: CallOverrides ): Promise; + multiTimestamp( + data: PromiseOrValue[], + overrides?: CallOverrides + ): Promise; + revoke( request: RevocationRequestStruct, overrides?: CallOverrides @@ -640,6 +721,11 @@ export interface EAS extends BaseContract { delegatedRequest: DelegatedRevocationRequestStruct, overrides?: CallOverrides ): Promise; + + timestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; }; filters: { @@ -668,6 +754,15 @@ export interface EAS extends BaseContract { uuid?: null, schema?: PromiseOrValue | null ): RevokedEventFilter; + + "Timestamped(bytes32,uint64)"( + data?: PromiseOrValue | null, + timestamp?: PromiseOrValue | null + ): TimestampedEventFilter; + Timestamped( + data?: PromiseOrValue | null, + timestamp?: PromiseOrValue | null + ): TimestampedEventFilter; }; estimateGas: { @@ -701,6 +796,11 @@ export interface EAS extends BaseContract { getSchemaRegistry(overrides?: CallOverrides): Promise; + getTimestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + isAttestationValid( uuid: PromiseOrValue, overrides?: CallOverrides @@ -726,6 +826,11 @@ export interface EAS extends BaseContract { overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + multiTimestamp( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + revoke( request: RevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } @@ -735,6 +840,11 @@ export interface EAS extends BaseContract { delegatedRequest: DelegatedRevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + + timestamp( + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; }; populateTransaction: { @@ -770,6 +880,11 @@ export interface EAS extends BaseContract { getSchemaRegistry(overrides?: CallOverrides): Promise; + getTimestamp( + data: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + isAttestationValid( uuid: PromiseOrValue, overrides?: CallOverrides @@ -795,6 +910,11 @@ export interface EAS extends BaseContract { overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + multiTimestamp( + data: PromiseOrValue[], + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; + revoke( request: RevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } @@ -804,5 +924,10 @@ export interface EAS extends BaseContract { delegatedRequest: DelegatedRevocationRequestStruct, overrides?: PayableOverrides & { from?: PromiseOrValue } ): Promise; + + timestamp( + data: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise; }; } diff --git a/deployments/goerli/types/contracts/SchemaRegistry.ts b/deployments/sepolia/types/contracts/SchemaRegistry.ts similarity index 100% rename from deployments/goerli/types/contracts/SchemaRegistry.ts rename to deployments/sepolia/types/contracts/SchemaRegistry.ts diff --git a/deployments/sepolia/types/factories/contracts/EAS__factory.ts b/deployments/sepolia/types/factories/contracts/EAS__factory.ts new file mode 100644 index 0000000..f8179df --- /dev/null +++ b/deployments/sepolia/types/factories/contracts/EAS__factory.ts @@ -0,0 +1,985 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../../common"; +import type { EAS, EASInterface } from "../../contracts/EAS"; + +const _abi = [ + { + inputs: [ + { + internalType: "contract ISchemaRegistry", + name: "registry", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "AccessDenied", + type: "error", + }, + { + inputs: [], + name: "AlreadyRevoked", + type: "error", + }, + { + inputs: [], + name: "AlreadyTimestamped", + type: "error", + }, + { + inputs: [], + name: "InsufficientValue", + type: "error", + }, + { + inputs: [], + name: "InvalidAttestation", + type: "error", + }, + { + inputs: [], + name: "InvalidAttestations", + type: "error", + }, + { + inputs: [], + name: "InvalidExpirationTime", + type: "error", + }, + { + inputs: [], + name: "InvalidLength", + type: "error", + }, + { + inputs: [], + name: "InvalidOffset", + type: "error", + }, + { + inputs: [], + name: "InvalidRegistry", + type: "error", + }, + { + inputs: [], + name: "InvalidRevocation", + type: "error", + }, + { + inputs: [], + name: "InvalidRevocations", + type: "error", + }, + { + inputs: [], + name: "InvalidSchema", + type: "error", + }, + { + inputs: [], + name: "InvalidSignature", + type: "error", + }, + { + inputs: [], + name: "InvalidVerifier", + type: "error", + }, + { + inputs: [], + name: "Irrevocable", + type: "error", + }, + { + inputs: [], + name: "NotFound", + type: "error", + }, + { + inputs: [], + name: "NotPayable", + type: "error", + }, + { + inputs: [], + name: "WrongSchema", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "recipient", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "attester", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + ], + name: "Attested", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "recipient", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "attester", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + indexed: true, + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + ], + name: "Revoked", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "bytes32", + name: "data", + type: "bytes32", + }, + { + indexed: true, + internalType: "uint64", + name: "timestamp", + type: "uint64", + }, + ], + name: "Timestamped", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint64", + name: "expirationTime", + type: "uint64", + }, + { + internalType: "bool", + name: "revocable", + type: "bool", + }, + { + internalType: "bytes32", + name: "refUUID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct AttestationRequestData", + name: "data", + type: "tuple", + }, + ], + internalType: "struct AttestationRequest", + name: "request", + type: "tuple", + }, + ], + name: "attest", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint64", + name: "expirationTime", + type: "uint64", + }, + { + internalType: "bool", + name: "revocable", + type: "bool", + }, + { + internalType: "bytes32", + name: "refUUID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct AttestationRequestData", + name: "data", + type: "tuple", + }, + { + components: [ + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + internalType: "struct EIP712Signature", + name: "signature", + type: "tuple", + }, + { + internalType: "address", + name: "attester", + type: "address", + }, + ], + internalType: "struct DelegatedAttestationRequest", + name: "delegatedRequest", + type: "tuple", + }, + ], + name: "attestByDelegation", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [], + name: "getAttestTypeHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + ], + name: "getAttestation", + outputs: [ + { + components: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + internalType: "uint64", + name: "time", + type: "uint64", + }, + { + internalType: "uint64", + name: "expirationTime", + type: "uint64", + }, + { + internalType: "uint64", + name: "revocationTime", + type: "uint64", + }, + { + internalType: "bytes32", + name: "refUUID", + type: "bytes32", + }, + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "address", + name: "attester", + type: "address", + }, + { + internalType: "bool", + name: "revocable", + type: "bool", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + internalType: "struct Attestation", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getDomainSeparator", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getNonce", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getRevokeTypeHash", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "getSchemaRegistry", + outputs: [ + { + internalType: "contract ISchemaRegistry", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "data", + type: "bytes32", + }, + ], + name: "getTimestamp", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + ], + name: "isAttestationValid", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint64", + name: "expirationTime", + type: "uint64", + }, + { + internalType: "bool", + name: "revocable", + type: "bool", + }, + { + internalType: "bytes32", + name: "refUUID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct AttestationRequestData[]", + name: "data", + type: "tuple[]", + }, + ], + internalType: "struct MultiAttestationRequest[]", + name: "multiRequests", + type: "tuple[]", + }, + ], + name: "multiAttest", + outputs: [ + { + internalType: "bytes32[]", + name: "", + type: "bytes32[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "address", + name: "recipient", + type: "address", + }, + { + internalType: "uint64", + name: "expirationTime", + type: "uint64", + }, + { + internalType: "bool", + name: "revocable", + type: "bool", + }, + { + internalType: "bytes32", + name: "refUUID", + type: "bytes32", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct AttestationRequestData[]", + name: "data", + type: "tuple[]", + }, + { + components: [ + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + internalType: "struct EIP712Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "address", + name: "attester", + type: "address", + }, + ], + internalType: "struct MultiDelegatedAttestationRequest[]", + name: "multiDelegatedRequests", + type: "tuple[]", + }, + ], + name: "multiAttestByDelegation", + outputs: [ + { + internalType: "bytes32[]", + name: "", + type: "bytes32[]", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct RevocationRequestData[]", + name: "data", + type: "tuple[]", + }, + ], + internalType: "struct MultiRevocationRequest[]", + name: "multiRequests", + type: "tuple[]", + }, + ], + name: "multiRevoke", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct RevocationRequestData[]", + name: "data", + type: "tuple[]", + }, + { + components: [ + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + internalType: "struct EIP712Signature[]", + name: "signatures", + type: "tuple[]", + }, + { + internalType: "address", + name: "revoker", + type: "address", + }, + ], + internalType: "struct MultiDelegatedRevocationRequest[]", + name: "multiDelegatedRequests", + type: "tuple[]", + }, + ], + name: "multiRevokeByDelegation", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32[]", + name: "data", + type: "bytes32[]", + }, + ], + name: "multiTimestamp", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct RevocationRequestData", + name: "data", + type: "tuple", + }, + ], + internalType: "struct RevocationRequest", + name: "request", + type: "tuple", + }, + ], + name: "revoke", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "bytes32", + name: "schema", + type: "bytes32", + }, + { + components: [ + { + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + internalType: "struct RevocationRequestData", + name: "data", + type: "tuple", + }, + { + components: [ + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + internalType: "struct EIP712Signature", + name: "signature", + type: "tuple", + }, + { + internalType: "address", + name: "revoker", + type: "address", + }, + ], + internalType: "struct DelegatedRevocationRequest", + name: "delegatedRequest", + type: "tuple", + }, + ], + name: "revokeByDelegation", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "data", + type: "bytes32", + }, + ], + name: "timestamp", + outputs: [ + { + internalType: "uint64", + name: "", + type: "uint64", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +const _bytecode = + "0x61016034620001b657601f62004da838819003918201601f19168301926001600160401b0392909183851183861017620001a0578160209284926040978852833981010312620001b657516001600160a01b03811692838203620001b6578051926200006b84620001bb565b6004845260208401630c0b8c8d60e21b81526003602084516200008e81620001bb565b828152016245415360e81b81522094519020948460e052610100958087524660a052835160208101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f978884528683015260608201524660808201523060a082015260a0815260c081019381851090851117620001a0578385525190206080523060c052610120948552156200019157506101409182525191614bd09384620001d8853960805184614648015260a05184614703015260c05184614619015260e05184614697015251836146bd0152518261467401525181818161026501528181610a9301528181611093015281816129d9015281816130c701526133450152f35b6311a1e69760e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b604081019081106001600160401b03821117620001a05760405256fe61010080604052600436101561001457600080fd5b60003560e01c90816312b11a1714611d91575080632d0335ab14611d2957806344adc90e14611c245780634692626714611bc65780634cb7e9e514611ac45780634d00307014611a7c578063831e05a114611843578063a3112a64146117dc578063b83010d314611783578063d45c44351461172f578063e13458fc14610f37578063e30bb56314610ee3578063e45d03f914610c7f578063e57a6b1b14610b7b578063e71ff36514610af8578063ed24911d14610ab7578063f10b5cc814610a48578063f17325e7146101765763ffa1ad74146100f157600080fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715761016d60405161012f81611fcb565b600481527f302e3234000000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611e98565b0390f35b600080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc602081360112610171576004359067ffffffffffffffff821161017157604082600401918336030112610171576101e36101cf612097565b926101de6024369201846120ff565b612153565b6101ec83612132565b526101f682612132565b506101ff6127bd565b5081519161020b6127bd565b91610215846127d7565b6020840152604051937fa2ea7c6e0000000000000000000000000000000000000000000000000000000085528135600486015260008560248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa948515610a3c57600095610a17575b508451156109ed57916102a8836128fa565b916102b2846127d7565b936000925b8184106102e35760206102da81896102d1348b8b8f6135e8565b81520151612132565b51604051908152f35b6102f58482999496989395979961213f565b519267ffffffffffffffff60208501511680151590816109d8575b506109ae57604081015115806109a1575b6109775760608401519467ffffffffffffffff6020860151169573ffffffffffffffffffffffffffffffffffffffff86511660408701511515906080880151926040519961036e8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c08901523360e089015261010088015261012087015260005b602087015160c08801516104bd609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b8201907fffffffff000000000000000000000000000000000000000000000000000000008860e01b169082015203607d810184520182612004565b519020806000526001602052604060002054156104e3575060010163ffffffff166103b4565b919690509997919998969492939881815281600052600160205260406000209080518255602081015160018301556105c26002830167ffffffffffffffff6040840151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606087015160401b1692161717815567ffffffffffffffff6080840151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a081015160038301556004820173ffffffffffffffffffffffffffffffffffffffff60c0830151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005820173ffffffffffffffffffffffffffffffffffffffff60e0830151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100860151151560a01b1692161717905561012081015180519167ffffffffffffffff831161094857838c938c938f9660066106a991015461260a565b601f81116108d4575b50602090601f83116001146107f75760069291600091836107ec575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b606087015180610797575b5085602073ffffffffffffffffffffffffffffffffffffffff9560019995610744848761075c9761073e838e9b61213f565b5261213f565b506107548460a08901519261213f565b52015161213f565b525116906040519081528535917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b3560203393a40192906102b7565b915092506107b391506000526001602052604060002054151590565b156107c25788888b928e61070c565b60046040517fc5723b51000000000000000000000000000000000000000000000000000000008152fd5b0151905038806106ce565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106108a95750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610610872575b505050811b01910155610701565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610864565b9497509295509396506020600181928685015181550194019201928f9693928f9693928f9693610808565b9295509295509250600684016000526020600020601f840160051c810160208510610941575b928f9693928f9693928f96935b601f830160051c8201811061091d5750506106b2565b60019396995080929598506000919497505501928f9693928f9693928f9693610907565b50806108fa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60046040517f157bd4c3000000000000000000000000000000000000000000000000000000008152fd5b5060408401511515610321565b60046040517f08e8b937000000000000000000000000000000000000000000000000000000008152fd5b905067ffffffffffffffff421610158a610310565b60046040517fbf37b20e000000000000000000000000000000000000000000000000000000008152fd5b610a359195503d806000833e610a2d8183612004565b810190612833565b9385610296565b6040513d6000823e3d90fd5b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610af0614602565b604051908152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610b48903690600401611e09565b909142169160005b828110610b6257602084604051908152f35b80610b758560019360051b85013561455c565b01610b50565b60e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157604051610bb181611f77565b600435808252610bc036612507565b602083015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c36011261017157604051610bfb81611faf565b60643560ff81168103610171578152608435602082015260a4356040820152604083015260c43573ffffffffffffffffffffffffffffffffffffffff8116810361017157610c5183826060610c7d960152614afd565b610c596124b8565b610c6236612507565b610c6b82612132565b52610c7581612132565b50349261307a565b005b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff60043581811161017157610ccc83913690600401611e09565b909234926000915b838310610cdd57005b610ce8838588612424565b946080863603126101715760405195610d0087611f77565b803587528381013583811161017157810194601f9536878201121561017157610d2f903690878135910161254d565b9285890193845260408301358581116101715783019636908801121561017157863594610d5b8661207f565b97610d69604051998a612004565b868952878901886060809902830101913683116101715789808a9201925b848410610ecb5750509050610da5915060408c01958a875201611de8565b94868b01958652519788518015918215610ebf575b5050610e955760005b8851811015610e2b57600190610e258c51610dde838d61213f565b51610dea848a5161213f565b5173ffffffffffffffffffffffffffffffffffffffff8b51169160405193610e1185611f77565b84528d84015260408301528a820152614afd565b01610dc3565b50986001955081935090610e85929a97610e8b9592519073ffffffffffffffffffffffffffffffffffffffff8d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d0114945116916132f7565b906123e8565b9501919493610cd4565b60046040517f947d5a84000000000000000000000000000000000000000000000000000000008152fd5b51141590508c80610dba565b610ed5368561221e565b815201910190898991610d87565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576020610f2d6004356000526001602052604060002054151590565b6040519015158152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6020813601126101715760043567ffffffffffffffff81116101715760c0816004019282360301126101715760405190610f9182611f77565b82358252602481019182359167ffffffffffffffff83116101715760a4610ff191610fc56110219560043691840101612153565b6020850152610fd7366044830161221e565b60408501520191610fe783611de8565b6060820152614729565b611008610ffc612097565b936101de3691876120ff565b61101184612132565b5261101b83612132565b5061225c565b9061102a6127bd565b508051906110366127bd565b608052611042826127d7565b602060805101526040517fa2ea7c6e0000000000000000000000000000000000000000000000000000000081528435600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610a3c57600060c052611712575b5060c05151156109ed5790916110da836128fa565b60a0526110e6836127d7565b60e0526000915b83831061111a576111063460e05160a05160c0516135e8565b6080515260206102da816080510151612132565b611124838261213f565b519067ffffffffffffffff60208301511680151590816116fd575b506109ae57604060c051015115806116f0575b6109775760608201519467ffffffffffffffff6020840151169573ffffffffffffffffffffffffffffffffffffffff84511660408501511515906080860151926040519961119f8b611fe7565b60008b528b3560208c015267ffffffffffffffff421660408c015260608b0152600060808b015260a08a015260c089015273ffffffffffffffffffffffffffffffffffffffff861660e089015261010088015261012087015260005b602087015160c08801516112c9609d60e08b015160408c01518c60608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b519020806000526001602052604060002054156112ef575060010163ffffffff166111fb565b91959294969050818152816000526001602052604060002081518155602082015160018201556113c66002820167ffffffffffffffff6040850151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff0000000000000000606088015160401b1692161717815567ffffffffffffffff6080850151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a082015160038201556004810173ffffffffffffffffffffffffffffffffffffffff60c0840151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005810173ffffffffffffffffffffffffffffffffffffffff60e0840151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff0000000000000000000000000000000000000000610100870151151560a01b1692161717905561012082015180519067ffffffffffffffff8211610948576114a6600684015461260a565b601f81116116a9575b50602090601f83116001146115df5760069291600091836115d4575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b6060840151806115b2575b5060019373ffffffffffffffffffffffffffffffffffffffff9161152f8560a05161213f565b5261153c8460a05161213f565b5060a081015161154e8560e05161213f565b5282611560856020608051015161213f565b525116906040519081528735917f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff8a1693a4019192906110ed565b6115c9906000526001602052604060002054151590565b156107c25788611509565b015190508c806114cb565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0851681106116915750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0600697161061165a575b505050811b019101556114fe565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c808061164c565b919260206001819286850151815501940192016115f0565b600684016000526020600020601f840160051c8101602085106116e9575b601f830160051c820181106116dd5750506114af565b600081556001016116c7565b50806116c7565b5060408201511515611152565b905067ffffffffffffffff421610158761113f565b611726903d806000833e610a2d8183612004565b60c052846110c5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576004356000526002602052602067ffffffffffffffff60406000205416604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760206040517ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e8152f35b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610171576118136125bf565b50600435600052600160205261016d61182f604060002061265d565b604051918291602083526020830190611edb565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff81116101715761188d903690600401611e09565b6118968161227d565b916000918291345b8284106118be5761016d6118b286886144ef565b60405191829182611e3a565b909192936118cd858585612424565b6118da6020820182612324565b909181158015611a64575b610e9557908491888860005b84811061197c5750936119559361194c9361194560019998947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209901149461193d6060840161225c565b933691612378565b9035612967565b948551906123e8565b93018051611963888a61213f565b5261196e878961213f565b50515101940192919061189e565b9293945050506119918160051b8501856120ff565b9061199f6040840184612464565b829391931015611a35576119b56060850161225c565b926040519081608081011067ffffffffffffffff60808401111761094857600194611a1973ffffffffffffffffffffffffffffffffffffffff92611a08611a2996608087016040528a3587523690612153565b60208601523690606088020161221e565b6040840152166060820152614729565b019088888794936118f1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b50611a726040820182612464565b90508214156118e5565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157602067ffffffffffffffff4216610af08160043561455c565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715767ffffffffffffffff9060043582811161017157611b11903690600401611e09565b929091600090345b858310611b2257005b611b2d8387876122e4565b828101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561017157810191823592868411610171578401928060061b360384136101715760019382610e8592611bbe95611bb77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e018b14943393369161254d565b90356132f7565b920191611b19565b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157610c7d611bfb6124b8565b611c0436612507565b611c0d82612132565b52611c1781612132565b503490339060043561307a565b6020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043567ffffffffffffffff811161017157611c6f903690600401611e09565b611c7b8193929361227d565b92600092346000937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101905b808610611cbc5761016d6118b2888a6144ef565b90919293949560019085611d00611cf78a8888611cda838a8f6122e4565b611945611ce988830183612324565b939095149433933691612378565b968751906123e8565b95018051611d0e8a8c61213f565b52611d19898b61213f565b5051510196019493929190611ca8565b346101715760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101715760043573ffffffffffffffffffffffffffffffffffffffff81168091036101715760005260006020526020604060002054604051908152f35b346101715760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017157807f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c260209252f35b359073ffffffffffffffffffffffffffffffffffffffff8216820361017157565b9181601f840112156101715782359167ffffffffffffffff8311610171576020808501948460051b01011161017157565b6020908160408183019282815285518094520193019160005b828110611e61575050505090565b835185529381019392810192600101611e53565b60005b838110611e885750506000910152565b8181015183820152602001611e78565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611ed481518092818752878088019101611e75565b0116010190565b90611f7491805182526020810151602083015267ffffffffffffffff806040830151166040840152806060830151166060840152608082015116608083015260a081015160a083015273ffffffffffffffffffffffffffffffffffffffff8060c08301511660c084015260e08201511660e083015261010080820151151590830152610120809101519161014080928201520190611e98565b90565b6080810190811067ffffffffffffffff82111761094857604052565b60c0810190811067ffffffffffffffff82111761094857604052565b6060810190811067ffffffffffffffff82111761094857604052565b6040810190811067ffffffffffffffff82111761094857604052565b610140810190811067ffffffffffffffff82111761094857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761094857604052565b67ffffffffffffffff811161094857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b67ffffffffffffffff81116109485760051b60200190565b6040908151916120a683611fcb565b60018352829160005b6020808210156120f7578351602092916120c882611f93565b6000825260008183015260008683015260606000818401526080830152600060a08301528288010152016120af565b505091925050565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4181360301821215610171570190565b805115611a355760200190565b8051821015611a355760209160051b010190565b919060c083820312610171576040519067ffffffffffffffff9060c083018281118482101761094857604052829461218a81611de8565b84526020928382013581811681036101715784860152604082013580151581036101715760408601526060820135606086015260808201359081116101715781019180601f84011215610171578235926121e384612045565b916121f16040519384612004565b84835285858301011161017157848460a09695879660009401838601378301015260808501520135910152565b91908260609103126101715760405161223681611faf565b8092803560ff811681036101715760409182918452602081013560208501520135910152565b3573ffffffffffffffffffffffffffffffffffffffff811681036101715790565b906122878261207f565b6122946040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06122c2829461207f565b019060005b8281106122d357505050565b8060606020809385010152016122c7565b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff821161017157602001918160051b3603831361017157565b929190926123858461207f565b916123936040519384612004565b829480845260208094019060051b8301928284116101715780915b8483106123bd57505050505050565b823567ffffffffffffffff81116101715786916123dd8684938601612153565b8152019201916123ae565b919082039182116123f557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190811015611a355760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301821215610171570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610171570180359067ffffffffffffffff82116101715760200191606082023603831361017157565b6040908151916124c783611fcb565b600183528291600091825b6020808210156124fe578251602092916124eb82611fcb565b86825286818301528289010152016124d2565b50505091925050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc6040910112610171576040519061253e82611fcb565b60243582526044356020830152565b9291926125598261207f565b60409261256884519283612004565b819581835260208093019160061b84019381851161017157915b84831061259157505050505050565b85838303126101715783869182516125a881611fcb565b853581528286013583820152815201920191612582565b604051906125cc82611fe7565b606061012083600080825280602083015280604083015280848301528060808301528060a08301528060c08301528060e08301526101008201520152565b90600182811c92168015612653575b602083101461262457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612619565b906040519161266b83611fe7565b828154815260016006818401549360209485850152600281015467ffffffffffffffff908181166040870152818160401c16606087015260801c166080850152600381015460a085015260ff73ffffffffffffffffffffffffffffffffffffffff8060048401541660c0870152600583015490811660e087015260a01c16151561010085015201906040519384926000928154916127088361260a565b8087529282811690811561277d5750600114612737575b505050506101209291612733910384612004565b0152565b60009081528381209695945091905b818310612765575093945091925090820101816127336101203861271f565b86548884018501529586019587945091830191612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685880152505050151560051b8301019050816127336101203861271f565b604051906127ca82611fcb565b6060602083600081520152565b906127e18261207f565b6127ee6040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061281c829461207f565b0190602036910137565b5190811515820361017157565b906020808383031261017157825167ffffffffffffffff93848211610171570192608084840312610171576040519361286b85611f77565b805185528281015173ffffffffffffffffffffffffffffffffffffffff8116810361017157838601526128a060408201612826565b60408601526060810151918211610171570182601f82011215610171578051906128c982612045565b936128d76040519586612004565b82855283838301011161017157826128f29385019101611e75565b606082015290565b906129048261207f565b6129116040519182612004565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061293f829461207f565b019060005b82811061295057505050565b60209061295b6125bf565b82828501015201612944565b92909493916129746127bd565b508551936129806127bd565b9461298a816127d7565b6020870152604051907fa2ea7c6e00000000000000000000000000000000000000000000000000000000825282600483015260008260248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa918215610a3c5760009261305d575b508151156109ed5792979091612a1f846128fa565b98612a29856127d7565b946000935b818510612a4b57505050505095612a4694959661384f565b815290565b91959398949699909297612a5f8a8461213f565b519a67ffffffffffffffff60208d0151168015159081613048575b506109ae576040890151158061303b575b61097757899860608d01518d602081015167ffffffffffffffff1691815173ffffffffffffffffffffffffffffffffffffffff1690604083015115159260800151936040519e8f90612adc82611fe7565b6000825260208201524267ffffffffffffffff166040820152606001528d608081016000905260a0015260c08d015273ffffffffffffffffffffffffffffffffffffffff8b1660e08d01526101008c01526101208b015260005b60208b01518b612c07609d60c08301519260e08101519060408101519060608101519161010082015115159061012060a084015193015193604051988996602088019b8c527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000809260601b16604089015260601b1660548701527fffffffffffffffff000000000000000000000000000000000000000000000000809260c01b16606887015260c01b16607085015260f81b6078840152607983015280516104828160999360208587019101611e75565b51902080600052600160205260406000205415612c2d575060010163ffffffff16612b36565b90509d979b9199929a949d9c909698939c8084528060005260016020526040600020918451835560208501516001840155612d0f6002840167ffffffffffffffff6040880151168154907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000060608b015160401b1692161717815567ffffffffffffffff6080880151167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff77ffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60a085015160038401556004830173ffffffffffffffffffffffffffffffffffffffff60c0870151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556005830173ffffffffffffffffffffffffffffffffffffffff60e0870151168154907fffffffffffffffffffffff00000000000000000000000000000000000000000074ff00000000000000000000000000000000000000006101008a0151151560a01b1692161717905561012085015192835167ffffffffffffffff8111610948578894612df1600684015461260a565b601f8111612fe0575b50602090601f8311600114612f13576006929160009183612f08575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179101555b8d8b8b606084015180612edb575b5086602073ffffffffffffffffffffffffffffffffffffffff95948794610744848660019e61073e83612e899a61213f565b5251166040519182527f8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35602073ffffffffffffffffffffffffffffffffffffffff881693a4019290919293949a612a2e565b92505050612ef89193506000526001602052604060002054151590565b156107c25785918d8b8b38612e57565b015190503880612e16565b906006840160005260206000209160005b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085168110612fc55750918391600193837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06006971610612f8e575b505050811b01910155612e49565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080612f80565b8183015184558c985060019093019260209283019201612f24565b90919293949550600684016000526020600020601f840160051c810160208510613034575b908b979695949392915b601f830160051c82018110613025575050612dfa565b600081558c985060010161300f565b5080613005565b5060408c01511515612a8b565b905067ffffffffffffffff4216101538612a7a565b6130739192503d806000833e610a2d8183612004565b9038612a0a565b939291936040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815281600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c576000916132dc575b508051156109ed57825161310b816128fa565b92613115826127d7565b9460005b83811061312f5750505050611f74949550613a30565b613139818361213f565b5190815160005260016020526040600020918254156107c257846001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff8d1673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001928c9161320d8261265d565b613217858c61213f565b52613222848b61213f565b506020810151613232858d61213f565b527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff87816004870154169451950154956040519586521693a401613119565b60046040517f905e7107000000000000000000000000000000000000000000000000000000008152fd5b60046040517f4ca88867000000000000000000000000000000000000000000000000000000008152fd5b6132f191503d806000833e610a2d8183612004565b386130f8565b90949392916040517fa2ea7c6e00000000000000000000000000000000000000000000000000000000815282600482015260008160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115610a3c57600091613519575b508051156109ed578651613389816128fa565b92613393826127d7565b9460005b8381106133ad5750505050611f74959650613c2f565b6133b7818c61213f565b5190815160005260016020526040600020918254156107c257836001840154036109ed57600583015473ffffffffffffffffffffffffffffffffffffffff861673ffffffffffffffffffffffffffffffffffffffff8216036132b25760a01c60ff16156109775767ffffffffffffffff600284015460801c16613288576002830180547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff164260801b77ffffffffffffffff00000000000000000000000000000000161790556001926134898161265d565b613493848b61213f565b5261349e838a61213f565b5060208201516134ae848c61213f565b528373ffffffffffffffffffffffffffffffffffffffff6004830154169251910154916040519182527ff930a6e2523c9cc298691873087a740550b8fc85a0680830414c148ed927f615602073ffffffffffffffffffffffffffffffffffffffff891693a401613397565b61352e91503d806000833e610a2d8183612004565b38613376565b60408101906040815282518092526060810160608360051b830101926020809501916000905b82821061359d57505050508281830391015281808451928381520193019160005b828110613589575050505090565b83518552938101939281019260010161357b565b909192959485806135d8837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa089600196030186528a51611edb565b979801949391909101910161355a565b90929183519360019081861461382e5773ffffffffffffffffffffffffffffffffffffffff602080950151169182156137fe579560009687915b8083106136f0575050509183929161366b9492876040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916136b9575b5090501561368f57611f74906143c0565b60046040517fe8bee839000000000000000000000000000000000000000000000000000000008152fd5b82813d83116136e9575b6136cd8183612004565b810103126136e657506136df90612826565b803861367e565b80fd5b503d6136c3565b909197966136fe898761213f565b5180151580613778575b61374e5781811161372457808492039801980190919091613622565b60046040517f11011294000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1574f9f3000000000000000000000000000000000000000000000000000000008152fd5b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916137bf575b5015613708565b908982813d83116137ed575b6137d58183612004565b810103126136e657506137e790612826565b386137b8565b503d6137cb565b513d6000823e3d90fd5b9594505050905060005b8281106138185750505050600090565b613822818361213f565b5161374e578301613808565b611f749550613848915061384190612132565b5191612132565b5191613e07565b909391845194600190818714613a135773ffffffffffffffffffffffffffffffffffffffff602080950151169182156139e2579660009788915b80831061393257505050918392916138d29492886040518097819582947f91db0b7e00000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c576000916138fe575b5090501561368f576138f5575090565b611f74906143c0565b82813d831161392b575b6139128183612004565b810103126136e6575061392490612826565b80386138e5565b503d613908565b909198976139408a8761213f565b5180151580613966575b61374e5781811161372457808492039901990190919091613889565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f457506000916139ad575b501561394a565b908982813d83116139db575b6139c38183612004565b810103126136e657506139d590612826565b386139a6565b503d6139b9565b969550505091505060005b8281106139fd5750505050600090565b613a07818361213f565b5161374e5783016139ed565b611f749650613a29915061384190959495612132565b5191613f8e565b909291835193600190818614613c155773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613be5579560009687915b808310613b355750505091839291613ab39492876040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613b01575b50905015613ad757611f74906143c0565b60046040517fbf2f3a8b000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613b2e575b613b158183612004565b810103126136e65750613b2790612826565b8038613ac6565b503d613b0b565b90919796613b43898761213f565b5180151580613b69575b61374e5781811161372457808492039801980190919091613a6a565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613bb0575b5015613b4d565b908982813d8311613bde575b613bc68183612004565b810103126136e65750613bd890612826565b38613ba9565b503d613bbc565b9594505050905060005b828110613bff5750505050600090565b613c09818361213f565b5161374e578301613bef565b611f749550613c28915061384190612132565b51916140f6565b909391845194600190818714613dea5773ffffffffffffffffffffffffffffffffffffffff60208095015116918215613db9579660009788915b808310613d095750505091839291613cb29492886040518097819582947f88e5b2d900000000000000000000000000000000000000000000000000000000845260048401613534565b03925af1908115610a3c57600091613cd5575b50905015613ad7576138f5575090565b82813d8311613d02575b613ce98183612004565b810103126136e65750613cfb90612826565b8038613cc5565b503d613cdf565b90919897613d178a8761213f565b5180151580613d3d575b61374e5781811161372457808492039901990190919091613c69565b50604080517fce46e04600000000000000000000000000000000000000000000000000000000815289816004818b5afa9182156137f45750600091613d84575b5015613d21565b908982813d8311613db2575b613d9a8183612004565b810103126136e65750613dac90612826565b38613d7d565b503d613d90565b969550505091505060005b828110613dd45750505050600090565b613dde818361213f565b5161374e578301613dc4565b611f749650613e00915061384190959495612132565b5191614270565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f815784151580613f07575b61374e5783851161372457613e83829186946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091613ed3575b50905015613ea95781611f7491036143c0565b60046040517fbd8ba84d000000000000000000000000000000000000000000000000000000008152fd5b82813d8311613f00575b613ee78183612004565b810103126136e65750613ef990612826565b8038613e96565b503d613edd565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c57600091613f4c575b5015613e35565b908382813d8311613f7a575b613f628183612004565b810103126136e65750613f7490612826565b38613f45565b503d613f58565b5050505061374e57600090565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e8578515158061406e575b61374e578486116137245761400a829187946040519586809481937fe60c35050000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c5760009161403a575b50905015613ea957829061403057505090565b611f7491036143c0565b82813d8311614067575b61404e8183612004565b810103126136e6575061406090612826565b803861401d565b503d614044565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c576000916140b3575b5015613fbc565b908382813d83116140e1575b6140c98183612004565b810103126136e657506140db90612826565b386140ac565b503d6140bf565b505050505061374e57600090565b92919273ffffffffffffffffffffffffffffffffffffffff602080920151168015613f8157841515806141f6575b61374e5783851161372457614172829186946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c576000916141c2575b509050156141985781611f7491036143c0565b60046040517fccf3bb27000000000000000000000000000000000000000000000000000000008152fd5b82813d83116141ef575b6141d68183612004565b810103126136e657506141e890612826565b8038614185565b503d6141cc565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161423b575b5015614124565b908382813d8311614269575b6142518183612004565b810103126136e6575061426390612826565b38614234565b503d614247565b93919373ffffffffffffffffffffffffffffffffffffffff6020809201511680156140e85785151580614346575b61374e57848611613724576142ec829187946040519586809481937fe49617e10000000000000000000000000000000000000000000000000000000083528760048401526024830190611edb565b03925af1908115610a3c57600091614312575b5090501561419857829061403057505090565b82813d831161433f575b6143268183612004565b810103126136e6575061433890612826565b80386142ff565b503d61431c565b506040517fce46e0460000000000000000000000000000000000000000000000000000000081528281600481855afa908115610a3c5760009161438b575b501561429e565b908382813d83116143b9575b6143a18183612004565b810103126136e657506143b390612826565b38614384565b503d614397565b806143c85750565b80471061449157600080808093335af13d1561448c573d6143e881612045565b906143f66040519283612004565b8152600060203d92013e5b1561440857565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152fd5b614401565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152fd5b906144f9906127d7565b60009283925b80518410156145545793614513848661213f565b519160005b83518110156145435761452b818561213f565b51614536848761213f565b5260019283019201614518565b5090946001909401939091506144ff565b509250905090565b6000818152600260205267ffffffffffffffff90816040822054166145d8577f5aafceeb1c7ad58e4a84898bdee37c02c0fc46e7d24e6b60e8209449f183459f91838252600260205260408220941693847fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905580a3565b60046040517f2e267946000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016301480614700575b1561466a577f000000000000000000000000000000000000000000000000000000000000000090565b60405160208101907f000000000000000000000000000000000000000000000000000000000000000082527f000000000000000000000000000000000000000000000000000000000000000060408201527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260a081526146fa81611f93565b51902090565b507f00000000000000000000000000000000000000000000000000000000000000004614614641565b6020908181015190604080938183015192606081019173ffffffffffffffffffffffffffffffffffffffff948584511660005260008252846000209283549360018501905551928688511667ffffffffffffffff988985820151168882015115159060806060840151930151878151910120938a5198888a019b7f6fddd0d8bc416c66f4749c05d7b3e4dc45adc924f7eaaf3ef86c361f481e27c28d528a01526060890152608088015260a087015260c086015260e0850152610100908185015283526101208301968388109088111761094857614814869561482894614830998b52519020614a9a565b918860ff83511691830151920151926149fe565b949094614865565b511691160361483c5750565b600490517f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b60058110156149cf57806148765750565b600181036148dc5760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152fd5b600281036149425760646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152fd5b60031461494b57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311614a8e5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15614a8157815173ffffffffffffffffffffffffffffffffffffffff811615614a7b579190565b50600190565b50604051903d90823e3d90fd5b50505050600090600390565b614aa2614602565b906040519060208201927f1901000000000000000000000000000000000000000000000000000000000000845260228301526042820152604281526080810181811067ffffffffffffffff8211176109485760405251902090565b602081015160409182810151916060820173ffffffffffffffffffffffffffffffffffffffff9283825116600052600060205285600020908154916001830190555192519086519160208301947ff4d55e0bcbb226b4aaff947cf2f41ec6d6dcaecd1306fbe6f9b8746ad288b48e865288840152606083015260808201526080815260a081019481861067ffffffffffffffff87111761094857614bae859461482893614830988a52519020614a9a565b9060ff815116886020830151920151926149fe56fea164736f6c6343000811000a"; + +type EASConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: EASConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class EAS__factory extends ContractFactory { + constructor(...args: EASConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + registry: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(registry, overrides || {}) as Promise; + } + override getDeployTransaction( + registry: PromiseOrValue, + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(registry, overrides || {}); + } + override attach(address: string): EAS { + return super.attach(address) as EAS; + } + override connect(signer: Signer): EAS__factory { + return super.connect(signer) as EAS__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): EASInterface { + return new utils.Interface(_abi) as EASInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): EAS { + return new Contract(address, _abi, signerOrProvider) as EAS; + } +} diff --git a/deployments/goerli/types/factories/contracts/SchemaRegistry__factory.ts b/deployments/sepolia/types/factories/contracts/SchemaRegistry__factory.ts similarity index 67% rename from deployments/goerli/types/factories/contracts/SchemaRegistry__factory.ts rename to deployments/sepolia/types/factories/contracts/SchemaRegistry__factory.ts index 1ae3c99..5664bf8 100644 --- a/deployments/goerli/types/factories/contracts/SchemaRegistry__factory.ts +++ b/deployments/sepolia/types/factories/contracts/SchemaRegistry__factory.ts @@ -1,130 +1,134 @@ /* Autogenerated file. Do not edit manually. */ - /* tslint:disable */ - /* eslint-disable */ -import type { PromiseOrValue } from '../../common'; -import type { SchemaRegistry, SchemaRegistryInterface } from '../../contracts/SchemaRegistry'; -import type { Provider, TransactionRequest } from '@ethersproject/providers'; -import { Contract, ContractFactory, Overrides, Signer, utils } from 'ethers'; +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../../common"; +import type { + SchemaRegistry, + SchemaRegistryInterface, +} from "../../contracts/SchemaRegistry"; const _abi = [ { inputs: [], - name: 'AlreadyExists', - type: 'error' + name: "AlreadyExists", + type: "error", }, { anonymous: false, inputs: [ { indexed: true, - internalType: 'bytes32', - name: 'uuid', - type: 'bytes32' + internalType: "bytes32", + name: "uuid", + type: "bytes32", }, { indexed: false, - internalType: 'address', - name: 'registerer', - type: 'address' - } + internalType: "address", + name: "registerer", + type: "address", + }, ], - name: 'Registered', - type: 'event' + name: "Registered", + type: "event", }, { inputs: [], - name: 'VERSION', + name: "VERSION", outputs: [ { - internalType: 'string', - name: '', - type: 'string' - } + internalType: "string", + name: "", + type: "string", + }, ], - stateMutability: 'view', - type: 'function' + stateMutability: "view", + type: "function", }, { inputs: [ { - internalType: 'bytes32', - name: 'uuid', - type: 'bytes32' - } + internalType: "bytes32", + name: "uuid", + type: "bytes32", + }, ], - name: 'getSchema', + name: "getSchema", outputs: [ { components: [ { - internalType: 'bytes32', - name: 'uuid', - type: 'bytes32' + internalType: "bytes32", + name: "uuid", + type: "bytes32", }, { - internalType: 'contract ISchemaResolver', - name: 'resolver', - type: 'address' + internalType: "contract ISchemaResolver", + name: "resolver", + type: "address", }, { - internalType: 'bool', - name: 'revocable', - type: 'bool' + internalType: "bool", + name: "revocable", + type: "bool", }, { - internalType: 'string', - name: 'schema', - type: 'string' - } + internalType: "string", + name: "schema", + type: "string", + }, ], - internalType: 'struct SchemaRecord', - name: '', - type: 'tuple' - } + internalType: "struct SchemaRecord", + name: "", + type: "tuple", + }, ], - stateMutability: 'view', - type: 'function' + stateMutability: "view", + type: "function", }, { inputs: [ { - internalType: 'string', - name: 'schema', - type: 'string' + internalType: "string", + name: "schema", + type: "string", }, { - internalType: 'contract ISchemaResolver', - name: 'resolver', - type: 'address' + internalType: "contract ISchemaResolver", + name: "resolver", + type: "address", }, { - internalType: 'bool', - name: 'revocable', - type: 'bool' - } + internalType: "bool", + name: "revocable", + type: "bool", + }, ], - name: 'register', + name: "register", outputs: [ { - internalType: 'bytes32', - name: '', - type: 'bytes32' - } + internalType: "bytes32", + name: "", + type: "bytes32", + }, ], - stateMutability: 'nonpayable', - type: 'function' - } + stateMutability: "nonpayable", + type: "function", + }, ] as const; const _bytecode = - '0x60808060405234610016576107b8908161001c8239f35b600080fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323200000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a'; + "0x60808060405234610016576107b8908161001c8239f35b600080fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816360d7a2781461029757508063a2ea7c6e146101045763ffa1ad741461004657600080fd5b3461010057817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610100578051918183019083821067ffffffffffffffff8311176100d45750926100d093825282527f302e323400000000000000000000000000000000000000000000000000000000602083015251918291602083526020830190610689565b0390f35b806041867f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b5080fd5b503461010057602092837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576060808351610144816106cc565b85815285878201528585820152015235825281835280822090805191610169836106cc565b805483526001918282015491868501600273ffffffffffffffffffffffffffffffffffffffff92838616835260ff8589019660a01c16151586520188845196898354936101b585610758565b808b52948381169081156102505750600114610214575b50505050506101e1856100d097980386610717565b606087019485528251978897818952519088015251169085015251151560608401525160808084015260a0830190610689565b908094939b50528983205b82841061023d575050508501909601956101e1886100d087386101cc565b80548985018c0152928a0192810161021f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016858c01525050505090151560051b86010196506101e1886100d087386101cc565b8280fd5b92939050346106625760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126106625780359067ffffffffffffffff80831161065e573660238401121561065e57828201359181831161065a57366024848601011161065a576024359673ffffffffffffffffffffffffffffffffffffffff9182891680990361010057604435978815158099036102935761033b816106cc565b8281526020998a8201908152888201998a52885197848c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe099818b601f83011601610386908d610717565b808c5280828d019460240185378b0101528b6060840199808b5283518d5115158d519384938185019687915180926103bd92610666565b84019260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169083015260f81b6034820152036015810182526035016104059082610717565b519020998a8552848c5289852054610632579082918b600294528b8652858d528a8620925183556001968784019251167fffffffffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000084549351151560a01b1692161717905501955190815194851161060657506104948654610758565b601f81116105c0575b508891601f8511600114610545578495509084939492919361051a575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91921b9260031b1c19161790555b817f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c848351338152a251908152f35b015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff386104ba565b9294849081168785528a8520945b8b888383106105a95750505010610572575b505050811b0190556104eb565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610565565b868601518855909601959485019487935001610553565b868352898320601f860160051c8101918b87106105fc575b601f0160051c019084905b8281106105f157505061049d565b8481550184906105e3565b90915081906105d8565b8260416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b838a517f23369fa6000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8380fd5b60005b8381106106795750506000910152565b8181015183820152602001610669565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936106c581518092818752878088019101610666565b0116010190565b6080810190811067ffffffffffffffff8211176106e857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176106e857604052565b90600182811c921680156107a1575b602083101461077257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161076756fea164736f6c6343000811000a"; -type SchemaRegistryConstructorParams = [signer?: Signer] | ConstructorParameters; +type SchemaRegistryConstructorParams = + | [signer?: Signer] + | ConstructorParameters; -const isSuperArgs = (xs: SchemaRegistryConstructorParams): xs is ConstructorParameters => - xs.length > 1; +const isSuperArgs = ( + xs: SchemaRegistryConstructorParams +): xs is ConstructorParameters => xs.length > 1; export class SchemaRegistry__factory extends ContractFactory { constructor(...args: SchemaRegistryConstructorParams) { @@ -135,10 +139,14 @@ export class SchemaRegistry__factory extends ContractFactory { } } - override deploy(overrides?: Overrides & { from?: PromiseOrValue }): Promise { + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { return super.deploy(overrides || {}) as Promise; } - override getDeployTransaction(overrides?: Overrides & { from?: PromiseOrValue }): TransactionRequest { + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { return super.getDeployTransaction(overrides || {}); } override attach(address: string): SchemaRegistry { @@ -153,7 +161,10 @@ export class SchemaRegistry__factory extends ContractFactory { static createInterface(): SchemaRegistryInterface { return new utils.Interface(_abi) as SchemaRegistryInterface; } - static connect(address: string, signerOrProvider: Signer | Provider): SchemaRegistry { + static connect( + address: string, + signerOrProvider: Signer | Provider + ): SchemaRegistry { return new Contract(address, _abi, signerOrProvider) as SchemaRegistry; } } diff --git a/hardhat.config.ts b/hardhat.config.ts index f8fad74..e2fd6f3 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -16,9 +16,8 @@ import 'solidity-coverage'; interface EnvOptions { ETHEREUM_PROVIDER_URL?: string; - ETHEREUM_GOERLI_PROVIDER_URL?: string; + ETHEREUM_SEPOLIA_PROVIDER_URL?: string; ETHERSCAN_API_KEY?: string; - GAS_PRICE?: number | 'auto'; PROFILE?: boolean; TENDERLY_FORK_ID?: string; TENDERLY_PROJECT?: string; @@ -28,9 +27,8 @@ interface EnvOptions { const { ETHEREUM_PROVIDER_URL = '', - ETHEREUM_GOERLI_PROVIDER_URL = '', + ETHEREUM_SEPOLIA_PROVIDER_URL = '', ETHERSCAN_API_KEY, - GAS_PRICE: gasPrice, PROFILE: isProfiling, TENDERLY_FORK_ID = '', TENDERLY_PROJECT = '', @@ -71,14 +69,13 @@ const config: HardhatUserConfig = { [DeploymentNetwork.Mainnet]: { chainId: 1, url: ETHEREUM_PROVIDER_URL, - gasPrice: gasPrice || 'auto', saveDeployments: true, live: true }, - [DeploymentNetwork.Goerli]: { - chainId: 5, - url: ETHEREUM_GOERLI_PROVIDER_URL, + [DeploymentNetwork.Sepolia]: { + chainId: 11155111, + url: ETHEREUM_SEPOLIA_PROVIDER_URL, saveDeployments: true, live: true }, diff --git a/package.json b/package.json index e22b2ba..330f5b3 100755 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "!/dist/typechain-types/contracts/tests/**/*", "!/dist/typechain-types/factories/contracts/tests/**/*", "/deployments/mainnet/**/*", - "/deployments/goerli/**/*" + "/deployments/sepolia/**/*" ], "scripts": { "compile": "hardhat compile", @@ -31,10 +31,10 @@ "deploy:prepare": "rm -rf ./node_modules && rm yarn.lock && yarn && yarn recompile", "deploy:prepare:fork": "rm -rf deployments/tenderly && cp -rf deployments/mainnet/. deployments/tenderly", "deploy:mainnet": "HARDHAT_NETWORK=mainnet hardhat deploy", - "deploy:goerli": "HARDHAT_NETWORK=goerli hardhat deploy", + "deploy:sepolia": "HARDHAT_NETWORK=sepolia hardhat deploy", "deploy:fork": "yarn deploy:prepare:fork && HARDHAT_NETWORK=tenderly hardhat deploy", "verify:mainnet": "HARDHAT_NETWORK=mainnet hardhat etherscan-verify --license MIT", - "verify:goerli": "HARDHAT_NETWORK=goerli hardhat etherscan-verify --license MIT", + "verify:sepolia": "HARDHAT_NETWORK=sepolia hardhat etherscan-verify --license MIT", "lint": "yarn lint:sol && yarn lint:ts", "lint:sol": "solhint --max-warnings 0 contracts/**/*.sol", "lint:ts": "yarn eslint components deploy test utils", diff --git a/utils/Constants.ts b/utils/Constants.ts index a0f687d..2729a5b 100644 --- a/utils/Constants.ts +++ b/utils/Constants.ts @@ -6,7 +6,7 @@ const { export enum DeploymentNetwork { Mainnet = 'mainnet', - Goerli = 'goerli', + Sepolia = 'sepolia', Hardhat = 'hardhat', Tenderly = 'tenderly' } diff --git a/utils/Deploy.ts b/utils/Deploy.ts index 6c63611..f853630 100644 --- a/utils/Deploy.ts +++ b/utils/Deploy.ts @@ -22,9 +22,13 @@ const { interface EnvOptions { TEST_FORK?: boolean; + MAX_FEE: number; + MAX_PRIORITY_FEE: number; } -const { TEST_FORK: isTestFork }: EnvOptions = process.env as any as EnvOptions; +const { TEST_FORK: isTestFork, MAX_FEE, MAX_PRIORITY_FEE }: EnvOptions = process.env as any as EnvOptions; +const maxFee = MAX_FEE ? BigNumber.from(MAX_FEE) : undefined; +const maxPriorityFee = MAX_PRIORITY_FEE ? BigNumber.from(MAX_PRIORITY_FEE) : undefined; export enum NewInstanceName { EAS = 'EAS', @@ -55,9 +59,9 @@ export const DeployedContracts = { export const isTenderlyFork = () => getNetworkName() === DeploymentNetwork.Tenderly; export const isMainnetFork = () => isTenderlyFork(); export const isMainnet = () => getNetworkName() === DeploymentNetwork.Mainnet || isMainnetFork(); -export const isGoerli = () => getNetworkName() === DeploymentNetwork.Goerli; -export const isTestnet = () => isGoerli(); -export const isLive = () => (isMainnet() && !isMainnetFork()) || isGoerli(); +export const isSepolia = () => getNetworkName() === DeploymentNetwork.Sepolia; +export const isTestnet = () => isSepolia(); +export const isLive = () => (isMainnet() && !isMainnetFork()) || isSepolia(); export const getDeploymentDir = () => { return path.join(config.paths.deployments, getNetworkName()); @@ -215,6 +219,8 @@ export const deploy = async (options: DeployOptions) => { from, value, args, + maxFeePerGas: maxFee, + maxPriorityFeePerGas: maxPriorityFee, waitConfirmations: WAIT_CONFIRMATIONS, log: true }); @@ -252,7 +258,14 @@ export const execute = async (options: ExecuteOptions) => { return executeTransaction( name, - { from, value, waitConfirmations: WAIT_CONFIRMATIONS, log: true }, + { + from, + value, + maxFeePerGas: maxFee, + maxPriorityFeePerGas: maxPriorityFee, + waitConfirmations: WAIT_CONFIRMATIONS, + log: true + }, methodName, ...(args ?? []) );