diff --git a/README.md b/README.md
index 819a048c..57f8c8b2 100644
--- a/README.md
+++ b/README.md
@@ -71,6 +71,7 @@ The main contracts (i.e. the "registries") and the helpers contracts are deploye
- Linea Mainnet
- Arbitrum Testnet
- Arbitrum Mainnet
+- Arbitrum Nova
Here are the addresses on those networks:
@@ -164,12 +165,48 @@ Here are the addresses on those networks:
+
+ Arbitrum Nova
+
+- Router =
+ [0xC81B5149D9Cd49195D00EFb16FED89f3Ba78E03B](https://nova.arbiscan.io/address/0xc81b5149d9cd49195d00efb16fed89f3ba78e03b)
+- AttestationRegistry =
+ [0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8](https://nova.arbiscan.io/address/0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8)
+- ModuleRegistry =
+ [0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3](https://nova.arbiscan.io/address/0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3)
+- PortalRegistry =
+ [0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38](https://nova.arbiscan.io/address/0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38)
+- SchemaRegistry =
+ [0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB](https://nova.arbiscan.io/address/0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB)
+- AttestationReader =
+ [0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c](https://nova.arbiscan.io/address/0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c)
+
+
+
+ Arbitrum Nova
+
+- Router =
+ [0xC81B5149D9Cd49195D00EFb16FED89f3Ba78E03B](https://nova.arbiscan.io/address/0xc81b5149d9cd49195d00efb16fed89f3ba78e03b)
+- AttestationRegistry =
+ [0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8](https://nova.arbiscan.io/address/0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8)
+- ModuleRegistry =
+ [0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3](https://nova.arbiscan.io/address/0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3)
+- PortalRegistry =
+ [0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38](https://nova.arbiscan.io/address/0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38)
+- SchemaRegistry =
+ [0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB](https://nova.arbiscan.io/address/0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB)
+- AttestationReader =
+ [0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c](https://nova.arbiscan.io/address/0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c)
+
+
+
## Subgraphs Addresses
- [Linea Testnet](https://api.goldsky.com/api/public/project_clqghnrbp9nx201wtgylv8748/subgraphs/verax/subgraph-testnet/gn)
- [Linea Mainnet](https://graph-query.linea.build/subgraphs/name/Consensys/linea-attestation-registry/graphql)
- [Arbitrum Goerli](https://api.thegraph.com/subgraphs/name/cliqueofficial/verax-arbitrum-goerli)
- [Arbitrum Mainnet](https://api.thegraph.com/subgraphs/name/cliqueofficial/verax-arbitrum)
+- [Arbitrum Nova](https://api.goldsky.com/api/public/project_clr9aj9alwgwg01q7ci1rh781/subgraphs/verax-arbitrum-nova/0.0.5/gn)
## License
diff --git a/contracts/.openzeppelin/arbitrum-nova.json b/contracts/.openzeppelin/arbitrum-nova.json
new file mode 100644
index 00000000..f0e9be9c
--- /dev/null
+++ b/contracts/.openzeppelin/arbitrum-nova.json
@@ -0,0 +1,955 @@
+{
+ "manifestVersion": "3.2",
+ "admin": {
+ "address": "0xF318A96f3A7AB731CCF837cb99A82a4a5d973e96",
+ "txHash": "0x08993a854d4381837715cfa190b699a86a7e86ce7e4905aa590f7d2551ad01d7"
+ },
+ "proxies": [
+ {
+ "address": "0xC81B5149D9Cd49195D00EFb16FED89f3Ba78E03B",
+ "txHash": "0x785aaa879e29731cc7ee57f412597642c98448f79dd22a79f629ef0773be1f16",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8",
+ "txHash": "0x05ee92525d3b2c79b684562f4bd6acb126338939a2c044c4b712165aa8bc5b70",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3",
+ "txHash": "0x89c1eb8595e045e312457acad456c857ca429a452c34125d6371a230b96a2c82",
+ "kind": "transparent"
+ },
+ {
+ "address": "0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38",
+ "txHash": "0xe63780a4948181ec3e340ae0ca427d6f11091e9e1b49635a0cbb5b2eec1aed6d",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB",
+ "txHash": "0xdc5d5085485f234f5754ed060b247a5a35731a64c7ec7e526f6344e0975982d2",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c",
+ "txHash": "0xc3aa5dfc8c185aa12eb36e304d7d5426a213b19ceed674513319f7ded2615714",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "4353fbe787c13443291bba3d18e906853909285ba948d10f4d95994940b68c97": {
+ "address": "0x4B226C4Ca8b303cF38B8927940A8a1B4E452D66A",
+ "txHash": "0x3d032d18b9974500ccb943667c4e74de8cb795e3e56c2a5b438c67ae3ecc3fb7",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "ATTESTATION_REGISTRY",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_address",
+ "contract": "Router",
+ "src": "src/Router.sol:13"
+ },
+ {
+ "label": "MODULE_REGISTRY",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_address",
+ "contract": "Router",
+ "src": "src/Router.sol:14"
+ },
+ {
+ "label": "PORTAL_REGISTRY",
+ "offset": 0,
+ "slot": "103",
+ "type": "t_address",
+ "contract": "Router",
+ "src": "src/Router.sol:15"
+ },
+ {
+ "label": "SCHEMA_REGISTRY",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_address",
+ "contract": "Router",
+ "src": "src/Router.sol:16"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "afc9287c19cb1b830999d2016348e104b2143101ed97ea26cf1c1b48849ca551": {
+ "address": "0xF2FaAE8f4A14BED20a3Abc011a5baaB76aeCDcb6",
+ "txHash": "0x6e604cfd76157a23c1eb5bc6d702f0e6042dba4816da366cfee74e2f5e9213d6",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "router",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_contract(IRouter)7410",
+ "contract": "AttestationRegistry",
+ "src": "src/AttestationRegistry.sol:17"
+ },
+ {
+ "label": "version",
+ "offset": 20,
+ "slot": "101",
+ "type": "t_uint16",
+ "contract": "AttestationRegistry",
+ "src": "src/AttestationRegistry.sol:19"
+ },
+ {
+ "label": "attestationIdCounter",
+ "offset": 22,
+ "slot": "101",
+ "type": "t_uint32",
+ "contract": "AttestationRegistry",
+ "src": "src/AttestationRegistry.sol:20"
+ },
+ {
+ "label": "attestations",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_mapping(t_bytes32,t_struct(Attestation)8775_storage)",
+ "contract": "AttestationRegistry",
+ "src": "src/AttestationRegistry.sol:22"
+ },
+ {
+ "label": "chainPrefix",
+ "offset": 0,
+ "slot": "103",
+ "type": "t_uint256",
+ "contract": "AttestationRegistry",
+ "src": "src/AttestationRegistry.sol:24"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_bytes_storage": {
+ "label": "bytes",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IRouter)7410": {
+ "label": "contract IRouter",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_bytes32,t_struct(Attestation)8775_storage)": {
+ "label": "mapping(bytes32 => struct Attestation)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Attestation)8775_storage": {
+ "label": "struct Attestation",
+ "members": [
+ {
+ "label": "attestationId",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "schemaId",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "replacedBy",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "attester",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "portal",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "attestedDate",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "4"
+ },
+ {
+ "label": "expirationDate",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "revocationDate",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "5"
+ },
+ {
+ "label": "version",
+ "type": "t_uint16",
+ "offset": 16,
+ "slot": "5"
+ },
+ {
+ "label": "revoked",
+ "type": "t_bool",
+ "offset": 18,
+ "slot": "5"
+ },
+ {
+ "label": "subject",
+ "type": "t_bytes_storage",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "attestationData",
+ "type": "t_bytes_storage",
+ "offset": 0,
+ "slot": "7"
+ }
+ ],
+ "numberOfBytes": "256"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "855a9f1d8e96c2bd24b6a929c90e3681a27dfdf6e80bf08bdaf0de5f33e7accf": {
+ "address": "0x80c2E4937157C104ACda9b64F1AD8F2EFf808d77",
+ "txHash": "0x4481571891995c765276308e1f91bb5c167bd0a33047e054f667f69841b0608d",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "router",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_contract(IRouter)7410",
+ "contract": "ModuleRegistry",
+ "src": "src/ModuleRegistry.sol:19"
+ },
+ {
+ "label": "modules",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_mapping(t_address,t_struct(Module)8807_storage)",
+ "contract": "ModuleRegistry",
+ "src": "src/ModuleRegistry.sol:21"
+ },
+ {
+ "label": "moduleAddresses",
+ "offset": 0,
+ "slot": "103",
+ "type": "t_array(t_address)dyn_storage",
+ "contract": "ModuleRegistry",
+ "src": "src/ModuleRegistry.sol:23"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_address)dyn_storage": {
+ "label": "address[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_contract(IRouter)7410": {
+ "label": "contract IRouter",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(Module)8807_storage)": {
+ "label": "mapping(address => struct Module)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Module)8807_storage": {
+ "label": "struct Module",
+ "members": [
+ {
+ "label": "moduleAddress",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "description",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "6a363cbbef1041962fe59a76993db35c8e1078fc08b62ce3c7093407d7e8a39d": {
+ "address": "0x337F01f3DA4DE2F99d5B9859f396050b0BC9C4a8",
+ "txHash": "0x6d6883953bbba09e99c59b67f14570fda7ae84326abcd5cb046ad27069c66d3e",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "router",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_contract(IRouter)7410",
+ "contract": "PortalRegistry",
+ "src": "src/PortalRegistry.sol:20"
+ },
+ {
+ "label": "portals",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_mapping(t_address,t_struct(Portal)8800_storage)",
+ "contract": "PortalRegistry",
+ "src": "src/PortalRegistry.sol:22"
+ },
+ {
+ "label": "issuers",
+ "offset": 0,
+ "slot": "103",
+ "type": "t_mapping(t_address,t_bool)",
+ "contract": "PortalRegistry",
+ "src": "src/PortalRegistry.sol:24"
+ },
+ {
+ "label": "portalAddresses",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_array(t_address)dyn_storage",
+ "contract": "PortalRegistry",
+ "src": "src/PortalRegistry.sol:26"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_address)dyn_storage": {
+ "label": "address[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_contract(IRouter)7410": {
+ "label": "contract IRouter",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_struct(Portal)8800_storage)": {
+ "label": "mapping(address => struct Portal)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Portal)8800_storage": {
+ "label": "struct Portal",
+ "members": [
+ {
+ "label": "id",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "ownerAddress",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "modules",
+ "type": "t_array(t_address)dyn_storage",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "isRevocable",
+ "type": "t_bool",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "description",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "ownerName",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "6"
+ }
+ ],
+ "numberOfBytes": "224"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "68d0630cb0ae02e0e7d37f7e07193d62999ecb9070d3ca38b245f3954a34b089": {
+ "address": "0xd23BA3E22dC9728B6b1CC7250040C34423B6Db94",
+ "txHash": "0x2825e9f4e5f5624ac23c27a1544b2ab672d660daeb4abaf20a4df61a0f5065d1",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "router",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_contract(IRouter)7410",
+ "contract": "SchemaRegistry",
+ "src": "src/SchemaRegistry.sol:16"
+ },
+ {
+ "label": "schemas",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_mapping(t_bytes32,t_struct(Schema)8784_storage)",
+ "contract": "SchemaRegistry",
+ "src": "src/SchemaRegistry.sol:18"
+ },
+ {
+ "label": "schemaIds",
+ "offset": 0,
+ "slot": "103",
+ "type": "t_array(t_bytes32)dyn_storage",
+ "contract": "SchemaRegistry",
+ "src": "src/SchemaRegistry.sol:20"
+ },
+ {
+ "label": "schemasIssuers",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "SchemaRegistry",
+ "src": "src/SchemaRegistry.sol:22"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_bytes32)dyn_storage": {
+ "label": "bytes32[]",
+ "numberOfBytes": "32"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IRouter)7410": {
+ "label": "contract IRouter",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(Schema)8784_storage)": {
+ "label": "mapping(bytes32 => struct Schema)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(Schema)8784_storage": {
+ "label": "struct Schema",
+ "members": [
+ {
+ "label": "name",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "description",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "context",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "schema",
+ "type": "t_string_storage",
+ "offset": 0,
+ "slot": "3"
+ }
+ ],
+ "numberOfBytes": "128"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "cc3bd5ce0f70ee7ad8fd47bda375d640dc7035da4746a94f0ccf30df96358f53": {
+ "address": "0x1Cc982044486fA5620C1b57B2E666755dE340A3F",
+ "txHash": "0xba6c2a6808146e6d46f9dc20435b21271af2014f3b0cbc453bbbb979e48fcc88",
+ "layout": {
+ "solcVersion": "0.8.21",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:63",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol:68"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "router",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_contract(IRouter)7410",
+ "contract": "AttestationReader",
+ "src": "src/AttestationReader.sol:17"
+ },
+ {
+ "label": "easRegistry",
+ "offset": 0,
+ "slot": "102",
+ "type": "t_contract(IEAS)7361",
+ "contract": "AttestationReader",
+ "src": "src/AttestationReader.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_contract(IEAS)7361": {
+ "label": "contract IEAS",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IRouter)7410": {
+ "label": "contract IRouter",
+ "numberOfBytes": "20"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ }
+ }
+}
diff --git a/contracts/deployments/arbitrum-nova/AttestationReader.json b/contracts/deployments/arbitrum-nova/AttestationReader.json
new file mode 100644
index 00000000..ea215943
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/AttestationReader.json
@@ -0,0 +1,215 @@
+{
+ "address": "0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "EASAddressInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RouterInvalid",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "easRegistry",
+ "outputs": [
+ {
+ "internalType": "contract IEAS",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "uid",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getAttestation",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "uid",
+ "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": "refUID",
+ "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": "attestation",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "router",
+ "outputs": [
+ {
+ "internalType": "contract IRouter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_easRegistryAddress",
+ "type": "address"
+ }
+ ],
+ "name": "updateEASRegistryAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_router",
+ "type": "address"
+ }
+ ],
+ "name": "updateRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/deployments/arbitrum-nova/AttestationRegistry.json b/contracts/deployments/arbitrum-nova/AttestationRegistry.json
new file mode 100644
index 00000000..415f5d69
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/AttestationRegistry.json
@@ -0,0 +1,658 @@
+{
+ "address": "0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "AlreadyRevoked",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ArrayLengthMismatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AttestationDataFieldEmpty",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AttestationNotAttested",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AttestationNotRevocable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AttestationSubjectFieldEmpty",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyAttestingPortal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyPortal",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RouterInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SchemaNotRegistered",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AttestationRegistered",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "replacedBy",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AttestationReplaced",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AttestationRevoked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint16",
+ "name": "version",
+ "type": "uint16"
+ }
+ ],
+ "name": "VersionUpdated",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload",
+ "name": "attestationPayload",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "attester",
+ "type": "address"
+ }
+ ],
+ "name": "attest",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "accounts",
+ "type": "address[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "ids",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "balanceOfBatch",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload[]",
+ "name": "attestationsPayloads",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address",
+ "name": "attester",
+ "type": "address"
+ }
+ ],
+ "name": "bulkAttest",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32[]",
+ "name": "attestationIds",
+ "type": "bytes32[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload[]",
+ "name": "attestationPayloads",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address",
+ "name": "attester",
+ "type": "address"
+ }
+ ],
+ "name": "bulkReplace",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32[]",
+ "name": "attestationIds",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "bulkRevoke",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getAttestation",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "replacedBy",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "attester",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "portal",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "attestedDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "revocationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint16",
+ "name": "version",
+ "type": "uint16"
+ },
+ {
+ "internalType": "bool",
+ "name": "revoked",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct Attestation",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getAttestationIdCounter",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getVersionNumber",
+ "outputs": [
+ {
+ "internalType": "uint16",
+ "name": "",
+ "type": "uint16"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "incrementVersionNumber",
+ "outputs": [
+ {
+ "internalType": "uint16",
+ "name": "",
+ "type": "uint16"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isRegistered",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "portalId",
+ "type": "address"
+ }
+ ],
+ "name": "isRevocable",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload[]",
+ "name": "attestationsPayloads",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "address",
+ "name": "portal",
+ "type": "address"
+ }
+ ],
+ "name": "massImport",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload",
+ "name": "attestationPayload",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "attester",
+ "type": "address"
+ }
+ ],
+ "name": "replace",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "attestationId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "revoke",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "router",
+ "outputs": [
+ {
+ "internalType": "contract IRouter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_router",
+ "type": "address"
+ }
+ ],
+ "name": "updateRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/deployments/arbitrum-nova/ModuleRegistry.json b/contracts/deployments/arbitrum-nova/ModuleRegistry.json
new file mode 100644
index 00000000..69cdc17e
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/ModuleRegistry.json
@@ -0,0 +1,395 @@
+{
+ "address": "0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "AttestationPayloadMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleAddressInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleAlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleNameMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleNotRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ModuleValidationPayloadMismatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyIssuer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RouterInvalid",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "moduleAddress",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleRegistered",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "modulesAddresses",
+ "type": "address[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload[]",
+ "name": "attestationsPayloads",
+ "type": "tuple[]"
+ },
+ {
+ "internalType": "bytes[][]",
+ "name": "validationPayloads",
+ "type": "bytes[][]"
+ }
+ ],
+ "name": "bulkRunModules",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getModulesNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "contractAddress",
+ "type": "address"
+ }
+ ],
+ "name": "isContractAddress",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "moduleAddress",
+ "type": "address"
+ }
+ ],
+ "name": "isRegistered",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "moduleAddresses",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "id",
+ "type": "address"
+ }
+ ],
+ "name": "modules",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "moduleAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "address",
+ "name": "moduleAddress",
+ "type": "address"
+ }
+ ],
+ "name": "register",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "router",
+ "outputs": [
+ {
+ "internalType": "contract IRouter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "modulesAddresses",
+ "type": "address[]"
+ },
+ {
+ "components": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "expirationDate",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes",
+ "name": "subject",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "attestationData",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AttestationPayload",
+ "name": "attestationPayload",
+ "type": "tuple"
+ },
+ {
+ "internalType": "bytes[]",
+ "name": "validationPayloads",
+ "type": "bytes[]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "runModules",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_router",
+ "type": "address"
+ }
+ ],
+ "name": "updateRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/deployments/arbitrum-nova/PortalRegistry.json b/contracts/deployments/arbitrum-nova/PortalRegistry.json
new file mode 100644
index 00000000..5195e035
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/PortalRegistry.json
@@ -0,0 +1,403 @@
+{
+ "address": "0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyIssuer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalAddressInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalAlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalDescriptionMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalNameMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalNotRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PortalOwnerNameMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RouterInvalid",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "issuerAddress",
+ "type": "address"
+ }
+ ],
+ "name": "IssuerAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "issuerAddress",
+ "type": "address"
+ }
+ ],
+ "name": "IssuerRemoved",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "portalAddress",
+ "type": "address"
+ }
+ ],
+ "name": "PortalRegistered",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address[]",
+ "name": "modules",
+ "type": "address[]"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "bool",
+ "name": "isRevocable",
+ "type": "bool"
+ },
+ {
+ "internalType": "string",
+ "name": "ownerName",
+ "type": "string"
+ }
+ ],
+ "name": "deployDefaultPortal",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "id",
+ "type": "address"
+ }
+ ],
+ "name": "getPortalByAddress",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "id",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "ownerAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "address[]",
+ "name": "modules",
+ "type": "address[]"
+ },
+ {
+ "internalType": "bool",
+ "name": "isRevocable",
+ "type": "bool"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "ownerName",
+ "type": "string"
+ }
+ ],
+ "internalType": "struct Portal",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getPortalsCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "issuer",
+ "type": "address"
+ }
+ ],
+ "name": "isIssuer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "id",
+ "type": "address"
+ }
+ ],
+ "name": "isRegistered",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "id",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "bool",
+ "name": "isRevocable",
+ "type": "bool"
+ },
+ {
+ "internalType": "string",
+ "name": "ownerName",
+ "type": "string"
+ }
+ ],
+ "name": "register",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "issuer",
+ "type": "address"
+ }
+ ],
+ "name": "removeIssuer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "router",
+ "outputs": [
+ {
+ "internalType": "contract IRouter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "issuer",
+ "type": "address"
+ }
+ ],
+ "name": "setIssuer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_router",
+ "type": "address"
+ }
+ ],
+ "name": "updateRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/deployments/arbitrum-nova/Router.json b/contracts/deployments/arbitrum-nova/Router.json
new file mode 100644
index 00000000..e334c877
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/Router.json
@@ -0,0 +1,233 @@
+{
+ "address": "0xC81B5149D9Cd49195D00EFb16FED89f3Ba78E03B",
+ "abi": [
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "registryAddress",
+ "type": "address"
+ }
+ ],
+ "name": "AttestationRegistryUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "registryAddress",
+ "type": "address"
+ }
+ ],
+ "name": "ModuleRegistryUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "registryAddress",
+ "type": "address"
+ }
+ ],
+ "name": "PortalRegistryUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "registryAddress",
+ "type": "address"
+ }
+ ],
+ "name": "SchemaRegistryUpdated",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "getAttestationRegistry",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getModuleRegistry",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getPortalRegistry",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getSchemaRegistry",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_attestationRegistry",
+ "type": "address"
+ }
+ ],
+ "name": "updateAttestationRegistry",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_moduleRegistry",
+ "type": "address"
+ }
+ ],
+ "name": "updateModuleRegistry",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_portalRegistry",
+ "type": "address"
+ }
+ ],
+ "name": "updatePortalRegistry",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_schemaRegistry",
+ "type": "address"
+ }
+ ],
+ "name": "updateSchemaRegistry",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/deployments/arbitrum-nova/SchemaRegistry.json b/contracts/deployments/arbitrum-nova/SchemaRegistry.json
new file mode 100644
index 00000000..2f1513c6
--- /dev/null
+++ b/contracts/deployments/arbitrum-nova/SchemaRegistry.json
@@ -0,0 +1,396 @@
+{
+ "address": "0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "IssuerInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyAssignedIssuer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyIssuer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyPortalRegistry",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RouterInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SchemaAlreadyExists",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SchemaNameMissing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SchemaNotRegistered",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SchemaStringMissing",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "previousOwner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnershipTransferred",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ }
+ ],
+ "name": "SchemaContextUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "id",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "context",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "schemaString",
+ "type": "string"
+ }
+ ],
+ "name": "SchemaCreated",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "context",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "schemaString",
+ "type": "string"
+ }
+ ],
+ "name": "createSchema",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "schema",
+ "type": "string"
+ }
+ ],
+ "name": "getIdFromSchemaString",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getSchema",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "description",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "context",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "schema",
+ "type": "string"
+ }
+ ],
+ "internalType": "struct Schema",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getSchemasNumber",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isRegistered",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "renounceOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "router",
+ "outputs": [
+ {
+ "internalType": "contract IRouter",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "schemaIds",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "string",
+ "name": "context",
+ "type": "string"
+ }
+ ],
+ "name": "updateContext",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "oldIssuer",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "newIssuer",
+ "type": "address"
+ }
+ ],
+ "name": "updateMatchingSchemaIssuers",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_router",
+ "type": "address"
+ }
+ ],
+ "name": "updateRouter",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "schemaId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "issuer",
+ "type": "address"
+ }
+ ],
+ "name": "updateSchemaIssuer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+}
diff --git a/contracts/env/.env.arbitrum-nova b/contracts/env/.env.arbitrum-nova
new file mode 100644
index 00000000..5e6c32fe
--- /dev/null
+++ b/contracts/env/.env.arbitrum-nova
@@ -0,0 +1,14 @@
+# Config
+INFURA_KEY=
+
+PRIVATE_KEY_NOVA=0000000000000000000000000000000000000000000000000000000000000001
+
+ARBISCAN_NOVA_API_KEY=
+
+# Contracts
+ROUTER_ADDRESS=0xC81B5149D9Cd49195D00EFb16FED89f3Ba78E03B
+ATTESTATION_REGISTRY_ADDRESS=0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8
+MODULE_REGISTRY_ADDRESS=0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3
+PORTAL_REGISTRY_ADDRESS=0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38
+SCHEMA_REGISTRY_ADDRESS=0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB
+ATTESTATION_READER_ADDRESS=0x7A22D0Fba31a4d5b5E4F5263379B4dbf3707b48c
\ No newline at end of file
diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts
index 0dab6d7f..4c147948 100644
--- a/contracts/hardhat.config.ts
+++ b/contracts/hardhat.config.ts
@@ -35,6 +35,10 @@ const config: HardhatUserConfig = {
accounts:
process.env.PRIVATE_KEY_ARBITRUM_MAINNET !== undefined ? [process.env.PRIVATE_KEY_ARBITRUM_MAINNET] : [],
},
+ "arbitrum-nova": {
+ url: "https://arbitrum-nova.publicnode.com",
+ accounts: process.env.PRIVATE_KEY_NOVA !== undefined ? [process.env.PRIVATE_KEY_NOVA] : [],
+ },
"linea-goerli": {
url: `https://linea-goerli.infura.io/v3/${process.env.INFURA_KEY ?? ""}`,
accounts: process.env.PRIVATE_KEY_LINEA_TESTNET !== undefined ? [process.env.PRIVATE_KEY_LINEA_TESTNET] : [],
@@ -56,6 +60,7 @@ const config: HardhatUserConfig = {
"arbitrum-goerli": process.env.ARBISCAN_API_KEY ?? "",
"arbitrum-sepolia": process.env.ARBISCAN_API_KEY ?? "",
arbitrum: process.env.ARBISCAN_API_KEY ?? "",
+ "arbitrum-nova": process.env.ARBISCAN_NOVA_API_KEY ?? "",
"linea-goerli": process.env.LINEASCAN_API_KEY ?? "",
linea: process.env.LINEASCAN_API_KEY ?? "",
"scroll-sepolia": process.env.SCROLL_API_KEY ?? "",
@@ -85,6 +90,14 @@ const config: HardhatUserConfig = {
browserURL: "https://arbiscan.io",
},
},
+ {
+ network: "arbitrum-nova",
+ chainId: 42170,
+ urls: {
+ apiURL: "https://api-nova.arbiscan.io/api",
+ browserURL: "https://nova.arbiscan.io/",
+ },
+ },
{
network: "linea-goerli",
chainId: 59140,
diff --git a/contracts/script/deploy/deployEverything.ts b/contracts/script/deploy/deployEverything.ts
index 219396ae..ddbd346d 100644
--- a/contracts/script/deploy/deployEverything.ts
+++ b/contracts/script/deploy/deployEverything.ts
@@ -16,6 +16,8 @@ async function main() {
const routerProxyAddress = await router.getAddress();
const routerImplementationAddress = await upgrades.erc1967.getImplementationAddress(routerProxyAddress);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: routerProxyAddress,
});
@@ -35,6 +37,8 @@ async function main() {
attestationRegistryProxyAddress,
);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: attestationRegistryProxyAddress,
});
@@ -54,6 +58,8 @@ async function main() {
moduleRegistryProxyAddress,
);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: moduleRegistryProxyAddress,
});
@@ -73,6 +79,8 @@ async function main() {
portalRegistryProxyAddress,
);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: portalRegistryProxyAddress,
});
@@ -92,6 +100,8 @@ async function main() {
schemaRegistryProxyAddress,
);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: schemaRegistryProxyAddress,
});
@@ -111,6 +121,8 @@ async function main() {
attestationReaderProxyAddress,
);
+ await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait for 5 seconds
+
await run("verify:verify", {
address: attestationReaderProxyAddress,
});
diff --git a/contracts/script/utils.ts b/contracts/script/utils.ts
index 07b240e5..c2ce1fe8 100644
--- a/contracts/script/utils.ts
+++ b/contracts/script/utils.ts
@@ -10,6 +10,8 @@ export const getChainPrefix = (chainId: bigint): `0x${string}` => {
return "0x0001000000000000000000000000000000000000000000000000000000000000";
case 42161n: // Arbitrum mainnet
return "0x0001000000000000000000000000000000000000000000000000000000000000";
+ case 42170n: // Arbitrum nova
+ return "0x0002000000000000000000000000000000000000000000000000000000000000";
default:
throw new Error("Unknown network");
}
diff --git a/sdk/src/VeraxSdk.ts b/sdk/src/VeraxSdk.ts
index ac4389e4..e8704381 100644
--- a/sdk/src/VeraxSdk.ts
+++ b/sdk/src/VeraxSdk.ts
@@ -1,4 +1,4 @@
-import { arbitrum, arbitrumGoerli, arbitrumSepolia, linea, lineaTestnet } from "viem/chains";
+import { arbitrumNova, arbitrum, arbitrumGoerli, arbitrumSepolia, linea, lineaTestnet } from "viem/chains";
import AttestationDataMapper from "./dataMapper/AttestationDataMapper";
import SchemaDataMapper from "./dataMapper/SchemaDataMapper";
import ModuleDataMapper from "./dataMapper/ModuleDataMapper";
@@ -38,6 +38,22 @@ export class VeraxSdk {
attestationRegistryAddress: "0xC765F28096F6121C2F2b82D35A4346280164428b",
};
+ static DEFAULT_ARBITRUM_NOVA: Conf = {
+ chain: arbitrumNova,
+ mode: SDKMode.BACKEND,
+ subgraphUrl:
+ "https://api.goldsky.com/api/public/project_clr9aj9alwgwg01q7ci1rh781/subgraphs/verax-arbitrum-nova/0.0.5/gn",
+ portalRegistryAddress: "0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38",
+ moduleRegistryAddress: "0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3",
+ schemaRegistryAddress: "0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB",
+ attestationRegistryAddress: "0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8",
+ };
+
+ static DEFAULT_ARBITRUM_NOVA_FRONTEND: Conf = {
+ ...VeraxSdk.DEFAULT_ARBITRUM_NOVA,
+ mode: SDKMode.FRONTEND,
+ };
+
static DEFAULT_LINEA_TESTNET_FRONTEND: Conf = {
...VeraxSdk.DEFAULT_LINEA_TESTNET,
mode: SDKMode.FRONTEND,
diff --git a/subgraph/networks.json b/subgraph/networks.json
index b77219fb..7427d013 100644
--- a/subgraph/networks.json
+++ b/subgraph/networks.json
@@ -88,5 +88,23 @@
"address": "0xE96072F46EA0e42e538762dDc0aFa4ED8AE6Ec27",
"startBlock": 149975041
}
+ },
+ "arbitrum-nova": {
+ "AttestationRegistry": {
+ "address": "0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8",
+ "startBlock": 38935000
+ },
+ "ModuleRegistry": {
+ "address": "0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3",
+ "startBlock": 38935000
+ },
+ "PortalRegistry": {
+ "address": "0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38",
+ "startBlock": 38935000
+ },
+ "SchemaRegistry": {
+ "address": "0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB",
+ "startBlock": 38935000
+ }
}
}
diff --git a/subgraph/package.json b/subgraph/package.json
index cb4c562d..d305ec98 100644
--- a/subgraph/package.json
+++ b/subgraph/package.json
@@ -17,14 +17,16 @@
"scripts": {
"build:linea-mainnet": "cp subgraph.linea-mainnet.yaml subgraph.yaml && pnpm run codegen:linea-mainnet && graph build --network linea-mainnet",
"build:linea-goerli": "cp subgraph.linea-goerli.yaml subgraph.yaml && pnpm run codegen:linea-goerli && graph build --network linea-goerli",
- "build:arbitrum-goerli": "cp subgraph.linea-goerli.yaml subgraph.yaml && pnpm run codegen:arbitrum-goerli && graph build --network arbitrum-goerli",
+ "build:arbitrum-goerli": "cp subgraph.arbitrum-goerli.yaml subgraph.yaml && pnpm run codegen:arbitrum-goerli && graph build --network arbitrum-goerli",
"build:arbitrum-sepolia": "cp subgraph.arbitrum-sepolia.yaml subgraph.yaml && pnpm run codegen:arbitrum-sepolia && graph build --network arbitrum-sepolia",
- "build:arbitrum-one": "cp subgraph.linea-goerli.yaml subgraph.yaml && pnpm run codegen:arbitrum-one && graph build --network arbitrum-one",
+ "build:arbitrum-mainnet": "cp subgraph.arbitrum-mainnet.yaml subgraph.yaml && pnpm run codegen:arbitrum-mainnet && graph build --network arbitrum-mainnet",
+ "build:arbitrum-nova": "cp subgraph.arbitrum-nova.yaml subgraph.yaml && pnpm run codegen:arbitrum-nova && graph build --network arbitrum-nova",
"codegen:linea-mainnet": "cp subgraph.linea-mainnet.yaml subgraph.yaml && graph codegen",
"codegen:linea-goerli": "cp subgraph.linea-goerli.yaml subgraph.yaml && graph codegen",
- "codegen:arbitrum-goerli": "cp subgraph.linea-goerli.yaml subgraph.yaml && graph codegen",
+ "codegen:arbitrum-goerli": "cp subgraph.arbitrum-goerli.yaml subgraph.yaml && graph codegen",
"codegen:arbitrum-sepolia": "cp subgraph.arbitrum-sepolia.yaml subgraph.yaml && graph codegen",
- "codegen:arbitrum-one": "cp subgraph.linea-mainnet.yaml subgraph.yaml && graph codegen",
+ "codegen:arbitrum-mainnet": "cp subgraph.arbitrum-mainnet.yaml subgraph.yaml && graph codegen",
+ "codegen:arbitrum-nova": "cp subgraph.arbitrum-nova.yaml subgraph.yaml && graph codegen",
"create:linea-mainnet": "source .env && graph create --node $DEPLOY_ENDPOINT_LINEA_MAINNET Consensys/linea-attestation-registry",
"create:linea-goerli": "source .env && graph create --node $DEPLOY_ENDPOINT_LINEA_GOERLI Consensys/linea-attestation-registry",
"create:arbitrum-goerli": "source .env && graph create --node $DEPLOY_ENDPOINT_ARBITRUM_GOERLI Consensys/verax-arbitrum-goerli",
@@ -32,9 +34,10 @@
"create:arbitrum-one": "source .env && graph create --node $DEPLOY_ENDPOINT_ARBITRUM_GOERLI Consensys/verax-arbitrum",
"deploy:linea-mainnet": "source .env && cp subgraph.linea-mainnet.yaml subgraph.yaml && pnpm run build:linea-mainnet && graph deploy --network linea-mainnet --node $DEPLOY_ENDPOINT_LINEA_MAINNET --headers \"{\\\"Authorization\\\": \\\"Basic $IPFS_IDENTIFIERS\\\"}\" --ipfs $IPFS_ENDPOINT --version-label v0.0.1 Consensys/linea-attestation-registry",
"deploy:linea-goerli": "source .env && cp subgraph.linea-goerli.yaml subgraph.yaml && pnpm run build:linea-goerli && graph deploy --network linea-goerli --node $DEPLOY_ENDPOINT_LINEA_GOERLI --headers \"{\\\"Authorization\\\": \\\"Basic $IPFS_IDENTIFIERS\\\"}\" --ipfs $IPFS_ENDPOINT --version-label v0.0.5 Consensys/linea-attestation-registry",
- "deploy:arbitrum-goerli": "source .env && cp subgraph.arbitrum-goerli.yaml subgraph.yaml && pnpm run build:arbitrum-goerli && graph deploy --network arbitrum-goerli --product hosted-service $SUBGRAPH_NAME_ARBITRUM_GOERLI",
+ "deploy:arbitrum-goerli": "source .env && cp subgraph.arbitrum-goerli.yaml subgraph.yaml && pnpm run build:arbitrum-goerli && graph deploy --network arbitrum-goerli --node $DEPLOY_ENDPOINT_ARBITRUM_GOERLI --headers \"{\\\"Authorization\\\": \\\"Basic $IPFS_IDENTIFIERS\\\"}\" --ipfs $IPFS_ENDPOINT --version-label v0.0.5 Consensys/verax-arbitrum-goerli",
"deploy:arbitrum-sepolia": "source .env && cp subgraph.arbitrum-sepolia.yaml subgraph.yaml && pnpm run build:arbitrum-sepolia && graph deploy --studio $SUBGRAPH_NAME_ARBITRUM_SEPOLIA",
- "deploy:arbitrum-one": "source .env && cp subgraph.arbitrum-one.yaml subgraph.yaml && pnpm run build:arbitrum-one && graph deploy --network arbitrum-one --product hosted-service $SUBGRAPH_NAME_ARBITRUM",
+ "deploy:arbitrum-mainnet": "source .env && cp subgraph.arbitrum-mainnet.yaml subgraph.yaml && pnpm run build:arbitrum-mainnet && graph deploy --network arbitrum-mainnet --node $DEPLOY_ENDPOINT_ARBITRUM_MAINNET --headers \"{\\\"Authorization\\\": \\\"Basic $IPFS_IDENTIFIERS\\\"}\" --ipfs $IPFS_ENDPOINT --version-label v0.0.5 Consensys/verax-arbitrum",
+ "deploy:arbitrum-nova": "source .env && cp subgraph.arbitrum-nova.yaml subgraph.yaml && pnpm run build:arbitrum-nova && goldsky subgraph deploy 'verax-arbitrum-nova/0.0.5'",
"remove:linea-mainnet": "source .env && graph remove --node $DEPLOY_ENDPOINT_LINEA_MAINNET Consensys/linea-attestation-registry",
"remove:linea-goerli": "source .env && graph remove --node $DEPLOY_ENDPOINT_LINEA_GOERLI Consensys/linea-attestation-registry",
"test": "pnpm run codegen:linea-goerli && graph test",
diff --git a/subgraph/subgraph.arbitrum-nova.yaml b/subgraph/subgraph.arbitrum-nova.yaml
new file mode 100644
index 00000000..615b0e27
--- /dev/null
+++ b/subgraph/subgraph.arbitrum-nova.yaml
@@ -0,0 +1,86 @@
+specVersion: 0.0.5
+schema:
+ file: ./schema.graphql
+dataSources:
+ - kind: ethereum
+ name: AttestationRegistry
+ network: arbitrum-nova
+ source:
+ abi: AttestationRegistry
+ address: "0xB9Cf26ED827Eb4A7079e8dedB0ea93D932A2e3e8"
+ startBlock: 38935000
+ mapping:
+ kind: ethereum/events
+ apiVersion: 0.0.7
+ language: wasm/assemblyscript
+ entities:
+ - Attestation
+ abis:
+ - name: AttestationRegistry
+ file: ./abis/AttestationRegistry.json
+ eventHandlers:
+ - event: AttestationRegistered(indexed bytes32)
+ handler: handleAttestationRegistered
+ file: ./src/attestation-registry.ts
+ - kind: ethereum
+ name: ModuleRegistry
+ network: arbitrum-nova
+ source:
+ abi: ModuleRegistry
+ address: "0x46F7471cd2C1d69Cb5e62c1a34F3fCAf81304Fc3"
+ startBlock: 38935000
+ mapping:
+ kind: ethereum/events
+ apiVersion: 0.0.7
+ language: wasm/assemblyscript
+ entities:
+ - Module
+ abis:
+ - name: ModuleRegistry
+ file: ./abis/ModuleRegistry.json
+ eventHandlers:
+ - event: ModuleRegistered(string,string,address)
+ handler: handleModuleRegistered
+ file: ./src/module-registry.ts
+ - kind: ethereum
+ name: PortalRegistry
+ network: arbitrum-nova
+ source:
+ abi: PortalRegistry
+ address: "0xADc8da3d3388dEe74C7134fC4AEe1cF866Da5d38"
+ startBlock: 38935000
+ mapping:
+ kind: ethereum/events
+ apiVersion: 0.0.7
+ language: wasm/assemblyscript
+ entities:
+ - Portal
+ abis:
+ - name: PortalRegistry
+ file: ./abis/PortalRegistry.json
+ eventHandlers:
+ - event: PortalRegistered(string,string,address)
+ handler: handlePortalRegistered
+ file: ./src/portal-registry.ts
+ - kind: ethereum
+ name: SchemaRegistry
+ network: arbitrum-nova
+ source:
+ abi: SchemaRegistry
+ address: "0x9b5BABcEbf0E8550da1eCDe5674783179B6557FB"
+ startBlock: 38935000
+ mapping:
+ kind: ethereum/events
+ apiVersion: 0.0.7
+ language: wasm/assemblyscript
+ entities:
+ - Portal
+ abis:
+ - name: SchemaRegistry
+ file: ./abis/SchemaRegistry.json
+ eventHandlers:
+ - event: SchemaCreated(indexed bytes32,string,string,string,string)
+ handler: handleSchemaCreated
+ - event: SchemaContextUpdated(indexed bytes32)
+ handler: handleSchemaContextUpdated
+ file: ./src/schema-registry.ts