@aztec/archiver 0.0.0-test.1 → 0.0.1-commit.0b941701

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 (219) hide show
  1. package/README.md +164 -9
  2. package/dest/archiver.d.ts +135 -0
  3. package/dest/archiver.d.ts.map +1 -0
  4. package/dest/archiver.js +768 -0
  5. package/dest/config.d.ts +30 -0
  6. package/dest/config.d.ts.map +1 -0
  7. package/dest/config.js +71 -0
  8. package/dest/errors.d.ts +41 -0
  9. package/dest/errors.d.ts.map +1 -0
  10. package/dest/errors.js +62 -0
  11. package/dest/factory.d.ts +11 -16
  12. package/dest/factory.d.ts.map +1 -1
  13. package/dest/factory.js +102 -53
  14. package/dest/index.d.ts +10 -4
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +8 -3
  17. package/dest/interfaces.d.ts +9 -0
  18. package/dest/interfaces.d.ts.map +1 -0
  19. package/dest/interfaces.js +3 -0
  20. package/dest/l1/bin/retrieve-calldata.d.ts +3 -0
  21. package/dest/l1/bin/retrieve-calldata.d.ts.map +1 -0
  22. package/dest/l1/bin/retrieve-calldata.js +149 -0
  23. package/dest/l1/calldata_retriever.d.ts +112 -0
  24. package/dest/l1/calldata_retriever.d.ts.map +1 -0
  25. package/dest/l1/calldata_retriever.js +471 -0
  26. package/dest/l1/data_retrieval.d.ts +88 -0
  27. package/dest/l1/data_retrieval.d.ts.map +1 -0
  28. package/dest/l1/data_retrieval.js +312 -0
  29. package/dest/l1/debug_tx.d.ts +19 -0
  30. package/dest/l1/debug_tx.d.ts.map +1 -0
  31. package/dest/l1/debug_tx.js +73 -0
  32. package/dest/l1/spire_proposer.d.ts +70 -0
  33. package/dest/l1/spire_proposer.d.ts.map +1 -0
  34. package/dest/l1/spire_proposer.js +157 -0
  35. package/dest/l1/trace_tx.d.ts +97 -0
  36. package/dest/l1/trace_tx.d.ts.map +1 -0
  37. package/dest/l1/trace_tx.js +91 -0
  38. package/dest/l1/types.d.ts +12 -0
  39. package/dest/l1/types.d.ts.map +1 -0
  40. package/dest/l1/types.js +3 -0
  41. package/dest/l1/validate_trace.d.ts +29 -0
  42. package/dest/l1/validate_trace.d.ts.map +1 -0
  43. package/dest/l1/validate_trace.js +150 -0
  44. package/dest/modules/data_source_base.d.ts +84 -0
  45. package/dest/modules/data_source_base.d.ts.map +1 -0
  46. package/dest/modules/data_source_base.js +260 -0
  47. package/dest/modules/data_store_updater.d.ts +73 -0
  48. package/dest/modules/data_store_updater.d.ts.map +1 -0
  49. package/dest/modules/data_store_updater.js +302 -0
  50. package/dest/modules/instrumentation.d.ts +37 -0
  51. package/dest/modules/instrumentation.d.ts.map +1 -0
  52. package/dest/{archiver → modules}/instrumentation.js +45 -41
  53. package/dest/modules/l1_synchronizer.d.ts +75 -0
  54. package/dest/modules/l1_synchronizer.d.ts.map +1 -0
  55. package/dest/modules/l1_synchronizer.js +1113 -0
  56. package/dest/modules/validation.d.ts +17 -0
  57. package/dest/modules/validation.d.ts.map +1 -0
  58. package/dest/modules/validation.js +104 -0
  59. package/dest/store/block_store.d.ts +192 -0
  60. package/dest/store/block_store.d.ts.map +1 -0
  61. package/dest/store/block_store.js +721 -0
  62. package/dest/store/contract_class_store.d.ts +18 -0
  63. package/dest/store/contract_class_store.d.ts.map +1 -0
  64. package/dest/{archiver/kv_archiver_store → store}/contract_class_store.js +14 -20
  65. package/dest/store/contract_instance_store.d.ts +24 -0
  66. package/dest/store/contract_instance_store.d.ts.map +1 -0
  67. package/dest/store/contract_instance_store.js +77 -0
  68. package/dest/store/kv_archiver_store.d.ts +340 -0
  69. package/dest/store/kv_archiver_store.d.ts.map +1 -0
  70. package/dest/store/kv_archiver_store.js +447 -0
  71. package/dest/store/log_store.d.ts +54 -0
  72. package/dest/store/log_store.d.ts.map +1 -0
  73. package/dest/store/log_store.js +436 -0
  74. package/dest/store/message_store.d.ts +40 -0
  75. package/dest/store/message_store.d.ts.map +1 -0
  76. package/dest/store/message_store.js +188 -0
  77. package/dest/structs/data_retrieval.d.ts +27 -0
  78. package/dest/structs/data_retrieval.d.ts.map +1 -0
  79. package/dest/structs/inbox_message.d.ts +15 -0
  80. package/dest/structs/inbox_message.d.ts.map +1 -0
  81. package/dest/structs/inbox_message.js +39 -0
  82. package/dest/structs/published.d.ts +2 -0
  83. package/dest/structs/published.d.ts.map +1 -0
  84. package/dest/structs/published.js +1 -0
  85. package/dest/test/fake_l1_state.d.ts +190 -0
  86. package/dest/test/fake_l1_state.d.ts.map +1 -0
  87. package/dest/test/fake_l1_state.js +383 -0
  88. package/dest/test/index.d.ts +2 -1
  89. package/dest/test/index.d.ts.map +1 -1
  90. package/dest/test/index.js +1 -0
  91. package/dest/test/mock_archiver.d.ts +16 -8
  92. package/dest/test/mock_archiver.d.ts.map +1 -1
  93. package/dest/test/mock_archiver.js +18 -14
  94. package/dest/test/mock_l1_to_l2_message_source.d.ts +9 -6
  95. package/dest/test/mock_l1_to_l2_message_source.d.ts.map +1 -1
  96. package/dest/test/mock_l1_to_l2_message_source.js +30 -7
  97. package/dest/test/mock_l2_block_source.d.ts +62 -16
  98. package/dest/test/mock_l2_block_source.d.ts.map +1 -1
  99. package/dest/test/mock_l2_block_source.js +263 -32
  100. package/dest/test/mock_structs.d.ts +84 -0
  101. package/dest/test/mock_structs.d.ts.map +1 -0
  102. package/dest/test/mock_structs.js +169 -0
  103. package/package.json +30 -33
  104. package/src/archiver.ts +523 -0
  105. package/src/config.ts +95 -0
  106. package/src/errors.ts +102 -0
  107. package/src/factory.ts +142 -69
  108. package/src/index.ts +10 -3
  109. package/src/interfaces.ts +9 -0
  110. package/src/l1/README.md +98 -0
  111. package/src/l1/bin/retrieve-calldata.ts +187 -0
  112. package/src/l1/calldata_retriever.ts +641 -0
  113. package/src/l1/data_retrieval.ts +495 -0
  114. package/src/l1/debug_tx.ts +99 -0
  115. package/src/l1/spire_proposer.ts +160 -0
  116. package/src/l1/trace_tx.ts +128 -0
  117. package/src/l1/types.ts +13 -0
  118. package/src/l1/validate_trace.ts +211 -0
  119. package/src/modules/data_source_base.ts +367 -0
  120. package/src/modules/data_store_updater.ts +423 -0
  121. package/src/{archiver → modules}/instrumentation.ts +63 -43
  122. package/src/modules/l1_synchronizer.ts +931 -0
  123. package/src/modules/validation.ts +129 -0
  124. package/src/store/block_store.ts +966 -0
  125. package/src/{archiver/kv_archiver_store → store}/contract_class_store.ts +15 -25
  126. package/src/{archiver/kv_archiver_store → store}/contract_instance_store.ts +37 -29
  127. package/src/store/kv_archiver_store.ts +639 -0
  128. package/src/store/log_store.ts +575 -0
  129. package/src/store/message_store.ts +261 -0
  130. package/src/structs/inbox_message.ts +41 -0
  131. package/src/structs/published.ts +1 -0
  132. package/src/test/fake_l1_state.ts +599 -0
  133. package/src/test/fixtures/debug_traceTransaction-multicall3.json +88 -0
  134. package/src/test/fixtures/debug_traceTransaction-multiplePropose.json +153 -0
  135. package/src/test/fixtures/debug_traceTransaction-proxied.json +122 -0
  136. package/src/test/fixtures/trace_transaction-multicall3.json +65 -0
  137. package/src/test/fixtures/trace_transaction-multiplePropose.json +319 -0
  138. package/src/test/fixtures/trace_transaction-proxied.json +128 -0
  139. package/src/test/fixtures/trace_transaction-randomRevert.json +216 -0
  140. package/src/test/index.ts +1 -0
  141. package/src/test/mock_archiver.ts +22 -16
  142. package/src/test/mock_l1_to_l2_message_source.ts +26 -8
  143. package/src/test/mock_l2_block_source.ts +312 -41
  144. package/src/test/mock_structs.ts +295 -0
  145. package/dest/archiver/archiver.d.ts +0 -197
  146. package/dest/archiver/archiver.d.ts.map +0 -1
  147. package/dest/archiver/archiver.js +0 -900
  148. package/dest/archiver/archiver_store.d.ts +0 -220
  149. package/dest/archiver/archiver_store.d.ts.map +0 -1
  150. package/dest/archiver/archiver_store.js +0 -4
  151. package/dest/archiver/archiver_store_test_suite.d.ts +0 -8
  152. package/dest/archiver/archiver_store_test_suite.d.ts.map +0 -1
  153. package/dest/archiver/archiver_store_test_suite.js +0 -794
  154. package/dest/archiver/config.d.ts +0 -37
  155. package/dest/archiver/config.d.ts.map +0 -1
  156. package/dest/archiver/config.js +0 -46
  157. package/dest/archiver/data_retrieval.d.ts +0 -74
  158. package/dest/archiver/data_retrieval.d.ts.map +0 -1
  159. package/dest/archiver/data_retrieval.js +0 -283
  160. package/dest/archiver/errors.d.ts +0 -4
  161. package/dest/archiver/errors.d.ts.map +0 -1
  162. package/dest/archiver/errors.js +0 -5
  163. package/dest/archiver/index.d.ts +0 -8
  164. package/dest/archiver/index.d.ts.map +0 -1
  165. package/dest/archiver/index.js +0 -5
  166. package/dest/archiver/instrumentation.d.ts +0 -29
  167. package/dest/archiver/instrumentation.d.ts.map +0 -1
  168. package/dest/archiver/kv_archiver_store/block_store.d.ts +0 -87
  169. package/dest/archiver/kv_archiver_store/block_store.d.ts.map +0 -1
  170. package/dest/archiver/kv_archiver_store/block_store.js +0 -217
  171. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts +0 -18
  172. package/dest/archiver/kv_archiver_store/contract_class_store.d.ts.map +0 -1
  173. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts +0 -21
  174. package/dest/archiver/kv_archiver_store/contract_instance_store.d.ts.map +0 -1
  175. package/dest/archiver/kv_archiver_store/contract_instance_store.js +0 -63
  176. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts +0 -153
  177. package/dest/archiver/kv_archiver_store/kv_archiver_store.d.ts.map +0 -1
  178. package/dest/archiver/kv_archiver_store/kv_archiver_store.js +0 -254
  179. package/dest/archiver/kv_archiver_store/log_store.d.ts +0 -49
  180. package/dest/archiver/kv_archiver_store/log_store.d.ts.map +0 -1
  181. package/dest/archiver/kv_archiver_store/log_store.js +0 -364
  182. package/dest/archiver/kv_archiver_store/message_store.d.ts +0 -33
  183. package/dest/archiver/kv_archiver_store/message_store.d.ts.map +0 -1
  184. package/dest/archiver/kv_archiver_store/message_store.js +0 -85
  185. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts +0 -12
  186. package/dest/archiver/kv_archiver_store/nullifier_store.d.ts.map +0 -1
  187. package/dest/archiver/kv_archiver_store/nullifier_store.js +0 -73
  188. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts +0 -23
  189. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.d.ts.map +0 -1
  190. package/dest/archiver/memory_archiver_store/l1_to_l2_message_store.js +0 -49
  191. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts +0 -175
  192. package/dest/archiver/memory_archiver_store/memory_archiver_store.d.ts.map +0 -1
  193. package/dest/archiver/memory_archiver_store/memory_archiver_store.js +0 -636
  194. package/dest/archiver/structs/data_retrieval.d.ts +0 -27
  195. package/dest/archiver/structs/data_retrieval.d.ts.map +0 -1
  196. package/dest/archiver/structs/published.d.ts +0 -11
  197. package/dest/archiver/structs/published.d.ts.map +0 -1
  198. package/dest/archiver/structs/published.js +0 -1
  199. package/dest/rpc/index.d.ts +0 -10
  200. package/dest/rpc/index.d.ts.map +0 -1
  201. package/dest/rpc/index.js +0 -18
  202. package/src/archiver/archiver.ts +0 -1181
  203. package/src/archiver/archiver_store.ts +0 -263
  204. package/src/archiver/archiver_store_test_suite.ts +0 -810
  205. package/src/archiver/config.ts +0 -92
  206. package/src/archiver/data_retrieval.ts +0 -422
  207. package/src/archiver/errors.ts +0 -5
  208. package/src/archiver/index.ts +0 -7
  209. package/src/archiver/kv_archiver_store/block_store.ts +0 -283
  210. package/src/archiver/kv_archiver_store/kv_archiver_store.ts +0 -358
  211. package/src/archiver/kv_archiver_store/log_store.ts +0 -444
  212. package/src/archiver/kv_archiver_store/message_store.ts +0 -102
  213. package/src/archiver/kv_archiver_store/nullifier_store.ts +0 -97
  214. package/src/archiver/memory_archiver_store/l1_to_l2_message_store.ts +0 -61
  215. package/src/archiver/memory_archiver_store/memory_archiver_store.ts +0 -801
  216. package/src/archiver/structs/published.ts +0 -11
  217. package/src/rpc/index.ts +0 -20
  218. /package/dest/{archiver/structs → structs}/data_retrieval.js +0 -0
  219. /package/src/{archiver/structs → structs}/data_retrieval.ts +0 -0
@@ -1,4 +1,4 @@
1
- import { Fr } from '@aztec/foundation/fields';
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import { toArray } from '@aztec/foundation/iterable';
3
3
  import { BufferReader, numToUInt8, serializeToBuffer } from '@aztec/foundation/serialize';
4
4
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
@@ -7,12 +7,12 @@ import type {
7
7
  ContractClassPublic,
8
8
  ContractClassPublicWithBlockNumber,
9
9
  ExecutablePrivateFunctionWithMembershipProof,
10
- UnconstrainedFunctionWithMembershipProof,
10
+ UtilityFunctionWithMembershipProof,
11
11
  } from '@aztec/stdlib/contract';
12
12
  import { Vector } from '@aztec/stdlib/types';
13
13
 
14
14
  /**
15
- * LMDB implementation of the ArchiverDataStore interface.
15
+ * LMDB-based contract class storage for the archiver.
16
16
  */
17
17
  export class ContractClassStore {
18
18
  #contractClasses: AztecAsyncMap<string, Buffer>;
@@ -60,7 +60,7 @@ export class ContractClassStore {
60
60
  async addFunctions(
61
61
  contractClassId: Fr,
62
62
  newPrivateFunctions: ExecutablePrivateFunctionWithMembershipProof[],
63
- newUnconstrainedFunctions: UnconstrainedFunctionWithMembershipProof[],
63
+ newUtilityFunctions: UtilityFunctionWithMembershipProof[],
64
64
  ): Promise<boolean> {
65
65
  await this.db.transactionAsync(async () => {
66
66
  const existingClassBuffer = await this.#contractClasses.getAsync(contractClassId.toString());
@@ -69,7 +69,7 @@ export class ContractClassStore {
69
69
  }
70
70
 
71
71
  const existingClass = deserializeContractClassPublic(existingClassBuffer);
72
- const { privateFunctions: existingPrivateFns, unconstrainedFunctions: existingUnconstrainedFns } = existingClass;
72
+ const { privateFunctions: existingPrivateFns, utilityFunctions: existingUtilityFns } = existingClass;
73
73
 
74
74
  const updatedClass: Omit<ContractClassPublicWithBlockNumber, 'id'> = {
75
75
  ...existingClass,
@@ -77,11 +77,9 @@ export class ContractClassStore {
77
77
  ...existingPrivateFns,
78
78
  ...newPrivateFunctions.filter(newFn => !existingPrivateFns.some(f => f.selector.equals(newFn.selector))),
79
79
  ],
80
- unconstrainedFunctions: [
81
- ...existingUnconstrainedFns,
82
- ...newUnconstrainedFunctions.filter(
83
- newFn => !existingUnconstrainedFns.some(f => f.selector.equals(newFn.selector)),
84
- ),
80
+ utilityFunctions: [
81
+ ...existingUtilityFns,
82
+ ...newUtilityFunctions.filter(newFn => !existingUtilityFns.some(f => f.selector.equals(newFn.selector))),
85
83
  ],
86
84
  };
87
85
  await this.#contractClasses.set(contractClassId.toString(), serializeContractClassPublic(updatedClass));
@@ -96,12 +94,10 @@ function serializeContractClassPublic(contractClass: Omit<ContractClassPublicWit
96
94
  contractClass.l2BlockNumber,
97
95
  numToUInt8(contractClass.version),
98
96
  contractClass.artifactHash,
99
- contractClass.publicFunctions.length,
100
- contractClass.publicFunctions?.map(f => serializeToBuffer(f.selector, f.bytecode.length, f.bytecode)) ?? [],
101
97
  contractClass.privateFunctions.length,
102
98
  contractClass.privateFunctions.map(serializePrivateFunction),
103
- contractClass.unconstrainedFunctions.length,
104
- contractClass.unconstrainedFunctions.map(serializeUnconstrainedFunction),
99
+ contractClass.utilityFunctions.length,
100
+ contractClass.utilityFunctions.map(serializeUtilityFunction),
105
101
  contractClass.packedBytecode.length,
106
102
  contractClass.packedBytecode,
107
103
  contractClass.privateFunctionsRoot,
@@ -116,7 +112,7 @@ function serializePrivateFunction(fn: ExecutablePrivateFunctionWithMembershipPro
116
112
  fn.bytecode,
117
113
  fn.functionMetadataHash,
118
114
  fn.artifactMetadataHash,
119
- fn.unconstrainedFunctionsArtifactTreeRoot,
115
+ fn.utilityFunctionsTreeRoot,
120
116
  new Vector(fn.privateFunctionTreeSiblingPath),
121
117
  fn.privateFunctionTreeLeafIndex,
122
118
  new Vector(fn.artifactTreeSiblingPath),
@@ -124,7 +120,7 @@ function serializePrivateFunction(fn: ExecutablePrivateFunctionWithMembershipPro
124
120
  );
125
121
  }
126
122
 
127
- function serializeUnconstrainedFunction(fn: UnconstrainedFunctionWithMembershipProof): Buffer {
123
+ function serializeUtilityFunction(fn: UtilityFunctionWithMembershipProof): Buffer {
128
124
  return serializeToBuffer(
129
125
  fn.selector,
130
126
  fn.bytecode.length,
@@ -143,14 +139,8 @@ function deserializeContractClassPublic(buffer: Buffer): Omit<ContractClassPubli
143
139
  l2BlockNumber: reader.readNumber(),
144
140
  version: reader.readUInt8() as 1,
145
141
  artifactHash: reader.readObject(Fr),
146
- publicFunctions: reader.readVector({
147
- fromBuffer: reader => ({
148
- selector: reader.readObject(FunctionSelector),
149
- bytecode: reader.readBuffer(),
150
- }),
151
- }),
152
142
  privateFunctions: reader.readVector({ fromBuffer: deserializePrivateFunction }),
153
- unconstrainedFunctions: reader.readVector({ fromBuffer: deserializeUnconstrainedFunction }),
143
+ utilityFunctions: reader.readVector({ fromBuffer: deserializeUtilityFunction }),
154
144
  packedBytecode: reader.readBuffer(),
155
145
  privateFunctionsRoot: reader.readObject(Fr),
156
146
  };
@@ -164,7 +154,7 @@ function deserializePrivateFunction(buffer: Buffer | BufferReader): ExecutablePr
164
154
  bytecode: reader.readBuffer(),
165
155
  functionMetadataHash: reader.readObject(Fr),
166
156
  artifactMetadataHash: reader.readObject(Fr),
167
- unconstrainedFunctionsArtifactTreeRoot: reader.readObject(Fr),
157
+ utilityFunctionsTreeRoot: reader.readObject(Fr),
168
158
  privateFunctionTreeSiblingPath: reader.readVector(Fr),
169
159
  privateFunctionTreeLeafIndex: reader.readNumber(),
170
160
  artifactTreeSiblingPath: reader.readVector(Fr),
@@ -172,7 +162,7 @@ function deserializePrivateFunction(buffer: Buffer | BufferReader): ExecutablePr
172
162
  };
173
163
  }
174
164
 
175
- function deserializeUnconstrainedFunction(buffer: Buffer | BufferReader): UnconstrainedFunctionWithMembershipProof {
165
+ function deserializeUtilityFunction(buffer: Buffer | BufferReader): UtilityFunctionWithMembershipProof {
176
166
  const reader = BufferReader.asReader(buffer);
177
167
  return {
178
168
  selector: reader.readObject(FunctionSelector),
@@ -1,4 +1,4 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
2
  import type { AztecAsyncKVStore, AztecAsyncMap } from '@aztec/kv-store';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import {
@@ -7,71 +7,75 @@ import {
7
7
  SerializableContractInstance,
8
8
  SerializableContractInstanceUpdate,
9
9
  } from '@aztec/stdlib/contract';
10
+ import type { UInt64 } from '@aztec/stdlib/types';
10
11
 
11
- type ContractInstanceUpdateKey = [string, number] | [string, number, number];
12
+ type ContractInstanceUpdateKey = [string, string] | [string, string, number];
12
13
 
13
14
  /**
14
- * LMDB implementation of the ArchiverDataStore interface.
15
+ * LMDB-based contract instance storage for the archiver.
15
16
  */
16
17
  export class ContractInstanceStore {
17
18
  #contractInstances: AztecAsyncMap<string, Buffer>;
19
+ #contractInstancePublishedAt: AztecAsyncMap<string, number>;
18
20
  #contractInstanceUpdates: AztecAsyncMap<ContractInstanceUpdateKey, Buffer>;
19
21
 
20
- constructor(db: AztecAsyncKVStore) {
22
+ constructor(private db: AztecAsyncKVStore) {
21
23
  this.#contractInstances = db.openMap('archiver_contract_instances');
24
+ this.#contractInstancePublishedAt = db.openMap('archiver_contract_instances_publication_block_number');
22
25
  this.#contractInstanceUpdates = db.openMap('archiver_contract_instance_updates');
23
26
  }
24
27
 
25
- addContractInstance(contractInstance: ContractInstanceWithAddress): Promise<void> {
26
- return this.#contractInstances.set(
27
- contractInstance.address.toString(),
28
- new SerializableContractInstance(contractInstance).toBuffer(),
29
- );
28
+ addContractInstance(contractInstance: ContractInstanceWithAddress, blockNumber: number): Promise<void> {
29
+ return this.db.transactionAsync(async () => {
30
+ await this.#contractInstances.set(
31
+ contractInstance.address.toString(),
32
+ new SerializableContractInstance(contractInstance).toBuffer(),
33
+ );
34
+ await this.#contractInstancePublishedAt.set(contractInstance.address.toString(), blockNumber);
35
+ });
30
36
  }
31
37
 
32
38
  deleteContractInstance(contractInstance: ContractInstanceWithAddress): Promise<void> {
33
- return this.#contractInstances.delete(contractInstance.address.toString());
39
+ return this.db.transactionAsync(async () => {
40
+ await this.#contractInstances.delete(contractInstance.address.toString());
41
+ await this.#contractInstancePublishedAt.delete(contractInstance.address.toString());
42
+ });
34
43
  }
35
44
 
36
- getUpdateKey(contractAddress: AztecAddress, blockNumber: number, logIndex?: number): ContractInstanceUpdateKey {
45
+ getUpdateKey(contractAddress: AztecAddress, timestamp: UInt64, logIndex?: number): ContractInstanceUpdateKey {
37
46
  if (logIndex === undefined) {
38
- return [contractAddress.toString(), blockNumber];
47
+ return [contractAddress.toString(), timestamp.toString()];
39
48
  } else {
40
- return [contractAddress.toString(), blockNumber, logIndex];
49
+ return [contractAddress.toString(), timestamp.toString(), logIndex];
41
50
  }
42
51
  }
43
52
 
44
53
  addContractInstanceUpdate(
45
54
  contractInstanceUpdate: ContractInstanceUpdateWithAddress,
46
- blockNumber: number,
55
+ timestamp: UInt64,
47
56
  logIndex: number,
48
57
  ): Promise<void> {
49
58
  return this.#contractInstanceUpdates.set(
50
- this.getUpdateKey(contractInstanceUpdate.address, blockNumber, logIndex),
59
+ this.getUpdateKey(contractInstanceUpdate.address, timestamp, logIndex),
51
60
  new SerializableContractInstanceUpdate(contractInstanceUpdate).toBuffer(),
52
61
  );
53
62
  }
54
63
 
55
64
  deleteContractInstanceUpdate(
56
65
  contractInstanceUpdate: ContractInstanceUpdateWithAddress,
57
- blockNumber: number,
66
+ timestamp: UInt64,
58
67
  logIndex: number,
59
68
  ): Promise<void> {
60
- return this.#contractInstanceUpdates.delete(
61
- this.getUpdateKey(contractInstanceUpdate.address, blockNumber, logIndex),
62
- );
69
+ return this.#contractInstanceUpdates.delete(this.getUpdateKey(contractInstanceUpdate.address, timestamp, logIndex));
63
70
  }
64
71
 
65
- async getCurrentContractInstanceClassId(
66
- address: AztecAddress,
67
- blockNumber: number,
68
- originalClassId: Fr,
69
- ): Promise<Fr> {
70
- // We need to find the last update before the given block number
72
+ async getCurrentContractInstanceClassId(address: AztecAddress, timestamp: UInt64, originalClassId: Fr): Promise<Fr> {
73
+ // We need to find the last update before the given timestamp
71
74
  const queryResult = await this.#contractInstanceUpdates
72
75
  .valuesAsync({
73
76
  reverse: true,
74
- end: this.getUpdateKey(address, blockNumber + 1), // No update can match this key since it doesn't have a log index. We want the highest key <= blockNumber
77
+ start: this.getUpdateKey(address, 0n), // Make sure we only look at updates for this contract
78
+ end: this.getUpdateKey(address, timestamp + 1n), // No update can match this key since it doesn't have a log index. We want the highest key <= timestamp
75
79
  limit: 1,
76
80
  })
77
81
  .next();
@@ -81,7 +85,7 @@ export class ContractInstanceStore {
81
85
 
82
86
  const serializedUpdate = queryResult.value;
83
87
  const update = SerializableContractInstanceUpdate.fromBuffer(serializedUpdate);
84
- if (blockNumber < update.blockOfChange) {
88
+ if (timestamp < update.timestampOfChange) {
85
89
  return update.prevContractClassId.isZero() ? originalClassId : update.prevContractClassId;
86
90
  }
87
91
  return update.newContractClassId;
@@ -89,7 +93,7 @@ export class ContractInstanceStore {
89
93
 
90
94
  async getContractInstance(
91
95
  address: AztecAddress,
92
- blockNumber: number,
96
+ timestamp: UInt64,
93
97
  ): Promise<ContractInstanceWithAddress | undefined> {
94
98
  const contractInstance = await this.#contractInstances.getAsync(address.toString());
95
99
  if (!contractInstance) {
@@ -99,9 +103,13 @@ export class ContractInstanceStore {
99
103
  const instance = SerializableContractInstance.fromBuffer(contractInstance).withAddress(address);
100
104
  instance.currentContractClassId = await this.getCurrentContractInstanceClassId(
101
105
  address,
102
- blockNumber,
106
+ timestamp,
103
107
  instance.originalContractClassId,
104
108
  );
105
109
  return instance;
106
110
  }
111
+
112
+ getContractInstanceDeploymentBlockNumber(address: AztecAddress): Promise<number | undefined> {
113
+ return this.#contractInstancePublishedAt.getAsync(address.toString());
114
+ }
107
115
  }