@aztec/pxe 0.77.1 → 0.78.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dest/bin/index.js +1 -1
  2. package/dest/config/index.d.ts +1 -0
  3. package/dest/config/index.d.ts.map +1 -1
  4. package/dest/config/index.js +1 -0
  5. package/dest/entrypoints/client/bundle/index.d.ts +6 -0
  6. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -0
  7. package/dest/entrypoints/client/bundle/index.js +5 -0
  8. package/dest/entrypoints/client/bundle/utils.d.ts +16 -0
  9. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -0
  10. package/dest/entrypoints/client/bundle/utils.js +30 -0
  11. package/dest/entrypoints/client/lazy/index.d.ts +6 -0
  12. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -0
  13. package/dest/entrypoints/client/lazy/index.js +5 -0
  14. package/dest/entrypoints/client/lazy/utils.d.ts +15 -0
  15. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -0
  16. package/dest/entrypoints/client/lazy/utils.js +29 -0
  17. package/dest/entrypoints/client/pxe_creation_options.d.ts +11 -0
  18. package/dest/entrypoints/client/pxe_creation_options.d.ts.map +1 -0
  19. package/dest/entrypoints/server/index.d.ts +7 -0
  20. package/dest/entrypoints/server/index.d.ts.map +1 -0
  21. package/dest/entrypoints/server/index.js +6 -0
  22. package/dest/{utils/create_pxe_service.d.ts → entrypoints/server/utils.d.ts} +4 -4
  23. package/dest/entrypoints/server/utils.d.ts.map +1 -0
  24. package/dest/{utils/create_pxe_service.js → entrypoints/server/utils.js} +5 -11
  25. package/dest/kernel_oracle/index.d.ts +2 -1
  26. package/dest/kernel_oracle/index.d.ts.map +1 -1
  27. package/dest/kernel_prover/kernel_prover.d.ts.map +1 -1
  28. package/dest/kernel_prover/kernel_prover.js +0 -28
  29. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts +2 -2
  30. package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +1 -1
  31. package/dest/note_decryption_utils/add_public_values_to_payload.js +3 -3
  32. package/dest/{pxe_data_provider → pxe_oracle_interface}/index.d.ts +17 -9
  33. package/dest/pxe_oracle_interface/index.d.ts.map +1 -0
  34. package/dest/{pxe_data_provider → pxe_oracle_interface}/index.js +104 -61
  35. package/dest/pxe_oracle_interface/tagging_utils.d.ts.map +1 -0
  36. package/dest/pxe_service/error_enriching.d.ts +3 -4
  37. package/dest/pxe_service/error_enriching.d.ts.map +1 -1
  38. package/dest/pxe_service/error_enriching.js +4 -4
  39. package/dest/pxe_service/pxe_service.d.ts +18 -14
  40. package/dest/pxe_service/pxe_service.d.ts.map +1 -1
  41. package/dest/pxe_service/pxe_service.js +118 -65
  42. package/dest/storage/address_data_provider/address_data_provider.d.ts +13 -0
  43. package/dest/storage/address_data_provider/address_data_provider.d.ts.map +1 -0
  44. package/dest/storage/address_data_provider/address_data_provider.js +50 -0
  45. package/dest/storage/address_data_provider/index.d.ts +2 -0
  46. package/dest/storage/address_data_provider/index.d.ts.map +1 -0
  47. package/dest/storage/address_data_provider/index.js +1 -0
  48. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts +11 -0
  49. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.d.ts.map +1 -0
  50. package/dest/storage/auth_witness_data_provider/auth_witness_data_provider.js +20 -0
  51. package/dest/storage/auth_witness_data_provider/index.d.ts +2 -0
  52. package/dest/storage/auth_witness_data_provider/index.d.ts.map +1 -0
  53. package/dest/storage/auth_witness_data_provider/index.js +1 -0
  54. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts +16 -0
  55. package/dest/storage/capsule_data_provider/capsule_data_provider.d.ts.map +1 -0
  56. package/dest/storage/capsule_data_provider/capsule_data_provider.js +57 -0
  57. package/dest/storage/capsule_data_provider/index.d.ts +2 -0
  58. package/dest/storage/capsule_data_provider/index.d.ts.map +1 -0
  59. package/dest/storage/capsule_data_provider/index.js +1 -0
  60. package/dest/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.d.ts +38 -33
  61. package/dest/storage/contract_data_provider/contract_data_provider.d.ts.map +1 -0
  62. package/dest/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.js +87 -42
  63. package/dest/storage/contract_data_provider/index.d.ts.map +1 -0
  64. package/dest/storage/contract_data_provider/private_functions_tree.d.ts.map +1 -0
  65. package/dest/storage/data_provider.d.ts +4 -0
  66. package/dest/storage/data_provider.d.ts.map +1 -0
  67. package/dest/storage/data_provider.js +1 -0
  68. package/dest/storage/index.d.ts +10 -0
  69. package/dest/storage/index.d.ts.map +1 -0
  70. package/dest/storage/index.js +9 -0
  71. package/dest/storage/note_data_provider/index.d.ts +3 -0
  72. package/dest/storage/note_data_provider/index.d.ts.map +1 -0
  73. package/dest/storage/note_data_provider/index.js +2 -0
  74. package/dest/storage/note_data_provider/note_dao.d.ts.map +1 -0
  75. package/dest/storage/note_data_provider/note_data_provider.d.ts +20 -0
  76. package/dest/storage/note_data_provider/note_data_provider.d.ts.map +1 -0
  77. package/dest/storage/note_data_provider/note_data_provider.js +249 -0
  78. package/dest/storage/sync_data_provider/index.d.ts +2 -0
  79. package/dest/storage/sync_data_provider/index.d.ts.map +1 -0
  80. package/dest/storage/sync_data_provider/index.js +1 -0
  81. package/dest/storage/sync_data_provider/sync_data_provider.d.ts +12 -0
  82. package/dest/storage/sync_data_provider/sync_data_provider.d.ts.map +1 -0
  83. package/dest/storage/sync_data_provider/sync_data_provider.js +29 -0
  84. package/dest/storage/tagging_data_provider/index.d.ts +2 -0
  85. package/dest/storage/tagging_data_provider/index.d.ts.map +1 -0
  86. package/dest/storage/tagging_data_provider/index.js +1 -0
  87. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts +18 -0
  88. package/dest/storage/tagging_data_provider/tagging_data_provider.d.ts.map +1 -0
  89. package/dest/storage/tagging_data_provider/tagging_data_provider.js +65 -0
  90. package/dest/synchronizer/synchronizer.d.ts +7 -3
  91. package/dest/synchronizer/synchronizer.d.ts.map +1 -1
  92. package/dest/synchronizer/synchronizer.js +16 -11
  93. package/dest/test/pxe_test_suite.d.ts.map +1 -0
  94. package/dest/{pxe_service/test → test}/pxe_test_suite.js +2 -6
  95. package/package.json +19 -26
  96. package/src/bin/index.ts +1 -1
  97. package/src/config/index.ts +2 -0
  98. package/src/entrypoints/client/bundle/index.ts +5 -0
  99. package/src/entrypoints/client/bundle/utils.ts +58 -0
  100. package/src/entrypoints/client/lazy/index.ts +5 -0
  101. package/src/entrypoints/client/lazy/utils.ts +53 -0
  102. package/src/entrypoints/client/pxe_creation_options.ts +7 -0
  103. package/src/entrypoints/server/index.ts +6 -0
  104. package/src/{utils/create_pxe_service.ts → entrypoints/server/utils.ts} +7 -18
  105. package/src/kernel_oracle/index.ts +1 -1
  106. package/src/kernel_prover/kernel_prover.ts +0 -51
  107. package/src/note_decryption_utils/add_public_values_to_payload.ts +4 -4
  108. package/src/{pxe_data_provider → pxe_oracle_interface}/index.ts +128 -96
  109. package/src/pxe_service/error_enriching.ts +8 -6
  110. package/src/pxe_service/pxe_service.ts +155 -89
  111. package/src/storage/address_data_provider/address_data_provider.ts +71 -0
  112. package/src/storage/address_data_provider/index.ts +1 -0
  113. package/src/storage/auth_witness_data_provider/auth_witness_data_provider.ts +34 -0
  114. package/src/storage/auth_witness_data_provider/index.ts +1 -0
  115. package/src/storage/capsule_data_provider/capsule_data_provider.ts +80 -0
  116. package/src/storage/capsule_data_provider/index.ts +1 -0
  117. package/src/{contract_data_provider → storage/contract_data_provider}/contract_data_provider.ts +128 -48
  118. package/src/storage/data_provider.ts +3 -0
  119. package/src/storage/index.ts +10 -0
  120. package/src/storage/note_data_provider/index.ts +2 -0
  121. package/src/storage/note_data_provider/note_data_provider.ts +345 -0
  122. package/src/storage/sync_data_provider/index.ts +1 -0
  123. package/src/storage/sync_data_provider/sync_data_provider.ts +40 -0
  124. package/src/storage/tagging_data_provider/index.ts +1 -0
  125. package/src/storage/tagging_data_provider/tagging_data_provider.ts +92 -0
  126. package/src/synchronizer/synchronizer.ts +15 -10
  127. package/src/{pxe_service/test → test}/pxe_test_suite.ts +2 -9
  128. package/dest/contract_data_provider/contract_data_provider.d.ts.map +0 -1
  129. package/dest/contract_data_provider/index.d.ts.map +0 -1
  130. package/dest/contract_data_provider/private_functions_tree.d.ts.map +0 -1
  131. package/dest/database/index.d.ts +0 -3
  132. package/dest/database/index.d.ts.map +0 -1
  133. package/dest/database/index.js +0 -2
  134. package/dest/database/interfaces/contract_artifact_db.d.ts +0 -20
  135. package/dest/database/interfaces/contract_artifact_db.d.ts.map +0 -1
  136. package/dest/database/interfaces/contract_artifact_db.js +0 -3
  137. package/dest/database/interfaces/contract_instance_db.d.ts +0 -20
  138. package/dest/database/interfaces/contract_instance_db.d.ts.map +0 -1
  139. package/dest/database/interfaces/contract_instance_db.js +0 -3
  140. package/dest/database/interfaces/index.d.ts +0 -4
  141. package/dest/database/interfaces/index.d.ts.map +0 -1
  142. package/dest/database/interfaces/pxe_database.d.ts +0 -211
  143. package/dest/database/interfaces/pxe_database.d.ts.map +0 -1
  144. package/dest/database/interfaces/pxe_database.js +0 -4
  145. package/dest/database/interfaces/pxe_database_test_suite.d.ts +0 -7
  146. package/dest/database/interfaces/pxe_database_test_suite.d.ts.map +0 -1
  147. package/dest/database/interfaces/pxe_database_test_suite.js +0 -557
  148. package/dest/database/kv_pxe_database.d.ts +0 -58
  149. package/dest/database/kv_pxe_database.d.ts.map +0 -1
  150. package/dest/database/kv_pxe_database.js +0 -480
  151. package/dest/database/note_dao.d.ts.map +0 -1
  152. package/dest/index.d.ts +0 -9
  153. package/dest/index.d.ts.map +0 -1
  154. package/dest/index.js +0 -8
  155. package/dest/pxe_data_provider/index.d.ts.map +0 -1
  156. package/dest/pxe_data_provider/tagging_utils.d.ts.map +0 -1
  157. package/dest/pxe_service/test/pxe_test_suite.d.ts.map +0 -1
  158. package/dest/utils/create_pxe_service.d.ts.map +0 -1
  159. package/src/database/index.ts +0 -2
  160. package/src/database/interfaces/contract_artifact_db.ts +0 -20
  161. package/src/database/interfaces/contract_instance_db.ts +0 -21
  162. package/src/database/interfaces/index.ts +0 -3
  163. package/src/database/interfaces/pxe_database.ts +0 -240
  164. package/src/database/interfaces/pxe_database_test_suite.ts +0 -558
  165. package/src/database/kv_pxe_database.ts +0 -670
  166. package/src/index.ts +0 -9
  167. /package/dest/{database/interfaces/index.js → entrypoints/client/pxe_creation_options.js} +0 -0
  168. /package/dest/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.d.ts +0 -0
  169. /package/dest/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.js +0 -0
  170. /package/dest/{contract_data_provider → storage/contract_data_provider}/index.d.ts +0 -0
  171. /package/dest/{contract_data_provider → storage/contract_data_provider}/index.js +0 -0
  172. /package/dest/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.d.ts +0 -0
  173. /package/dest/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.js +0 -0
  174. /package/dest/{database → storage/note_data_provider}/note_dao.d.ts +0 -0
  175. /package/dest/{database → storage/note_data_provider}/note_dao.js +0 -0
  176. /package/dest/{pxe_service/test → test}/pxe_test_suite.d.ts +0 -0
  177. /package/src/{pxe_data_provider → pxe_oracle_interface}/tagging_utils.ts +0 -0
  178. /package/src/{contract_data_provider → storage/contract_data_provider}/index.ts +0 -0
  179. /package/src/{contract_data_provider → storage/contract_data_provider}/private_functions_tree.ts +0 -0
  180. /package/src/{database → storage/note_data_provider}/note_dao.ts +0 -0
@@ -1,5 +1,8 @@
1
+ import { Fr } from '@aztec/foundation/fields';
1
2
  import { createLogger } from '@aztec/foundation/log';
2
3
  import { Timer } from '@aztec/foundation/timer';
4
+ import { KeyStore } from '@aztec/key-store';
5
+ import { L2TipsStore } from '@aztec/kv-store/stores';
3
6
  import { ProtocolContractAddress, protocolContractNames } from '@aztec/protocol-contracts';
4
7
  import { AcirSimulator, readCurrentClassId } from '@aztec/simulator/client';
5
8
  import { EventSelector, FunctionSelector, FunctionType, decodeFunctionSignature, encodeArguments } from '@aztec/stdlib/abi';
@@ -10,73 +13,125 @@ import { siloNullifier } from '@aztec/stdlib/hash';
10
13
  import { computeAddressSecret } from '@aztec/stdlib/keys';
11
14
  import { getNonNullifiedL1ToL2MessageWitness } from '@aztec/stdlib/messaging';
12
15
  import { UniqueNote } from '@aztec/stdlib/note';
16
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
13
17
  import { PrivateSimulationResult, TxProvingResult, TxSimulationResult } from '@aztec/stdlib/tx';
14
18
  import { inspect } from 'util';
15
19
  import { getPackageInfo } from '../config/package_info.js';
16
- import { ContractDataProvider } from '../contract_data_provider/index.js';
17
20
  import { KernelOracle } from '../kernel_oracle/index.js';
18
21
  import { KernelProver } from '../kernel_prover/kernel_prover.js';
19
- import { PXEDataProvider } from '../pxe_data_provider/index.js';
22
+ import { PXEOracleInterface } from '../pxe_oracle_interface/index.js';
23
+ import { AddressDataProvider } from '../storage/address_data_provider/address_data_provider.js';
24
+ import { AuthWitnessDataProvider } from '../storage/auth_witness_data_provider/auth_witness_data_provider.js';
25
+ import { CapsuleDataProvider } from '../storage/capsule_data_provider/capsule_data_provider.js';
26
+ import { ContractDataProvider } from '../storage/contract_data_provider/contract_data_provider.js';
27
+ import { NoteDataProvider } from '../storage/note_data_provider/note_data_provider.js';
28
+ import { SyncDataProvider } from '../storage/sync_data_provider/sync_data_provider.js';
29
+ import { TaggingDataProvider } from '../storage/tagging_data_provider/tagging_data_provider.js';
20
30
  import { Synchronizer } from '../synchronizer/index.js';
21
31
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
22
32
  /**
23
33
  * A Private eXecution Environment (PXE) implementation.
24
34
  */ export class PXEService {
25
- keyStore;
26
35
  node;
27
- db;
28
- proofCreator;
29
- protocolContractsProvider;
30
36
  synchronizer;
37
+ keyStore;
31
38
  contractDataProvider;
32
- pxeDataProvider;
39
+ noteDataProvider;
40
+ capsuleDataProvider;
41
+ syncDataProvider;
42
+ taggingDataProvider;
43
+ addressDataProvider;
44
+ authWitnessDataProvider;
33
45
  simulator;
34
- log;
35
46
  packageVersion;
36
47
  proverEnabled;
37
- constructor(keyStore, node, db, tipsStore, proofCreator, simulationProvider, protocolContractsProvider, config, loggerOrSuffix){
38
- this.keyStore = keyStore;
48
+ proofCreator;
49
+ protocolContractsProvider;
50
+ log;
51
+ constructor(node, synchronizer, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, simulator, packageVersion, proverEnabled, proofCreator, protocolContractsProvider, log){
39
52
  this.node = node;
40
- this.db = db;
53
+ this.synchronizer = synchronizer;
54
+ this.keyStore = keyStore;
55
+ this.contractDataProvider = contractDataProvider;
56
+ this.noteDataProvider = noteDataProvider;
57
+ this.capsuleDataProvider = capsuleDataProvider;
58
+ this.syncDataProvider = syncDataProvider;
59
+ this.taggingDataProvider = taggingDataProvider;
60
+ this.addressDataProvider = addressDataProvider;
61
+ this.authWitnessDataProvider = authWitnessDataProvider;
62
+ this.simulator = simulator;
63
+ this.packageVersion = packageVersion;
64
+ this.proverEnabled = proverEnabled;
41
65
  this.proofCreator = proofCreator;
42
66
  this.protocolContractsProvider = protocolContractsProvider;
43
- this.log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
44
- this.synchronizer = new Synchronizer(node, db, tipsStore, config, loggerOrSuffix);
45
- this.contractDataProvider = new ContractDataProvider(db);
46
- this.pxeDataProvider = new PXEDataProvider(db, keyStore, node, simulationProvider, this.contractDataProvider, this.log);
47
- this.simulator = new AcirSimulator(this.pxeDataProvider, simulationProvider);
48
- this.packageVersion = getPackageInfo().version;
49
- this.proverEnabled = !!config.proverEnabled;
67
+ this.log = log;
50
68
  }
51
69
  /**
52
- * Starts the PXE Service by beginning the synchronization process between the Aztec node and the database.
70
+ * Creates an instance of a PXE Service by instantiating all the necessary data providers and services.
71
+ * Also triggers the registration of the protocol contracts and makes sure the provided node
72
+ * can be contacted.
53
73
  *
54
- * @returns A promise that resolves when the server has started successfully.
55
- */ async init() {
56
- await this.#registerProtocolContracts();
57
- const info = await this.getNodeInfo();
58
- this.log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.protocolVersion}`);
74
+ * @returns A promise that resolves PXE service is ready to be used.
75
+ */ static async create(node, store, proofCreator, simulationProvider, protocolContractsProvider, config, loggerOrSuffix) {
76
+ const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
77
+ const packageVersion = getPackageInfo().version;
78
+ const proverEnabled = !!config.proverEnabled;
79
+ const addressDataProvider = new AddressDataProvider(store);
80
+ const authWitnessDataProvider = new AuthWitnessDataProvider(store);
81
+ const contractDataProvider = new ContractDataProvider(store);
82
+ const noteDataProvider = await NoteDataProvider.create(store);
83
+ const syncDataProvider = new SyncDataProvider(store);
84
+ const taggingDataProvider = new TaggingDataProvider(store);
85
+ const capsuleDataProvider = new CapsuleDataProvider(store);
86
+ const keyStore = new KeyStore(store);
87
+ const tipsStore = new L2TipsStore(store, 'pxe');
88
+ const synchronizer = new Synchronizer(node, syncDataProvider, noteDataProvider, taggingDataProvider, tipsStore, config, loggerOrSuffix);
89
+ const pxeOracleInterface = new PXEOracleInterface(node, keyStore, simulationProvider, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, log);
90
+ const simulator = new AcirSimulator(pxeOracleInterface, simulationProvider);
91
+ const pxeService = new PXEService(node, synchronizer, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, authWitnessDataProvider, simulator, packageVersion, proverEnabled, proofCreator, protocolContractsProvider, log);
92
+ await pxeService.#registerProtocolContracts();
93
+ const info = await pxeService.getNodeInfo();
94
+ log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.protocolVersion}`);
95
+ return pxeService;
59
96
  }
60
97
  isL1ToL2MessageSynced(l1ToL2Message) {
61
98
  return this.node.isL1ToL2MessageSynced(l1ToL2Message);
62
99
  }
63
- /** Returns an estimate of the db size in bytes. */ estimateDbSize() {
64
- return this.db.estimateSize();
100
+ /** Returns an estimate of the db size in bytes. */ async estimateDbSize() {
101
+ const treeRootsSize = Object.keys(MerkleTreeId).length * Fr.SIZE_IN_BYTES;
102
+ const dbSizes = await Promise.all([
103
+ this.addressDataProvider.getSize(),
104
+ this.authWitnessDataProvider.getSize(),
105
+ this.capsuleDataProvider.getSize(),
106
+ this.contractDataProvider.getSize(),
107
+ this.noteDataProvider.getSize(),
108
+ this.syncDataProvider.getSize(),
109
+ this.taggingDataProvider.getSize()
110
+ ]);
111
+ return [
112
+ ...dbSizes,
113
+ treeRootsSize
114
+ ].reduce((sum, size)=>sum + size, 0);
65
115
  }
66
116
  addAuthWitness(witness) {
67
- return this.db.addAuthWitness(witness.requestHash, witness.witness);
117
+ return this.authWitnessDataProvider.addAuthWitness(witness.requestHash, witness.witness);
68
118
  }
69
119
  getAuthWitness(messageHash) {
70
- return this.db.getAuthWitness(messageHash);
120
+ return this.authWitnessDataProvider.getAuthWitness(messageHash);
71
121
  }
72
122
  storeCapsule(contract, storageSlot, capsule) {
73
- return this.db.storeCapsule(contract, storageSlot, capsule);
123
+ return this.capsuleDataProvider.storeCapsule(contract, storageSlot, capsule);
74
124
  }
75
125
  getContractInstance(address) {
76
- return this.db.getContractInstance(address);
126
+ return this.contractDataProvider.getContractInstance(address);
77
127
  }
78
128
  async getContractClassMetadata(id, includeArtifact = false) {
79
- const artifact = await this.db.getContractArtifact(id);
129
+ let artifact;
130
+ try {
131
+ artifact = await this.contractDataProvider.getContractArtifact(id);
132
+ } catch {
133
+ this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
134
+ }
80
135
  return {
81
136
  contractClass: artifact && await getContractClassFromArtifact(artifact),
82
137
  isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
@@ -84,8 +139,14 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
84
139
  };
85
140
  }
86
141
  async getContractMetadata(address) {
142
+ let instance;
143
+ try {
144
+ instance = await this.contractDataProvider.getContractInstance(address);
145
+ } catch {
146
+ this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
147
+ }
87
148
  return {
88
- contractInstance: await this.db.getContractInstance(address),
149
+ contractInstance: instance,
89
150
  isContractInitialized: await this.#isContractInitialized(address),
90
151
  isContractPubliclyDeployed: await this.#isContractPubliclyDeployed(address)
91
152
  };
@@ -100,7 +161,8 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
100
161
  this.log.info(`Registered account ${accountCompleteAddress.address.toString()}`);
101
162
  this.log.debug(`Registered account\n ${accountCompleteAddress.toReadableString()}`);
102
163
  }
103
- await this.db.addCompleteAddress(accountCompleteAddress);
164
+ await this.addressDataProvider.addCompleteAddress(accountCompleteAddress);
165
+ await this.noteDataProvider.addScope(accountCompleteAddress.address);
104
166
  return accountCompleteAddress;
105
167
  }
106
168
  async registerSender(address) {
@@ -109,7 +171,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
109
171
  this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
110
172
  return address;
111
173
  }
112
- const wasAdded = await this.db.addSenderAddress(address);
174
+ const wasAdded = await this.taggingDataProvider.addSenderAddress(address);
113
175
  if (wasAdded) {
114
176
  this.log.info(`Added sender:\n ${address.toString()}`);
115
177
  } else {
@@ -118,11 +180,11 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
118
180
  return address;
119
181
  }
120
182
  getSenders() {
121
- const senders = this.db.getSenderAddresses();
183
+ const senders = this.taggingDataProvider.getSenderAddresses();
122
184
  return Promise.resolve(senders);
123
185
  }
124
186
  async removeSender(address) {
125
- const wasRemoved = await this.db.removeSenderAddress(address);
187
+ const wasRemoved = await this.taggingDataProvider.removeSenderAddress(address);
126
188
  if (wasRemoved) {
127
189
  this.log.info(`Removed sender:\n ${address.toString()}`);
128
190
  } else {
@@ -132,14 +194,14 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
132
194
  }
133
195
  async getRegisteredAccounts() {
134
196
  // Get complete addresses of both the recipients and the accounts
135
- const completeAddresses = await this.db.getCompleteAddresses();
197
+ const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
136
198
  // Filter out the addresses not corresponding to accounts
137
199
  const accounts = await this.keyStore.getAccounts();
138
200
  return completeAddresses.filter((completeAddress)=>accounts.find((address)=>address.equals(completeAddress.address)));
139
201
  }
140
202
  async registerContractClass(artifact) {
141
203
  const { id: contractClassId } = await getContractClassFromArtifact(artifact);
142
- await this.db.addContractArtifact(contractClassId, artifact);
204
+ await this.contractDataProvider.addContractArtifact(contractClassId, artifact);
143
205
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
144
206
  }
145
207
  async registerContract(contract) {
@@ -156,7 +218,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
156
218
  if (!computedAddress.equals(instance.address)) {
157
219
  throw new Error('Added a contract in which the address does not match the contract instance.');
158
220
  }
159
- await this.db.addContractArtifact(contractClass.id, artifact);
221
+ await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
160
222
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
161
223
  await this.node.registerContractFunctionSignatures(instance.address, publicFunctionSignatures);
162
224
  // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
@@ -167,27 +229,21 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
167
229
  });
168
230
  } else {
169
231
  // Otherwise, make sure there is an artifact already registered for that class id
170
- artifact = await this.db.getContractArtifact(instance.currentContractClassId);
171
- if (!artifact) {
172
- throw new Error(`Missing contract artifact for class id ${instance.currentContractClassId} for contract ${instance.address}`);
173
- }
232
+ artifact = await this.contractDataProvider.getContractArtifact(instance.currentContractClassId);
174
233
  }
175
- await this.db.addContractInstance(instance);
234
+ await this.contractDataProvider.addContractInstance(instance);
176
235
  this.log.info(`Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`);
177
236
  }
178
237
  async updateContract(contractAddress, artifact) {
179
- const currentInstance = await this.db.getContractInstance(contractAddress);
180
- if (!currentInstance) {
181
- throw new Error(`Contract ${contractAddress.toString()} is not registered.`);
182
- }
238
+ const currentInstance = await this.contractDataProvider.getContractInstance(contractAddress);
183
239
  const contractClass = await getContractClassFromArtifact(artifact);
184
240
  await this.synchronizer.sync();
185
- const header = await this.db.getBlockHeader();
186
- const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.pxeDataProvider, header.globalVariables.blockNumber.toNumber());
241
+ const header = await this.syncDataProvider.getBlockHeader();
242
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header.globalVariables.blockNumber.toNumber());
187
243
  if (!contractClass.id.equals(currentClassId)) {
188
244
  throw new Error('Could not update contract to a class different from the current one.');
189
245
  }
190
- await this.db.addContractArtifact(contractClass.id, artifact);
246
+ await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
191
247
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
192
248
  await this.node.registerContractFunctionSignatures(contractAddress, publicFunctionSignatures);
193
249
  // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration
@@ -197,24 +253,21 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
197
253
  unconstrainedFunctions: []
198
254
  });
199
255
  currentInstance.currentContractClassId = contractClass.id;
200
- await this.db.addContractInstance(currentInstance);
256
+ await this.contractDataProvider.addContractInstance(currentInstance);
201
257
  this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
202
258
  }
203
259
  getContracts() {
204
- return this.db.getContractsAddresses();
260
+ return this.contractDataProvider.getContractsAddresses();
205
261
  }
206
262
  async getPublicStorageAt(contract, slot) {
207
- if (!await this.getContractInstance(contract)) {
208
- throw new Error(`Contract ${contract.toString()} is not deployed`);
209
- }
210
263
  return await this.node.getPublicStorageAt('latest', contract, slot);
211
264
  }
212
265
  async getNotes(filter) {
213
- const noteDaos = await this.db.getNotes(filter);
266
+ const noteDaos = await this.noteDataProvider.getNotes(filter);
214
267
  const extendedNotes = noteDaos.map(async (dao)=>{
215
268
  let owner = filter.owner;
216
269
  if (owner === undefined) {
217
- const completeAddresses = await this.db.getCompleteAddresses();
270
+ const completeAddresses = await this.addressDataProvider.getCompleteAddresses();
218
271
  const completeAddressIndex = (await Promise.all(completeAddresses.map((completeAddresses)=>completeAddresses.address.toAddressPoint()))).findIndex((addressPoint)=>addressPoint.equals(dao.addressPoint));
219
272
  const completeAddress = completeAddresses[completeAddressIndex];
220
273
  if (completeAddress === undefined) {
@@ -360,7 +413,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
360
413
  return this.node.getContractClassLogs(filter);
361
414
  }
362
415
  async #getFunctionCall(functionName, args, to) {
363
- const contract = await this.db.getContract(to);
416
+ const contract = await this.contractDataProvider.getContract(to);
364
417
  if (!contract) {
365
418
  throw new Error(`Unknown contract ${to}: add it to PXE Service by calling server.addContracts(...).\nSee docs for context: https://docs.aztec.network/developers/reference/debugging/aztecnr-errors#unknown-contract-0x0-add-it-to-pxe-by-calling-serveraddcontracts`);
366
419
  }
@@ -412,8 +465,8 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
412
465
  const registered = {};
413
466
  for (const name of protocolContractNames){
414
467
  const { address, contractClass, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
415
- await this.db.addContractArtifact(contractClass.id, artifact);
416
- await this.db.addContractInstance(instance);
468
+ await this.contractDataProvider.addContractArtifact(contractClass.id, artifact);
469
+ await this.contractDataProvider.addContractInstance(instance);
417
470
  registered[name] = address.toString();
418
471
  }
419
472
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
@@ -441,7 +494,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
441
494
  return result;
442
495
  } catch (err) {
443
496
  if (err instanceof SimulationError) {
444
- await enrichSimulationError(err, this.db, this.log);
497
+ await enrichSimulationError(err, this.contractDataProvider, this.log);
445
498
  }
446
499
  throw err;
447
500
  }
@@ -463,7 +516,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
463
516
  return result;
464
517
  } catch (err) {
465
518
  if (err instanceof SimulationError) {
466
- await enrichSimulationError(err, this.db, this.log);
519
+ await enrichSimulationError(err, this.contractDataProvider, this.log);
467
520
  }
468
521
  throw err;
469
522
  }
@@ -485,7 +538,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
485
538
  } catch (err) {
486
539
  if (err instanceof SimulationError) {
487
540
  try {
488
- await enrichPublicSimulationError(err, this.contractDataProvider, this.db, this.log);
541
+ await enrichPublicSimulationError(err, this.contractDataProvider, this.log);
489
542
  } catch (enrichErr) {
490
543
  this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
491
544
  }
@@ -593,7 +646,7 @@ import { enrichPublicSimulationError, enrichSimulationError } from './error_enri
593
646
  return decodedEvents;
594
647
  }
595
648
  async resetNoteSyncData() {
596
- return await this.db.resetNoteSyncData();
649
+ return await this.taggingDataProvider.resetNoteSyncData();
597
650
  }
598
651
  contextualizeError(err, ...context) {
599
652
  let contextStr = '';
@@ -0,0 +1,13 @@
1
+ import type { AztecAsyncKVStore } from '@aztec/kv-store';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import { CompleteAddress } from '@aztec/stdlib/contract';
4
+ import type { DataProvider } from '../data_provider.js';
5
+ export declare class AddressDataProvider implements DataProvider {
6
+ #private;
7
+ constructor(store: AztecAsyncKVStore);
8
+ addCompleteAddress(completeAddress: CompleteAddress): Promise<boolean>;
9
+ getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined>;
10
+ getCompleteAddresses(): Promise<CompleteAddress[]>;
11
+ getSize(): Promise<number>;
12
+ }
13
+ //# sourceMappingURL=address_data_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/address_data_provider/address_data_provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,mBAAoB,YAAW,YAAY;;gBAK1C,KAAK,EAAE,iBAAiB;IAOpC,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCtE,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAIzE,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAMlD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjC"}
@@ -0,0 +1,50 @@
1
+ import { toArray } from '@aztec/foundation/iterable';
2
+ import { CompleteAddress } from '@aztec/stdlib/contract';
3
+ export class AddressDataProvider {
4
+ #store;
5
+ #completeAddresses;
6
+ #completeAddressIndex;
7
+ constructor(store){
8
+ this.#store = store;
9
+ this.#completeAddresses = this.#store.openArray('complete_addresses');
10
+ this.#completeAddressIndex = this.#store.openMap('complete_address_index');
11
+ }
12
+ addCompleteAddress(completeAddress) {
13
+ return this.#store.transactionAsync(async ()=>{
14
+ // TODO readd this
15
+ // await this.#addScope(completeAddress.address);
16
+ const addressString = completeAddress.address.toString();
17
+ const buffer = completeAddress.toBuffer();
18
+ const existing = await this.#completeAddressIndex.getAsync(addressString);
19
+ if (existing === undefined) {
20
+ const index = await this.#completeAddresses.lengthAsync();
21
+ await this.#completeAddresses.push(buffer);
22
+ await this.#completeAddressIndex.set(addressString, index);
23
+ return true;
24
+ } else {
25
+ const existingBuffer = await this.#completeAddresses.atAsync(existing);
26
+ if (existingBuffer && Buffer.from(existingBuffer).equals(buffer)) {
27
+ return false;
28
+ }
29
+ throw new Error(`Complete address with aztec address ${addressString} but different public key or partial key already exists in memory database`);
30
+ }
31
+ });
32
+ }
33
+ async #getCompleteAddress(address) {
34
+ const index = await this.#completeAddressIndex.getAsync(address.toString());
35
+ if (index === undefined) {
36
+ return undefined;
37
+ }
38
+ const value = await this.#completeAddresses.atAsync(index);
39
+ return value ? await CompleteAddress.fromBuffer(value) : undefined;
40
+ }
41
+ getCompleteAddress(account) {
42
+ return this.#getCompleteAddress(account);
43
+ }
44
+ async getCompleteAddresses() {
45
+ return await Promise.all((await toArray(this.#completeAddresses.valuesAsync())).map((v)=>CompleteAddress.fromBuffer(v)));
46
+ }
47
+ async getSize() {
48
+ return await this.#completeAddresses.lengthAsync() * CompleteAddress.SIZE_IN_BYTES;
49
+ }
50
+ }
@@ -0,0 +1,2 @@
1
+ export { AddressDataProvider } from './address_data_provider.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/address_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1 @@
1
+ export { AddressDataProvider } from './address_data_provider.js';
@@ -0,0 +1,11 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import type { AztecAsyncKVStore } from '@aztec/kv-store';
3
+ import type { DataProvider } from '../data_provider.js';
4
+ export declare class AuthWitnessDataProvider implements DataProvider {
5
+ #private;
6
+ constructor(store: AztecAsyncKVStore);
7
+ addAuthWitness(messageHash: Fr, witness: Fr[]): Promise<void>;
8
+ getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined>;
9
+ getSize(): Promise<number>;
10
+ }
11
+ //# sourceMappingURL=auth_witness_data_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth_witness_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/auth_witness_data_provider/auth_witness_data_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,uBAAwB,YAAW,YAAY;;gBAI9C,KAAK,EAAE,iBAAiB;IAK9B,cAAc,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,cAAc,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;IAK1D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAMjC"}
@@ -0,0 +1,20 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { toArray } from '@aztec/foundation/iterable';
3
+ export class AuthWitnessDataProvider {
4
+ #store;
5
+ #authWitnesses;
6
+ constructor(store){
7
+ this.#store = store;
8
+ this.#authWitnesses = this.#store.openMap('auth_witnesses');
9
+ }
10
+ async addAuthWitness(messageHash, witness) {
11
+ await this.#authWitnesses.set(messageHash.toString(), witness.map((w)=>w.toBuffer()));
12
+ }
13
+ async getAuthWitness(messageHash) {
14
+ const witness = await this.#authWitnesses.getAsync(messageHash.toString());
15
+ return witness?.map((w)=>Fr.fromBuffer(w));
16
+ }
17
+ async getSize() {
18
+ return (await toArray(this.#authWitnesses.valuesAsync())).reduce((sum, value)=>sum + value.length * Fr.SIZE_IN_BYTES, 0);
19
+ }
20
+ }
@@ -0,0 +1,2 @@
1
+ export { AuthWitnessDataProvider } from './auth_witness_data_provider.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/auth_witness_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1 @@
1
+ export { AuthWitnessDataProvider } from './auth_witness_data_provider.js';
@@ -0,0 +1,16 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { type LogFn } from '@aztec/foundation/log';
3
+ import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import type { DataProvider } from '../data_provider.js';
6
+ export declare class CapsuleDataProvider implements DataProvider {
7
+ #private;
8
+ debug: LogFn;
9
+ constructor(store: AztecAsyncKVStore);
10
+ storeCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[]): Promise<void>;
11
+ loadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null>;
12
+ deleteCapsule(contractAddress: AztecAddress, slot: Fr): Promise<void>;
13
+ copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number): Promise<void>;
14
+ getSize(): Promise<number>;
15
+ }
16
+ //# sourceMappingURL=capsule_data_provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capsule_data_provider.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_data_provider/capsule_data_provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,KAAK,EAAyB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,mBAAoB,YAAW,YAAY;;IAMtD,KAAK,EAAE,KAAK,CAAC;gBAED,KAAK,EAAE,iBAAiB;IAQ9B,YAAY,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAInF,WAAW,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;IAa1E,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,WAAW,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhG,OAAO;CAMrB"}
@@ -0,0 +1,57 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { toArray } from '@aztec/foundation/iterable';
3
+ import { createDebugOnlyLogger } from '@aztec/foundation/log';
4
+ export class CapsuleDataProvider {
5
+ #store;
6
+ // Arbitrary data stored by contracts. Key is computed as `${contractAddress}:${key}`
7
+ #capsules;
8
+ debug;
9
+ constructor(store){
10
+ this.#store = store;
11
+ this.#capsules = this.#store.openMap('capsules');
12
+ this.debug = createDebugOnlyLogger('pxe:capsule-data-provider');
13
+ }
14
+ async storeCapsule(contractAddress, slot, capsule) {
15
+ await this.#capsules.set(dbSlotToKey(contractAddress, slot), Buffer.concat(capsule.map((value)=>value.toBuffer())));
16
+ }
17
+ async loadCapsule(contractAddress, slot) {
18
+ const dataBuffer = await this.#capsules.getAsync(dbSlotToKey(contractAddress, slot));
19
+ if (!dataBuffer) {
20
+ this.debug(`Data not found for contract ${contractAddress.toString()} and slot ${slot.toString()}`);
21
+ return null;
22
+ }
23
+ const capsule = [];
24
+ for(let i = 0; i < dataBuffer.length; i += Fr.SIZE_IN_BYTES){
25
+ capsule.push(Fr.fromBuffer(dataBuffer.subarray(i, i + Fr.SIZE_IN_BYTES)));
26
+ }
27
+ return capsule;
28
+ }
29
+ async deleteCapsule(contractAddress, slot) {
30
+ await this.#capsules.delete(dbSlotToKey(contractAddress, slot));
31
+ }
32
+ async copyCapsule(contractAddress, srcSlot, dstSlot, numEntries) {
33
+ // In order to support overlapping source and destination regions, we need to check the relative positions of source
34
+ // and destination. If destination is ahead of source, then by the time we overwrite source elements using forward
35
+ // indexes we'll have already read those. On the contrary, if source is ahead of destination we need to use backward
36
+ // indexes to avoid reading elements that've been overwritten.
37
+ const indexes = Array.from(Array(numEntries).keys());
38
+ if (srcSlot.lt(dstSlot)) {
39
+ indexes.reverse();
40
+ }
41
+ for (const i of indexes){
42
+ const currentSrcSlot = dbSlotToKey(contractAddress, srcSlot.add(new Fr(i)));
43
+ const currentDstSlot = dbSlotToKey(contractAddress, dstSlot.add(new Fr(i)));
44
+ const toCopy = await this.#capsules.getAsync(currentSrcSlot);
45
+ if (!toCopy) {
46
+ throw new Error(`Attempted to copy empty slot ${currentSrcSlot} for contract ${contractAddress.toString()}`);
47
+ }
48
+ await this.#capsules.set(currentDstSlot, toCopy);
49
+ }
50
+ }
51
+ async getSize() {
52
+ return (await toArray(this.#capsules.valuesAsync())).reduce((sum, value)=>sum + value.length * Fr.SIZE_IN_BYTES, 0);
53
+ }
54
+ }
55
+ function dbSlotToKey(contractAddress, slot) {
56
+ return `${contractAddress.toString()}:${slot.toString()}`;
57
+ }
@@ -0,0 +1,2 @@
1
+ export { CapsuleDataProvider } from './capsule_data_provider.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_data_provider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1 @@
1
+ export { CapsuleDataProvider } from './capsule_data_provider.js';