@proto-kit/protocol 0.1.1-develop.1087 → 0.1.1-develop.1309

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 (211) hide show
  1. package/dist/Constants.js +1 -0
  2. package/dist/Constants.js.map +1 -0
  3. package/dist/hooks/AccountStateHook.js +1 -0
  4. package/dist/hooks/AccountStateHook.js.map +1 -0
  5. package/dist/hooks/BlockHeightHook.js +1 -0
  6. package/dist/hooks/BlockHeightHook.js.map +1 -0
  7. package/dist/hooks/LastStateRootBlockHook.js +1 -0
  8. package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
  9. package/dist/hooks/NoopBlockHook.js +1 -0
  10. package/dist/hooks/NoopBlockHook.js.map +1 -0
  11. package/dist/hooks/NoopSettlementHook.d.ts +2 -2
  12. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -1
  13. package/dist/hooks/NoopSettlementHook.js +1 -0
  14. package/dist/hooks/NoopSettlementHook.js.map +1 -0
  15. package/dist/hooks/NoopTransactionHook.js +1 -0
  16. package/dist/hooks/NoopTransactionHook.js.map +1 -0
  17. package/dist/index.d.ts +6 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +7 -2
  20. package/dist/index.js.map +1 -0
  21. package/dist/model/MethodPublicOutput.js +1 -0
  22. package/dist/model/MethodPublicOutput.js.map +1 -0
  23. package/dist/model/Option.js +1 -0
  24. package/dist/model/Option.js.map +1 -0
  25. package/dist/model/Path.js +1 -0
  26. package/dist/model/Path.js.map +1 -0
  27. package/dist/model/RuntimeLike.js +1 -0
  28. package/dist/model/RuntimeLike.js.map +1 -0
  29. package/dist/model/StateTransition.js +1 -0
  30. package/dist/model/StateTransition.js.map +1 -0
  31. package/dist/model/StateTransitionProvableBatch.d.ts +28 -2
  32. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
  33. package/dist/model/StateTransitionProvableBatch.js +9 -3
  34. package/dist/model/StateTransitionProvableBatch.js.map +1 -0
  35. package/dist/model/network/NetworkState.js +1 -0
  36. package/dist/model/network/NetworkState.js.map +1 -0
  37. package/dist/model/transaction/RuntimeTransaction.js +1 -0
  38. package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
  39. package/dist/model/transaction/SignedTransaction.js +1 -0
  40. package/dist/model/transaction/SignedTransaction.js.map +1 -0
  41. package/dist/model/transaction/ValueOption.js +1 -0
  42. package/dist/model/transaction/ValueOption.js.map +1 -0
  43. package/dist/protocol/Protocol.d.ts.map +1 -1
  44. package/dist/protocol/Protocol.js +31 -6
  45. package/dist/protocol/Protocol.js.map +1 -0
  46. package/dist/protocol/ProtocolEnvironment.js +1 -0
  47. package/dist/protocol/ProtocolEnvironment.js.map +1 -0
  48. package/dist/protocol/ProtocolModule.d.ts +1 -1
  49. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  50. package/dist/protocol/ProtocolModule.js +2 -1
  51. package/dist/protocol/ProtocolModule.js.map +1 -0
  52. package/dist/protocol/ProvableBlockHook.js +1 -0
  53. package/dist/protocol/ProvableBlockHook.js.map +1 -0
  54. package/dist/protocol/ProvableTransactionHook.js +1 -0
  55. package/dist/protocol/ProvableTransactionHook.js.map +1 -0
  56. package/dist/protocol/TransitioningProtocolModule.js +1 -0
  57. package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
  58. package/dist/prover/block/BlockProvable.d.ts +19 -5
  59. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  60. package/dist/prover/block/BlockProvable.js +5 -2
  61. package/dist/prover/block/BlockProvable.js.map +1 -0
  62. package/dist/prover/block/BlockProver.d.ts +11 -9
  63. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  64. package/dist/prover/block/BlockProver.js +79 -41
  65. package/dist/prover/block/BlockProver.js.map +1 -0
  66. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -0
  67. package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
  68. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +2 -2
  69. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +1 -0
  70. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
  71. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +1 -0
  72. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
  73. package/dist/prover/statetransition/StateTransitionProvable.d.ts +2 -4
  74. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
  75. package/dist/prover/statetransition/StateTransitionProvable.js +1 -0
  76. package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
  77. package/dist/prover/statetransition/StateTransitionProver.d.ts +7 -10
  78. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  79. package/dist/prover/statetransition/StateTransitionProver.js +27 -28
  80. package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
  81. package/dist/settlement/ContractModule.d.ts +4 -3
  82. package/dist/settlement/ContractModule.d.ts.map +1 -1
  83. package/dist/settlement/ContractModule.js +2 -1
  84. package/dist/settlement/ContractModule.js.map +1 -0
  85. package/dist/settlement/SettlementContractModule.d.ts +25 -12
  86. package/dist/settlement/SettlementContractModule.d.ts.map +1 -1
  87. package/dist/settlement/SettlementContractModule.js +29 -20
  88. package/dist/settlement/SettlementContractModule.js.map +1 -0
  89. package/dist/settlement/contracts/BridgeContract.d.ts +97 -0
  90. package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
  91. package/dist/settlement/contracts/BridgeContract.js +164 -0
  92. package/dist/settlement/contracts/BridgeContract.js.map +1 -0
  93. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
  94. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
  95. package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -0
  96. package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
  97. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +10 -1
  98. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -1
  99. package/dist/settlement/contracts/DispatchContractProtocolModule.js +24 -2
  100. package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
  101. package/dist/settlement/contracts/DispatchSmartContract.d.ts +26 -4
  102. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -1
  103. package/dist/settlement/contracts/DispatchSmartContract.js +139 -19
  104. package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
  105. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +10 -8
  106. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -1
  107. package/dist/settlement/contracts/SettlementContractProtocolModule.js +47 -9
  108. package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
  109. package/dist/settlement/contracts/SettlementSmartContract.d.ts +98 -17
  110. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -1
  111. package/dist/settlement/contracts/SettlementSmartContract.js +147 -79
  112. package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
  113. package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
  114. package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
  115. package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
  116. package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
  117. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
  118. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
  119. package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
  120. package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
  121. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
  122. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
  123. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
  124. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
  125. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
  126. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
  127. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
  128. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
  129. package/dist/settlement/messages/Deposit.d.ts +13 -0
  130. package/dist/settlement/messages/Deposit.d.ts.map +1 -1
  131. package/dist/settlement/messages/Deposit.js +3 -1
  132. package/dist/settlement/messages/Deposit.js.map +1 -0
  133. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +8 -0
  134. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -1
  135. package/dist/settlement/messages/OutgoingMessageArgument.js +1 -0
  136. package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
  137. package/dist/settlement/messages/Withdrawal.d.ts +13 -0
  138. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -1
  139. package/dist/settlement/messages/Withdrawal.js +4 -1
  140. package/dist/settlement/messages/Withdrawal.js.map +1 -0
  141. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +5 -3
  142. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -1
  143. package/dist/settlement/modularity/ProvableSettlementHook.js +1 -0
  144. package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
  145. package/dist/settlement/modularity/types.d.ts +8 -0
  146. package/dist/settlement/modularity/types.d.ts.map +1 -0
  147. package/dist/settlement/modularity/types.js +2 -0
  148. package/dist/settlement/modularity/types.js.map +1 -0
  149. package/dist/settlement/modules/NetworkStateSettlementModule.js +1 -0
  150. package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
  151. package/dist/state/State.js +1 -0
  152. package/dist/state/State.js.map +1 -0
  153. package/dist/state/StateMap.js +1 -0
  154. package/dist/state/StateMap.js.map +1 -0
  155. package/dist/state/StateService.js +1 -0
  156. package/dist/state/StateService.js.map +1 -0
  157. package/dist/state/StateServiceProvider.js +1 -0
  158. package/dist/state/StateServiceProvider.js.map +1 -0
  159. package/dist/state/assert/assert.js +1 -0
  160. package/dist/state/assert/assert.js.map +1 -0
  161. package/dist/state/context/RuntimeMethodExecutionContext.js +1 -0
  162. package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
  163. package/dist/state/context/TransitionMethodExecutionContext.js +1 -0
  164. package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
  165. package/dist/state/protocol/ProtocolState.js +1 -0
  166. package/dist/state/protocol/ProtocolState.js.map +1 -0
  167. package/dist/utils/MinaPrefixedProvableHashList.js +1 -0
  168. package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
  169. package/dist/utils/PrefixedProvableHashList.js +1 -0
  170. package/dist/utils/PrefixedProvableHashList.js.map +1 -0
  171. package/dist/utils/ProvableHashList.js +1 -0
  172. package/dist/utils/ProvableHashList.js.map +1 -0
  173. package/dist/utils/ProvableReductionHashList.js +1 -0
  174. package/dist/utils/ProvableReductionHashList.js.map +1 -0
  175. package/dist/utils/StateTransitionReductionList.js +1 -0
  176. package/dist/utils/StateTransitionReductionList.js.map +1 -0
  177. package/dist/utils/utils.js +1 -0
  178. package/dist/utils/utils.js.map +1 -0
  179. package/jest.config.cjs +12 -1
  180. package/package.json +4 -4
  181. package/src/hooks/NoopSettlementHook.ts +2 -2
  182. package/src/index.ts +6 -2
  183. package/src/model/StateTransitionProvableBatch.ts +24 -4
  184. package/src/protocol/Protocol.ts +36 -7
  185. package/src/protocol/ProtocolModule.ts +1 -1
  186. package/src/prover/block/BlockProvable.ts +9 -9
  187. package/src/prover/block/BlockProver.ts +94 -58
  188. package/src/prover/statetransition/StateTransitionProvable.ts +5 -8
  189. package/src/prover/statetransition/StateTransitionProver.ts +46 -40
  190. package/src/settlement/ContractModule.ts +17 -10
  191. package/src/settlement/SettlementContractModule.ts +54 -41
  192. package/src/settlement/contracts/BridgeContract.ts +237 -0
  193. package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
  194. package/src/settlement/contracts/DispatchContractProtocolModule.ts +37 -3
  195. package/src/settlement/contracts/DispatchSmartContract.ts +213 -23
  196. package/src/settlement/contracts/SettlementContractProtocolModule.ts +61 -20
  197. package/src/settlement/contracts/SettlementSmartContract.ts +261 -107
  198. package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
  199. package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
  200. package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
  201. package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
  202. package/src/settlement/messages/Deposit.ts +2 -1
  203. package/src/settlement/messages/Withdrawal.ts +3 -1
  204. package/src/settlement/modularity/ProvableSettlementHook.ts +6 -3
  205. package/src/settlement/modularity/types.ts +22 -0
  206. package/test/BlockProver.test.ts +2 -1
  207. package/test/TestingProtocol.ts +17 -12
  208. package/test/compiling/types.ts +28 -0
  209. package/test/modularity/types.ts +35 -0
  210. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +0 -23
  211. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +0 -17
@@ -4,6 +4,9 @@ import {
4
4
  provableMethod,
5
5
  RollupMerkleTreeWitness,
6
6
  ZkProgrammable,
7
+ CompilableModule,
8
+ type ArtifactRecord,
9
+ type CompileRegistry,
7
10
  } from "@proto-kit/common";
8
11
  import { Field, Provable, SelfProof, ZkProgram } from "o1js";
9
12
  import { injectable } from "tsyringe";
@@ -27,15 +30,24 @@ import {
27
30
  StateTransitionProverPublicInput,
28
31
  StateTransitionProverPublicOutput,
29
32
  } from "./StateTransitionProvable";
30
- import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
31
- import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
32
33
 
33
34
  const errors = {
34
35
  propertyNotMatching: (property: string, step: string) =>
35
36
  `${property} not matching ${step}`,
36
37
 
37
- merkleWitnessNotCorrect: (index: number, type: string) =>
38
- `MerkleWitness not valid for StateTransition (${index}, type ${type})`,
38
+ merkleWitnessNotCorrect: (
39
+ index: number,
40
+ type: ProvableStateTransitionType
41
+ ) => {
42
+ let s = `MerkleWitness not valid for StateTransition (${index}, type unknown)`;
43
+ Provable.asProver(() => {
44
+ s = s.replace(
45
+ "unknown",
46
+ type.isNormal().toBoolean() ? "normal" : "protocol"
47
+ );
48
+ });
49
+ return s;
50
+ },
39
51
 
40
52
  noWitnessProviderSet: () =>
41
53
  new Error(
@@ -64,14 +76,13 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
64
76
  StateTransitionProverPublicOutput
65
77
  > {
66
78
  public constructor(
67
- private readonly stateTransitionProver: StateTransitionProver,
68
- public readonly witnessProviderReference: StateTransitionWitnessProviderReference
79
+ private readonly stateTransitionProver: StateTransitionProver
69
80
  ) {
70
81
  super();
71
82
  }
72
83
 
73
- public get appChain(): AreProofsEnabled | undefined {
74
- return this.stateTransitionProver.appChain;
84
+ public get areProofsEnabled(): AreProofsEnabled | undefined {
85
+ return this.stateTransitionProver.areProofsEnabled;
75
86
  }
76
87
 
77
88
  public zkProgramFactory(): PlainZkProgram<
@@ -86,7 +97,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
86
97
  publicOutput: StateTransitionProverPublicOutput,
87
98
 
88
99
  methods: {
89
- proveBatch: {
100
+ runBatch: {
90
101
  privateInputs: [StateTransitionProvableBatch],
91
102
 
92
103
  async method(
@@ -115,7 +126,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
115
126
  });
116
127
 
117
128
  const methods = {
118
- proveBatch: program.proveBatch.bind(program),
129
+ runBatch: program.runBatch.bind(program),
119
130
  merge: program.merge.bind(program),
120
131
  };
121
132
 
@@ -123,6 +134,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
123
134
 
124
135
  return [
125
136
  {
137
+ name: program.name,
126
138
  compile: program.compile.bind(program),
127
139
  verify: program.verify.bind(program),
128
140
  analyzeMethods: program.analyzeMethods.bind(program),
@@ -132,14 +144,6 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
132
144
  ];
133
145
  }
134
146
 
135
- private get witnessProvider(): StateTransitionWitnessProvider {
136
- const provider = this.witnessProviderReference.getWitnessProvider();
137
- if (provider === undefined) {
138
- throw errors.noWitnessProviderSet();
139
- }
140
- return provider;
141
- }
142
-
143
147
  /**
144
148
  * Applies the state transitions to the current stateRoot
145
149
  * and returns the new prover state
@@ -168,12 +172,19 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
168
172
 
169
173
  const transitions = transitionBatch.batch;
170
174
  const types = transitionBatch.transitionTypes;
175
+ const merkleWitness = transitionBatch.merkleWitnesses;
171
176
  for (
172
177
  let index = 0;
173
178
  index < constants.stateTransitionProverBatchSize;
174
179
  index++
175
180
  ) {
176
- this.applyTransition(state, transitions[index], types[index], index);
181
+ this.applyTransition(
182
+ state,
183
+ transitions[index],
184
+ types[index],
185
+ merkleWitness[index],
186
+ index
187
+ );
177
188
  }
178
189
 
179
190
  return state;
@@ -187,13 +198,10 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
187
198
  state: StateTransitionProverExecutionState,
188
199
  transition: ProvableStateTransition,
189
200
  type: ProvableStateTransitionType,
201
+ merkleWitness: RollupMerkleTreeWitness,
190
202
  index = 0
191
203
  ) {
192
- const witness = Provable.witness(RollupMerkleTreeWitness, () =>
193
- this.witnessProvider.getWitness(transition.path)
194
- );
195
-
196
- const membershipValid = witness.checkMembership(
204
+ const membershipValid = merkleWitness.checkMembership(
197
205
  state.stateRoot,
198
206
  transition.path,
199
207
  transition.from.value
@@ -201,14 +209,9 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
201
209
 
202
210
  membershipValid
203
211
  .or(transition.from.isSome.not())
204
- .assertTrue(
205
- errors.merkleWitnessNotCorrect(
206
- index,
207
- type.isNormal().toBoolean() ? "normal" : "protocol"
208
- )
209
- );
212
+ .assertTrue(errors.merkleWitnessNotCorrect(index, type));
210
213
 
211
- const newRoot = witness.calculateRoot(transition.to.value);
214
+ const newRoot = merkleWitness.calculateRoot(transition.to.value);
212
215
 
213
216
  state.stateRoot = Provable.if(
214
217
  transition.to.isSome,
@@ -339,19 +342,22 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
339
342
  @injectable()
340
343
  export class StateTransitionProver
341
344
  extends ProtocolModule
342
- implements StateTransitionProvable, StateTransitionProverType
345
+ implements
346
+ StateTransitionProvable,
347
+ StateTransitionProverType,
348
+ CompilableModule
343
349
  {
344
350
  public zkProgrammable: StateTransitionProverProgrammable;
345
351
 
346
- public constructor(
347
- // Injected
348
- public readonly witnessProviderReference: StateTransitionWitnessProviderReference
349
- ) {
352
+ public constructor() {
350
353
  super();
351
- this.zkProgrammable = new StateTransitionProverProgrammable(
352
- this,
353
- witnessProviderReference
354
- );
354
+ this.zkProgrammable = new StateTransitionProverProgrammable(this);
355
+ }
356
+
357
+ public async compile(
358
+ registry: CompileRegistry
359
+ ): Promise<void | ArtifactRecord> {
360
+ return await this.zkProgrammable.compile(registry);
355
361
  }
356
362
 
357
363
  public runBatch(
@@ -1,4 +1,11 @@
1
- import { ConfigurableModule, NoConfig, TypedClass } from "@proto-kit/common";
1
+ import {
2
+ ArtifactRecord,
3
+ type CompilableModule,
4
+ CompileRegistry,
5
+ ConfigurableModule,
6
+ NoConfig,
7
+ TypedClass,
8
+ } from "@proto-kit/common";
2
9
  import { SmartContract } from "o1js";
3
10
 
4
11
  export type SmartContractClassFromInterface<Type> = typeof SmartContract &
@@ -12,13 +19,13 @@ export type SmartContractClassFromInterface<Type> = typeof SmartContract &
12
19
  * of SmartContract and implements a certain interface as specified by the
13
20
  * ContractType generic.
14
21
  */
15
- export abstract class ContractModule<
16
- ContractType,
17
- // undefined = no args
18
- Arguments = undefined,
19
- Config = NoConfig,
20
- > extends ConfigurableModule<Config> {
21
- public abstract contractFactory(
22
- args: Arguments
23
- ): SmartContractClassFromInterface<ContractType>;
22
+ export abstract class ContractModule<ContractType, Config = NoConfig>
23
+ extends ConfigurableModule<Config>
24
+ implements CompilableModule
25
+ {
26
+ public abstract contractFactory(): SmartContractClassFromInterface<ContractType>;
27
+
28
+ public abstract compile(
29
+ registry: CompileRegistry
30
+ ): Promise<ArtifactRecord | undefined>;
24
31
  }
@@ -5,17 +5,15 @@ import {
5
5
  ModulesRecord,
6
6
  TypedClass,
7
7
  noop,
8
+ StringKeyOf,
8
9
  } from "@proto-kit/common";
9
- import { PublicKey, SmartContract } from "o1js";
10
+ import { Field, PublicKey, SmartContract } from "o1js";
10
11
  import { injectable } from "tsyringe";
11
12
 
12
13
  import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
13
14
  import { ProtocolModule } from "../protocol/ProtocolModule";
14
15
 
15
- import {
16
- ContractModule,
17
- SmartContractClassFromInterface,
18
- } from "./ContractModule";
16
+ import { ContractModule } from "./ContractModule";
19
17
  import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
20
18
  import { DispatchContractType } from "./contracts/DispatchSmartContract";
21
19
  import {
@@ -23,21 +21,24 @@ import {
23
21
  SettlementContractProtocolModule,
24
22
  } from "./contracts/SettlementContractProtocolModule";
25
23
  import { SettlementContractType } from "./contracts/SettlementSmartContract";
24
+ import { BridgeContractType } from "./contracts/BridgeContract";
25
+ import {
26
+ BridgeContractConfig,
27
+ BridgeContractProtocolModule,
28
+ } from "./contracts/BridgeContractProtocolModule";
29
+ import { GetContracts } from "./modularity/types";
26
30
 
27
31
  export type SettlementModulesRecord = ModulesRecord<
28
- TypedClass<ContractModule<unknown, unknown, unknown>>
32
+ TypedClass<ContractModule<unknown, unknown>>
29
33
  >;
30
34
 
31
35
  export type MandatorySettlementModulesRecord = {
32
36
  SettlementContract: TypedClass<
33
- ContractModule<
34
- SettlementContractType,
35
- SmartContractClassFromInterface<DispatchContractType>,
36
- SettlementContractConfig
37
- >
37
+ ContractModule<SettlementContractType, SettlementContractConfig>
38
38
  >;
39
- DispatchContract: TypedClass<
40
- ContractModule<DispatchContractType, unknown, unknown>
39
+ DispatchContract: TypedClass<ContractModule<DispatchContractType, unknown>>;
40
+ BridgeContract: TypedClass<
41
+ ContractModule<BridgeContractType, BridgeContractConfig>
41
42
  >;
42
43
  };
43
44
 
@@ -66,17 +67,33 @@ export class SettlementContractModule<
66
67
  };
67
68
  }
68
69
 
69
- public static fromDefaults() {
70
- return SettlementContractModule.from({
70
+ public static mandatoryModules() {
71
+ return {
71
72
  SettlementContract: SettlementContractProtocolModule,
72
73
  DispatchContract: DispatchContractProtocolModule,
73
- });
74
+ BridgeContract: BridgeContractProtocolModule,
75
+ } as const;
76
+ }
77
+
78
+ public static fromDefaults() {
79
+ return SettlementContractModule.from(
80
+ SettlementContractModule.mandatoryModules()
81
+ );
82
+ }
83
+
84
+ public static with<AdditionalModules extends SettlementModulesRecord>(
85
+ additionalModules: AdditionalModules
86
+ ) {
87
+ return SettlementContractModule.from({
88
+ ...SettlementContractModule.mandatoryModules(),
89
+ ...additionalModules,
90
+ } as const);
74
91
  }
75
92
 
76
93
  // ** For protocol module
77
94
  public protocol?: ProtocolEnvironment;
78
95
 
79
- public get appChain(): AreProofsEnabled | undefined {
96
+ public get areProofsEnabled(): AreProofsEnabled | undefined {
80
97
  return this.protocol?.getAreProofsEnabled();
81
98
  }
82
99
  // **
@@ -89,25 +106,14 @@ export class SettlementContractModule<
89
106
  noop();
90
107
  }
91
108
 
92
- public getContractClasses(): {
93
- settlement: SmartContractClassFromInterface<SettlementContractType>;
94
- dispatch: SmartContractClassFromInterface<DispatchContractType>;
95
- } {
96
- const settlementContractKey = "SettlementContract";
97
- const dispatchContractKey = "DispatchContract";
98
- this.assertIsValidModuleName(settlementContractKey);
99
- this.assertIsValidModuleName(dispatchContractKey);
100
-
101
- const settlementModule = this.resolve(settlementContractKey);
102
- const dispatchModule = this.resolve(dispatchContractKey);
103
-
104
- const dispatch = dispatchModule.contractFactory(undefined);
105
- const settlement = settlementModule.contractFactory(dispatch);
106
-
107
- return {
108
- settlement,
109
- dispatch,
110
- };
109
+ public getContractClasses(): GetContracts<SettlementModules> {
110
+ const contracts =
111
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
112
+ (this.moduleNames as StringKeyOf<SettlementModules>[]).map((name) => {
113
+ const module = this.resolve(name);
114
+ return [name, module.contractFactory()];
115
+ });
116
+ return Object.fromEntries(contracts);
111
117
  }
112
118
 
113
119
  public createContracts(addresses: {
@@ -117,16 +123,23 @@ export class SettlementContractModule<
117
123
  settlement: SettlementContractType & SmartContract;
118
124
  dispatch: DispatchContractType & SmartContract;
119
125
  } {
120
- const { dispatch, settlement } = this.getContractClasses();
126
+ const { DispatchContract, SettlementContract } = this.getContractClasses();
121
127
 
122
- // eslint-disable-next-line new-cap
123
- const dispatchInstance = new dispatch(addresses.dispatch);
124
- // eslint-disable-next-line new-cap
125
- const settlementInstance = new settlement(addresses.settlement);
128
+ const dispatchInstance = new DispatchContract(addresses.dispatch);
129
+ const settlementInstance = new SettlementContract(addresses.settlement);
126
130
 
127
131
  return {
128
132
  dispatch: dispatchInstance,
129
133
  settlement: settlementInstance,
130
134
  };
131
135
  }
136
+
137
+ public createBridgeContract(
138
+ address: PublicKey,
139
+ tokenId?: Field
140
+ ): BridgeContractType & SmartContract {
141
+ const { BridgeContract } = this.getContractClasses();
142
+
143
+ return new BridgeContract(address, tokenId);
144
+ }
132
145
  }
@@ -0,0 +1,237 @@
1
+ import {
2
+ AccountUpdate,
3
+ Bool,
4
+ Field,
5
+ method,
6
+ Permissions,
7
+ Poseidon,
8
+ Provable,
9
+ PublicKey,
10
+ SmartContract,
11
+ State,
12
+ state,
13
+ Struct,
14
+ TokenContractV2,
15
+ TokenId,
16
+ VerificationKey,
17
+ } from "o1js";
18
+ import { noop, range, TypedClass } from "@proto-kit/common";
19
+
20
+ import {
21
+ OUTGOING_MESSAGE_BATCH_SIZE,
22
+ OutgoingMessageArgumentBatch,
23
+ } from "../messages/OutgoingMessageArgument";
24
+ import { Path } from "../../model/Path";
25
+ import { Withdrawal } from "../messages/Withdrawal";
26
+
27
+ import type { SettlementContractType } from "./SettlementSmartContract";
28
+
29
+ export type BridgeContractType = {
30
+ stateRoot: State<Field>;
31
+ outgoingMessageCursor: State<Field>;
32
+
33
+ rollupOutgoingMessages: (
34
+ batch: OutgoingMessageArgumentBatch
35
+ ) => Promise<Field>;
36
+ redeem: (additionUpdate: AccountUpdate) => Promise<void>;
37
+
38
+ deployProvable: (
39
+ args: VerificationKey | undefined,
40
+ signedSettlement: boolean,
41
+ permissions: Permissions,
42
+ settlementContractAddress: PublicKey
43
+ ) => Promise<AccountUpdate>;
44
+
45
+ updateStateRoot: (root: Field) => Promise<void>;
46
+ };
47
+
48
+ // Equal to WithdrawalKey
49
+ export class OutgoingMessageKey extends Struct({
50
+ index: Field,
51
+ tokenId: Field,
52
+ }) {}
53
+
54
+ export abstract class BridgeContractBase extends TokenContractV2 {
55
+ public static args: {
56
+ SettlementContract:
57
+ | (TypedClass<SettlementContractType> & typeof SmartContract)
58
+ | undefined;
59
+ withdrawalStatePath: [string, string];
60
+ };
61
+
62
+ abstract settlementContractAddress: State<PublicKey>;
63
+
64
+ abstract stateRoot: State<Field>;
65
+
66
+ abstract outgoingMessageCursor: State<Field>;
67
+
68
+ /**
69
+ * Function to deploy the bridging contract in a provable way, so that it can be
70
+ * a provable process initiated by the settlement contract with a baked-in vk
71
+ *
72
+ * @returns Creates and returns an account update deploying the bridge contract
73
+ */
74
+ public async deployProvable(
75
+ verificationKey: VerificationKey | undefined,
76
+ signedSettlement: boolean,
77
+ permissions: Permissions,
78
+ settlementContractAddress: PublicKey
79
+ ) {
80
+ const accountUpdate = this.self;
81
+
82
+ if (!signedSettlement) {
83
+ if (verificationKey === undefined) {
84
+ throw new Error("Verification Key not provided, can't deploy");
85
+ }
86
+ accountUpdate.account.verificationKey.set(verificationKey);
87
+ }
88
+
89
+ accountUpdate.requireSignature();
90
+ this.account.permissions.set(permissions);
91
+
92
+ range(0, 8).forEach((i) => {
93
+ accountUpdate.update.appState[i] = {
94
+ isSome: Bool(true),
95
+ value: Field(0),
96
+ };
97
+ });
98
+
99
+ this.settlementContractAddress.set(settlementContractAddress);
100
+
101
+ accountUpdate.body.mayUseToken = {
102
+ // Set to true for custom tokens only
103
+ inheritFromParent: accountUpdate.tokenId.equals(TokenId.default).not(),
104
+ parentsOwnToken: Bool(false),
105
+ };
106
+
107
+ return accountUpdate;
108
+ }
109
+
110
+ public async approveBase(): Promise<void> {
111
+ noop();
112
+ }
113
+
114
+ public async updateStateRootBase(root: Field) {
115
+ this.stateRoot.set(root);
116
+
117
+ const settlementContractAddress =
118
+ this.settlementContractAddress.getAndRequireEquals();
119
+ const SettlementContractClass = BridgeContractBase.args.SettlementContract;
120
+ if (SettlementContractClass === undefined) {
121
+ throw new Error(
122
+ "Settlement Contract class hasn't been set yet, something is wrong with your module composition"
123
+ );
124
+ }
125
+ const settlementContract = new SettlementContractClass(
126
+ settlementContractAddress
127
+ );
128
+ const accountUpdate = settlementContract.assertStateRoot(root);
129
+ this.approve(accountUpdate);
130
+ }
131
+
132
+ public async rollupOutgoingMessagesBase(
133
+ batch: OutgoingMessageArgumentBatch
134
+ ): Promise<Field> {
135
+ let counter = this.outgoingMessageCursor.getAndRequireEquals();
136
+ const stateRoot = this.stateRoot.getAndRequireEquals();
137
+
138
+ const [withdrawalModule, withdrawalStateName] =
139
+ BridgeContractBase.args.withdrawalStatePath;
140
+ const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
141
+
142
+ // Count account creation fee to return later, so that the sender can fund
143
+ // those accounts with a separate AU
144
+ let accountCreationFeePaid = Field(0);
145
+
146
+ for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
147
+ const args = batch.arguments[i];
148
+
149
+ // Check witness
150
+ const path = Path.fromKey(mapPath, OutgoingMessageKey, {
151
+ index: counter,
152
+ tokenId: this.tokenId,
153
+ });
154
+
155
+ // Process message
156
+ const { address, amount } = args.value;
157
+ const isDummy = address.equals(this.address);
158
+
159
+ args.witness
160
+ .checkMembership(
161
+ stateRoot,
162
+ path,
163
+ Poseidon.hash(Withdrawal.toFields(args.value))
164
+ )
165
+ .or(isDummy)
166
+ .assertTrue("Provided Withdrawal witness not valid");
167
+
168
+ const tokenAu = this.internal.mint({ address, amount });
169
+ const isNewAccount = tokenAu.account.isNew.getAndRequireEquals();
170
+
171
+ accountCreationFeePaid = accountCreationFeePaid.add(
172
+ Provable.if(isNewAccount, Field(1e9), Field(0))
173
+ );
174
+
175
+ counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
176
+ }
177
+
178
+ this.outgoingMessageCursor.set(counter);
179
+
180
+ return accountCreationFeePaid;
181
+ }
182
+
183
+ protected async redeemBase(additionUpdate: AccountUpdate) {
184
+ additionUpdate.body.tokenId.assertEquals(
185
+ this.tokenId,
186
+ "Tokenid not same as this bridging contract's tokenId"
187
+ );
188
+ additionUpdate.body.balanceChange.sgn
189
+ .isPositive()
190
+ .assertTrue("Sign not correct");
191
+ const amount = additionUpdate.body.balanceChange.magnitude;
192
+
193
+ // Burn tokens
194
+ this.internal.burn({
195
+ address: additionUpdate.publicKey,
196
+ amount,
197
+ });
198
+
199
+ // Inherit from parent for custom tokens
200
+ additionUpdate.body.mayUseToken = {
201
+ inheritFromParent: this.tokenId.equals(TokenId.default).not(),
202
+ parentsOwnToken: Bool(false),
203
+ };
204
+
205
+ // Send mina
206
+ this.approve(additionUpdate);
207
+ this.balance.subInPlace(amount);
208
+ }
209
+ }
210
+
211
+ export class BridgeContract
212
+ extends BridgeContractBase
213
+ implements BridgeContractType
214
+ {
215
+ @state(PublicKey) public settlementContractAddress = State<PublicKey>();
216
+
217
+ @state(Field) public stateRoot = State<Field>();
218
+
219
+ @state(Field) public outgoingMessageCursor = State<Field>();
220
+
221
+ @method
222
+ public async updateStateRoot(root: Field) {
223
+ return await this.updateStateRootBase(root);
224
+ }
225
+
226
+ @method.returns(Field)
227
+ public async rollupOutgoingMessages(
228
+ batch: OutgoingMessageArgumentBatch
229
+ ): Promise<Field> {
230
+ return await this.rollupOutgoingMessagesBase(batch);
231
+ }
232
+
233
+ @method
234
+ public async redeem(additionUpdate: AccountUpdate) {
235
+ return await this.redeemBase(additionUpdate);
236
+ }
237
+ }
@@ -0,0 +1,43 @@
1
+ import { injectable } from "tsyringe";
2
+ import { CompileRegistry } from "@proto-kit/common";
3
+
4
+ import { ContractModule } from "../ContractModule";
5
+
6
+ import {
7
+ BridgeContract,
8
+ BridgeContractBase,
9
+ BridgeContractType,
10
+ } from "./BridgeContract";
11
+
12
+ export type BridgeContractConfig = {
13
+ withdrawalStatePath: `${string}.${string}`;
14
+ withdrawalEventName: string;
15
+ };
16
+
17
+ @injectable()
18
+ export class BridgeContractProtocolModule extends ContractModule<
19
+ BridgeContractType,
20
+ BridgeContractConfig
21
+ > {
22
+ public contractFactory() {
23
+ const { config } = this;
24
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
25
+ const withdrawalStatePathSplit = config.withdrawalStatePath.split(".") as [
26
+ string,
27
+ string,
28
+ ];
29
+
30
+ BridgeContractBase.args = {
31
+ withdrawalStatePath: withdrawalStatePathSplit,
32
+ SettlementContract: BridgeContractBase.args?.SettlementContract,
33
+ };
34
+
35
+ return BridgeContract;
36
+ }
37
+
38
+ public async compile(registry: CompileRegistry) {
39
+ return {
40
+ BridgeContract: await registry.compile(BridgeContract),
41
+ };
42
+ }
43
+ }