@proto-kit/protocol 0.1.1-develop.600 → 0.1.1-develop.651

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 (134) hide show
  1. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -1
  2. package/dist/blockmodules/NoopSettlementHook.js +1 -1
  3. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  4. package/dist/hooks/AccountStateHook.js +10 -3
  5. package/dist/hooks/BlockHeightHook.d.ts +3 -3
  6. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  7. package/dist/hooks/BlockHeightHook.js +5 -4
  8. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  9. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  10. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  11. package/dist/hooks/NoopBlockHook.d.ts +6 -4
  12. package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
  13. package/dist/hooks/NoopBlockHook.js +4 -4
  14. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  15. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  16. package/dist/hooks/NoopSettlementHook.js +18 -0
  17. package/dist/index.d.ts +18 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +18 -6
  20. package/dist/model/Option.d.ts +3 -2
  21. package/dist/model/Option.d.ts.map +1 -1
  22. package/dist/model/Option.js +5 -0
  23. package/dist/model/RuntimeLike.d.ts +11 -0
  24. package/dist/model/RuntimeLike.d.ts.map +1 -0
  25. package/dist/model/RuntimeLike.js +1 -0
  26. package/dist/model/StateTransition.d.ts +6 -5
  27. package/dist/model/StateTransition.d.ts.map +1 -1
  28. package/dist/model/StateTransition.js +3 -0
  29. package/dist/model/StateTransitionReduction.d.ts +3 -0
  30. package/dist/model/StateTransitionReduction.d.ts.map +1 -0
  31. package/dist/model/StateTransitionReduction.js +26 -0
  32. package/dist/protocol/Protocol.d.ts +11 -18
  33. package/dist/protocol/Protocol.d.ts.map +1 -1
  34. package/dist/protocol/Protocol.js +4 -27
  35. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  36. package/dist/protocol/ProtocolModule.js +1 -1
  37. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  38. package/dist/prover/block/BlockProver.js +8 -6
  39. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -1
  40. package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
  41. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  42. package/dist/prover/statetransition/StateTransitionProver.js +1 -0
  43. package/dist/settlement/ContractModule.d.ts +15 -0
  44. package/dist/settlement/ContractModule.d.ts.map +1 -0
  45. package/dist/settlement/ContractModule.js +11 -0
  46. package/dist/settlement/SettlementContractModule.d.ts +39 -0
  47. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  48. package/dist/settlement/SettlementContractModule.js +68 -0
  49. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  50. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  51. package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
  52. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  53. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  54. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  55. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  56. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  57. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  58. package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
  59. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  60. package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
  61. package/dist/settlement/messages/Deposit.d.ts +39 -0
  62. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  63. package/dist/settlement/messages/Deposit.js +6 -0
  64. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
  65. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  66. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  67. package/dist/settlement/messages/Withdrawal.d.ts +40 -0
  68. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  69. package/dist/settlement/messages/Withdrawal.js +13 -0
  70. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  71. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  72. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  73. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +3 -3
  74. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
  75. package/dist/settlement/modules/NetworkStateSettlementModule.js +1 -1
  76. package/dist/state/State.d.ts.map +1 -1
  77. package/dist/state/State.js +2 -1
  78. package/dist/state/assert/assert.d.ts.map +1 -1
  79. package/dist/state/assert/assert.js +8 -5
  80. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +1 -1
  81. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  82. package/dist/state/context/RuntimeMethodExecutionContext.js +2 -1
  83. package/dist/utils/MinaPrefixedProvableHashList.d.ts +2 -2
  84. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
  85. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  86. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  87. package/dist/utils/ProvableHashList.d.ts +3 -3
  88. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  89. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  90. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  91. package/dist/utils/ProvableReductionHashList.js +50 -0
  92. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  93. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  94. package/dist/utils/StateTransitionReductionList.js +60 -0
  95. package/package.json +2 -2
  96. package/src/{blockmodules/AccountStateModule.ts → hooks/AccountStateHook.ts} +3 -1
  97. package/src/{blockmodules → hooks}/NoopSettlementHook.ts +1 -2
  98. package/src/index.ts +18 -6
  99. package/src/model/Option.ts +16 -0
  100. package/src/model/RuntimeLike.ts +12 -0
  101. package/src/model/StateTransition.ts +10 -2
  102. package/src/protocol/Protocol.ts +19 -44
  103. package/src/protocol/ProtocolModule.ts +3 -2
  104. package/src/prover/block/BlockProver.ts +20 -8
  105. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +1 -1
  106. package/src/prover/statetransition/StateTransitionProver.ts +4 -2
  107. package/src/settlement/ContractModule.ts +24 -0
  108. package/src/settlement/SettlementContractModule.ts +127 -0
  109. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  110. package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
  111. package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
  112. package/src/settlement/{SettlementContract.ts → contracts/SettlementSmartContract.ts} +87 -202
  113. package/src/settlement/messages/Deposit.ts +6 -0
  114. package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
  115. package/src/settlement/messages/Withdrawal.ts +14 -0
  116. package/src/settlement/{ProvableSettlementHook.ts → modularity/ProvableSettlementHook.ts} +7 -10
  117. package/src/settlement/modules/NetworkStateSettlementModule.ts +3 -3
  118. package/src/state/State.ts +2 -1
  119. package/src/state/assert/assert.ts +8 -6
  120. package/src/state/context/RuntimeMethodExecutionContext.ts +8 -5
  121. package/src/utils/MinaPrefixedProvableHashList.ts +2 -2
  122. package/src/utils/PrefixedProvableHashList.ts +2 -2
  123. package/src/utils/ProvableHashList.ts +3 -3
  124. package/src/utils/ProvableReductionHashList.ts +68 -0
  125. package/src/utils/StateTransitionReductionList.ts +88 -0
  126. package/test/BlockProver.test.ts +2 -2
  127. package/test/Protocol.test.ts +15 -10
  128. package/test/settlement/SettlementContract.test.ts +45 -0
  129. package/test/utils/ProvableReductionHashList.test.ts +114 -0
  130. /package/src/{blockmodules → hooks}/BlockHeightHook.ts +0 -0
  131. /package/src/{blockmodules → hooks}/LastStateRootBlockHook.ts +0 -0
  132. /package/src/{blockmodules → hooks}/NoopBlockHook.ts +0 -0
  133. /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
  134. /package/src/{blockmodules → hooks}/SequenceStateTransactionModule.ts +0 -0
@@ -1,3 +1,4 @@
1
+ import { prefixToField, RollupMerkleTree, TypedClass } from "@proto-kit/common";
1
2
  import {
2
3
  AccountUpdate,
3
4
  Bool,
@@ -7,46 +8,36 @@ import {
7
8
  Poseidon,
8
9
  Proof,
9
10
  Provable,
10
- ProvableExtended,
11
11
  PublicKey,
12
- Reducer,
13
12
  Signature,
14
13
  SmartContract,
15
14
  State,
16
15
  state,
17
- Struct,
18
16
  TokenId,
19
17
  UInt32,
20
18
  UInt64,
21
19
  } from "o1js";
20
+ import { NetworkState } from "../../model/network/NetworkState";
21
+ import { Path } from "../../model/Path";
22
+ import { BlockHashMerkleTree } from "../../prover/block/accummulators/BlockHashMerkleTree";
22
23
  import {
23
- EMPTY_PUBLICKEY,
24
- prefixToField,
25
- RollupMerkleTree,
26
- RollupMerkleTreeWitness,
27
- } from "@proto-kit/common";
28
- import { inject, injectable, injectAll } from "tsyringe";
29
-
30
- import { ProtocolModule } from "../protocol/ProtocolModule";
31
- import { BlockProver } from "../prover/block/BlockProver";
32
- import {
33
- BlockProvable,
34
24
  BlockProverPublicInput,
35
25
  BlockProverPublicOutput,
36
- } from "../prover/block/BlockProvable";
37
- import { NetworkState } from "../model/network/NetworkState";
38
- import { BlockHashMerkleTree } from "../prover/block/accummulators/BlockHashMerkleTree";
39
- import { RuntimeTransaction } from "../model/transaction/RuntimeTransaction";
40
- import { Path } from "../model/Path";
41
- import { MinaActions, MinaEvents } from "../utils/MinaPrefixedProvableHashList";
42
-
26
+ } from "../../prover/block/BlockProvable";
27
+ import {
28
+ OUTGOING_MESSAGE_BATCH_SIZE,
29
+ OutgoingMessageArgumentBatch,
30
+ } from "../messages/OutgoingMessageArgument";
31
+ import { Withdrawal } from "../messages/Withdrawal";
43
32
  import {
44
33
  ProvableSettlementHook,
45
34
  SettlementHookInputs,
46
35
  SettlementStateRecord,
47
- } from "./ProvableSettlementHook";
36
+ } from "../modularity/ProvableSettlementHook";
48
37
 
49
- class LazyBlockProof extends Proof<
38
+ import { DispatchContractType } from "./DispatchSmartContract";
39
+
40
+ export class LazyBlockProof extends Proof<
50
41
  BlockProverPublicInput,
51
42
  BlockProverPublicOutput
52
43
  > {
@@ -59,69 +50,37 @@ class LazyBlockProof extends Proof<
59
50
  };
60
51
  }
61
52
 
62
- export type SettlementMethodIdMapping = Record<`${string}.${string}`, bigint>;
63
-
64
- export class Deposit extends Struct({
65
- address: PublicKey,
66
- amount: UInt64,
67
- }) {}
68
-
69
- export class Withdrawal extends Struct({
70
- address: PublicKey,
71
- amount: UInt64,
72
- }) {
73
- static dummy() {
74
- return new Withdrawal({
75
- address: EMPTY_PUBLICKEY,
76
- amount: UInt64.from(0),
77
- });
78
- }
79
- }
80
-
81
- export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
82
-
83
- export class OutgoingMessageArgument extends Struct({
84
- witness: RollupMerkleTreeWitness,
85
- value: Withdrawal,
86
- }) {
87
- public static dummy(): OutgoingMessageArgument {
88
- return new OutgoingMessageArgument({
89
- witness: RollupMerkleTreeWitness.dummy(),
90
- value: Withdrawal.dummy(),
91
- });
92
- }
93
- }
94
-
95
- export class OutgoingMessageArgumentBatch extends Struct({
96
- arguments: Provable.Array(
97
- OutgoingMessageArgument,
98
- OUTGOING_MESSAGE_BATCH_SIZE
99
- ),
100
-
101
- isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
102
- }) {
103
- public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
104
- const batch = providedArguments.slice();
105
- const isDummys = batch.map(() => Bool(false));
106
-
107
- while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
108
- batch.push(OutgoingMessageArgument.dummy());
109
- isDummys.push(Bool(true));
110
- }
111
-
112
- return new OutgoingMessageArgumentBatch({
113
- arguments: batch,
114
- isDummys,
115
- });
116
- }
53
+ export interface SettlementContractType {
54
+ initialize: (sequencer: PublicKey, dispatchContract: PublicKey) => void;
55
+ settle: (
56
+ blockProof: LazyBlockProof,
57
+ signature: Signature,
58
+ dispatchContractAddress: PublicKey,
59
+ publicKey: PublicKey,
60
+ inputNetworkState: NetworkState,
61
+ outputNetworkState: NetworkState,
62
+ newPromisedMessagesHash: Field
63
+ ) => void;
64
+ rollupOutgoingMessages: (batch: OutgoingMessageArgumentBatch) => void;
65
+ redeem: (additionUpdate: AccountUpdate) => void;
117
66
  }
118
67
 
119
68
  // Some random prefix for the sequencer signature
120
69
  export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
121
70
 
122
- export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
71
+ export class SettlementSmartContract
72
+ extends SmartContract
73
+ implements SettlementContractType
74
+ {
75
+ // This pattern of injecting args into a smartcontract is currently the only
76
+ // viable solution that works given the inheritance issues of o1js
77
+ public static args: {
78
+ DispatchContract: TypedClass<DispatchContractType & SmartContract>;
79
+ hooks: ProvableSettlementHook<unknown>[];
80
+ withdrawalStatePath: [string, string];
81
+ escapeHatchSlotsInterval: number;
82
+ };
123
83
 
124
- export class SettlementContract extends SmartContract {
125
84
  @state(Field) public sequencerKey = State<Field>();
126
85
  @state(UInt32) public lastSettlementL1Block = State<UInt32>();
127
86
 
@@ -129,47 +88,33 @@ export class SettlementContract extends SmartContract {
129
88
  @state(Field) public networkStateHash = State<Field>();
130
89
  @state(Field) public blockHashRoot = State<Field>();
131
90
 
132
- @state(Field) public promisedMessagesHash = State<Field>();
133
- @state(Field) public honoredMessagesHash = State<Field>();
91
+ @state(Field) public dispatchContractAddressX = State<Field>();
134
92
 
135
93
  @state(Field) public outgoingMessageCursor = State<Field>();
136
94
 
137
- public constructor(
138
- address: PublicKey,
139
- private readonly methodIdMappings: Record<string, bigint>,
140
- private readonly hooks: ProvableSettlementHook<unknown>[],
141
- private readonly withdrawalStatePath: [string, string],
142
- private readonly incomingMessagesPaths: Record<
143
- string,
144
- `${string}.${string}`
145
- >,
146
- // 24 hours
147
- private readonly escapeHatchSlotsInterval = (60 / 3) * 24
148
- ) {
149
- super(address);
150
- }
151
-
152
95
  @method
153
- public initialize(sequencer: PublicKey) {
96
+ public initialize(sequencer: PublicKey, dispatchContract: PublicKey) {
154
97
  this.sequencerKey.getAndAssertEquals().assertEquals(Field(0));
155
98
  this.stateRoot.getAndAssertEquals().assertEquals(Field(0));
156
99
  this.blockHashRoot.getAndAssertEquals().assertEquals(Field(0));
157
100
  this.networkStateHash.getAndAssertEquals().assertEquals(Field(0));
158
- this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
159
- this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
101
+ this.dispatchContractAddressX.getAndAssertEquals().assertEquals(Field(0));
160
102
 
161
103
  this.sequencerKey.set(sequencer.x);
162
104
  this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
163
105
  this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
164
106
  this.networkStateHash.set(NetworkState.empty().hash());
165
- this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
166
- this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
107
+ this.dispatchContractAddressX.set(dispatchContract.x);
108
+
109
+ const DispatchContract = SettlementSmartContract.args.DispatchContract;
110
+ new DispatchContract(dispatchContract).initialize(this.address);
167
111
  }
168
112
 
169
113
  @method
170
114
  public settle(
171
115
  blockProof: LazyBlockProof,
172
116
  signature: Signature,
117
+ dispatchContractAddress: PublicKey,
173
118
  publicKey: PublicKey,
174
119
  inputNetworkState: NetworkState,
175
120
  outputNetworkState: NetworkState,
@@ -183,16 +128,31 @@ export class SettlementContract extends SmartContract {
183
128
  const networkStateHash = this.networkStateHash.getAndAssertEquals();
184
129
  const blockHashRoot = this.blockHashRoot.getAndAssertEquals();
185
130
  const sequencerKey = this.sequencerKey.getAndAssertEquals();
186
- const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
187
- const honoredMessagesHash = this.honoredMessagesHash.getAndAssertEquals();
188
131
  const lastSettlementL1Block =
189
132
  this.lastSettlementL1Block.getAndAssertEquals();
133
+ const onChainDispatchContractAddressX =
134
+ this.dispatchContractAddressX.getAndAssertEquals();
135
+
136
+ onChainDispatchContractAddressX.assertEquals(
137
+ dispatchContractAddress.x,
138
+ "DispatchContract address not provided correctly"
139
+ );
140
+
141
+ const { DispatchContract, escapeHatchSlotsInterval, hooks } =
142
+ SettlementSmartContract.args;
143
+
144
+ // Get dispatch contract values
145
+ // These values are witnesses but will be checked later on the AU
146
+ // call to the dispatch contract via .updateMessagesHash()
147
+ const dispatchContract = new DispatchContract(dispatchContractAddress);
148
+ const promisedMessagesHash = dispatchContract.promisedMessagesHash.get();
190
149
 
191
150
  // Get block height and use the lower bound for all ops
192
151
  const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
193
152
  this.network.globalSlotSinceGenesis.assertBetween(
194
153
  minBlockIncluded,
195
- minBlockIncluded.add(20)
154
+ // 5 because that is the length the newPromisedMessagesHash will be valid
155
+ minBlockIncluded.add(4)
196
156
  );
197
157
 
198
158
  // Check signature/escape catch
@@ -205,7 +165,7 @@ export class SettlementContract extends SmartContract {
205
165
  lastSettlementL1Block.value,
206
166
  ]);
207
167
  const escapeHatchActivated = lastSettlementL1Block
208
- .add(UInt32.from(this.escapeHatchSlotsInterval))
168
+ .add(UInt32.from(escapeHatchSlotsInterval))
209
169
  .lessThan(minBlockIncluded);
210
170
  signatureValid
211
171
  .or(escapeHatchActivated)
@@ -214,6 +174,10 @@ export class SettlementContract extends SmartContract {
214
174
  );
215
175
 
216
176
  // Assert correctness of networkState witness
177
+ Provable.log("Network State Hash ", networkStateHash);
178
+ Provable.log("input Hash ", inputNetworkState.hash());
179
+ Provable.log("equals ", inputNetworkState.hash().equals(networkStateHash));
180
+
217
181
  inputNetworkState
218
182
  .hash()
219
183
  .assertEquals(networkStateHash, "InputNetworkState witness not valid");
@@ -234,10 +198,8 @@ export class SettlementContract extends SmartContract {
234
198
  blockHashRoot,
235
199
  stateRoot,
236
200
  networkStateHash,
237
- honoredMessagesHash,
238
201
  lastSettlementL1Block,
239
- promisedMessagesHash,
240
- sequencerKey,
202
+ sequencerKey: publicKey,
241
203
  };
242
204
  const inputs: SettlementHookInputs = {
243
205
  blockProof,
@@ -247,7 +209,7 @@ export class SettlementContract extends SmartContract {
247
209
  toNetworkState: outputNetworkState,
248
210
  currentL1Block: minBlockIncluded,
249
211
  };
250
- this.hooks.forEach((hook) => {
212
+ hooks.forEach((hook) => {
251
213
  hook.beforeSettlement(this, inputs);
252
214
  });
253
215
 
@@ -256,6 +218,10 @@ export class SettlementContract extends SmartContract {
256
218
  blockProof.publicInput.stateRoot,
257
219
  "Input state root not matching"
258
220
  );
221
+ Provable.log("Network State Hash ", networkStateHash);
222
+ Provable.log("input Hash ", inputNetworkState.hash());
223
+ Provable.log("Proof Hash ", blockProof.publicInput.networkStateHash);
224
+
259
225
  networkStateHash.assertEquals(
260
226
  blockProof.publicInput.networkStateHash,
261
227
  "Input networkStateHash not matching"
@@ -273,69 +239,27 @@ export class SettlementContract extends SmartContract {
273
239
  blockProof.publicOutput.incomingMessagesHash,
274
240
  "Promised messages not honored"
275
241
  );
276
- this.honoredMessagesHash.set(promisedMessagesHash);
277
242
 
278
- // Assert and apply new promisedMessagesHash
279
- this.self.account.actionState.assertEquals(newPromisedMessagesHash);
280
- this.promisedMessagesHash.set(newPromisedMessagesHash);
243
+ // Call DispatchContract
244
+ // This call checks that the promisedMessagesHash, which is already proven
245
+ // to be the blockProofs publicoutput, is actually the current on-chain
246
+ // promisedMessageHash. It also checks the newPromisedMessagesHash to be
247
+ // a current sequencestate value
248
+ dispatchContract.updateMessagesHash(
249
+ promisedMessagesHash,
250
+ newPromisedMessagesHash
251
+ );
281
252
 
282
253
  this.lastSettlementL1Block.set(minBlockIncluded);
283
254
  }
284
255
 
285
- private dispatchMessage<Type>(
286
- methodId: Field,
287
- value: Type,
288
- valueType: ProvableExtended<Type>
289
- ) {
290
- const args = valueType.toFields(value);
291
- // Should be the same as RuntimeTransaction.hash
292
- const argsHash = Poseidon.hash(args);
293
- const runtimeTransaction = RuntimeTransaction.fromMessage({
294
- methodId,
295
- argsHash,
296
- });
297
-
298
- // Append tx to incomingMessagesHash
299
- const actionData = runtimeTransaction.hashData();
300
- const actionHash = MinaActions.actionHash(actionData);
301
-
302
- this.self.body.actions = {
303
- hash: actionHash,
304
- data: [actionData],
305
- };
306
-
307
- const eventHash = MinaEvents.eventHash(args);
308
- this.self.body.events = {
309
- hash: eventHash,
310
- data: [args],
311
- };
312
- }
313
-
314
- @method
315
- public deposit(amount: UInt64) {
316
- // Save this, since otherwise it would be a second witness later,
317
- // which could be a different values than the first
318
- const sender = this.sender;
319
-
320
- // Credit the amount to the bridge contract
321
- this.self.balance.addInPlace(amount);
322
-
323
- const action = new Deposit({
324
- address: sender,
325
- amount,
326
- });
327
- const methodId = Field(
328
- this.methodIdMappings[this.incomingMessagesPaths["deposit"]]
329
- );
330
- this.dispatchMessage(methodId.toConstant(), action, Deposit);
331
- }
332
-
333
256
  @method
334
257
  public rollupOutgoingMessages(batch: OutgoingMessageArgumentBatch) {
335
258
  let counter = this.outgoingMessageCursor.getAndAssertEquals();
336
259
  const stateRoot = this.stateRoot.getAndAssertEquals();
337
260
 
338
- const [withdrawalModule, withdrawalStateName] = this.withdrawalStatePath;
261
+ const [withdrawalModule, withdrawalStateName] =
262
+ SettlementSmartContract.args.withdrawalStatePath;
339
263
  const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
340
264
 
341
265
  let accountCreationFeePaid = Field(0);
@@ -403,42 +327,3 @@ export class SettlementContract extends SmartContract {
403
327
  this.balance.subInPlace(amount);
404
328
  }
405
329
  }
406
-
407
- export interface SettlementContractModuleConfig {
408
- withdrawalStatePath: `${string}.${string}`;
409
- withdrawalMethodPath: `${string}.${string}`;
410
- incomingMessagesMethods: Record<string, `${string}.${string}`>;
411
- }
412
-
413
- @injectable()
414
- export class SettlementContractModule extends ProtocolModule<SettlementContractModuleConfig> {
415
- public constructor(
416
- @injectAll("ProvableSettlementHook")
417
- private readonly hooks: ProvableSettlementHook<unknown>[],
418
- @inject("BlockProver")
419
- private readonly blockProver: BlockProvable
420
- ) {
421
- super();
422
- LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
423
- }
424
-
425
- public getContractClass(): typeof SettlementContract {
426
- return SettlementContract;
427
- }
428
-
429
- public createContract(
430
- address: PublicKey,
431
- methodIdMappings: SettlementMethodIdMapping
432
- ): SettlementContract {
433
- // We know that this returns [string, string], but TS can't infer that
434
- const withdrawalPath = this.config.withdrawalStatePath.split(".");
435
-
436
- return new SettlementContract(
437
- address,
438
- methodIdMappings,
439
- this.hooks,
440
- [withdrawalPath[0], withdrawalPath[1]],
441
- this.config.incomingMessagesMethods
442
- );
443
- }
444
- }
@@ -0,0 +1,6 @@
1
+ import { PublicKey, Struct, UInt64 } from "o1js";
2
+
3
+ export class Deposit extends Struct({
4
+ address: PublicKey,
5
+ amount: UInt64,
6
+ }) {}
@@ -0,0 +1,41 @@
1
+ import { Bool, Provable, Struct } from "o1js";
2
+ import { RollupMerkleTreeWitness } from "@proto-kit/common";
3
+ import { Withdrawal } from "./Withdrawal";
4
+
5
+ export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
6
+
7
+ export class OutgoingMessageArgument extends Struct({
8
+ witness: RollupMerkleTreeWitness,
9
+ value: Withdrawal,
10
+ }) {
11
+ public static dummy(): OutgoingMessageArgument {
12
+ return new OutgoingMessageArgument({
13
+ witness: RollupMerkleTreeWitness.dummy(),
14
+ value: Withdrawal.dummy(),
15
+ });
16
+ }
17
+ }
18
+
19
+ export class OutgoingMessageArgumentBatch extends Struct({
20
+ arguments: Provable.Array(
21
+ OutgoingMessageArgument,
22
+ OUTGOING_MESSAGE_BATCH_SIZE
23
+ ),
24
+
25
+ isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
26
+ }) {
27
+ public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
28
+ const batch = providedArguments.slice();
29
+ const isDummys = batch.map(() => Bool(false));
30
+
31
+ while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
32
+ batch.push(OutgoingMessageArgument.dummy());
33
+ isDummys.push(Bool(true));
34
+ }
35
+
36
+ return new OutgoingMessageArgumentBatch({
37
+ arguments: batch,
38
+ isDummys,
39
+ });
40
+ }
41
+ }
@@ -0,0 +1,14 @@
1
+ import { PublicKey, Struct, UInt64 } from "o1js";
2
+ import { EMPTY_PUBLICKEY } from "@proto-kit/common";
3
+
4
+ export class Withdrawal extends Struct({
5
+ address: PublicKey,
6
+ amount: UInt64,
7
+ }) {
8
+ public static dummy() {
9
+ return new Withdrawal({
10
+ address: EMPTY_PUBLICKEY,
11
+ amount: UInt64.from(0),
12
+ });
13
+ }
14
+ }
@@ -1,21 +1,18 @@
1
- import { Field, UInt32 } from "o1js";
1
+ import { Field, PublicKey, UInt32 } from "o1js";
2
2
 
3
- import type { BlockProof } from "../prover/block/BlockProver";
4
- import { ProtocolModule } from "../protocol/ProtocolModule";
5
- import { NetworkState } from "../model/network/NetworkState";
3
+ import type { BlockProof } from "../../prover/block/BlockProver";
4
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
5
+ import { NetworkState } from "../../model/network/NetworkState";
6
6
 
7
- import type { SettlementContract } from "./SettlementContract";
7
+ import type { SettlementSmartContract } from "../contracts/SettlementSmartContract";
8
8
 
9
9
  export type SettlementStateRecord = {
10
- sequencerKey: Field;
10
+ sequencerKey: PublicKey;
11
11
  lastSettlementL1Block: UInt32;
12
12
 
13
13
  stateRoot: Field;
14
14
  networkStateHash: Field;
15
15
  blockHashRoot: Field;
16
-
17
- promisedMessagesHash: Field;
18
- honoredMessagesHash: Field;
19
16
  };
20
17
 
21
18
  export type SettlementHookInputs = {
@@ -31,7 +28,7 @@ export abstract class ProvableSettlementHook<
31
28
  Config
32
29
  > extends ProtocolModule<Config> {
33
30
  public abstract beforeSettlement(
34
- smartContract: SettlementContract,
31
+ smartContract: SettlementSmartContract,
35
32
  inputs: SettlementHookInputs
36
33
  ): void;
37
34
  }
@@ -3,8 +3,8 @@ import { UInt64 } from "o1js";
3
3
  import {
4
4
  ProvableSettlementHook,
5
5
  SettlementHookInputs,
6
- } from "../ProvableSettlementHook";
7
- import { SettlementContract } from "../SettlementContract";
6
+ } from "../modularity/ProvableSettlementHook";
7
+ import { SettlementSmartContract } from "../contracts/SettlementSmartContract";
8
8
 
9
9
  type NetworkStateSettlementModuleConfig = {
10
10
  blocksPerL1Block: UInt64;
@@ -12,7 +12,7 @@ type NetworkStateSettlementModuleConfig = {
12
12
 
13
13
  export class NetworkStateSettlementModule extends ProvableSettlementHook<NetworkStateSettlementModuleConfig> {
14
14
  public beforeSettlement(
15
- smartContract: SettlementContract,
15
+ smartContract: SettlementSmartContract,
16
16
  {
17
17
  blockProof,
18
18
  fromNetworkState,
@@ -72,7 +72,8 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
72
72
  .current().result;
73
73
 
74
74
  // First try to find a match inside already created stateTransitions
75
- const previousMutatingTransitions = stateTransitions.filter((transition) =>
75
+ let previousMutatingTransitions: StateTransition<any>[] = [];
76
+ previousMutatingTransitions = stateTransitions.filter((transition) =>
76
77
  transition.path.equals(path).and(transition.to.isSome).toBoolean()
77
78
  );
78
79
  const pmtLength = previousMutatingTransitions.length;
@@ -1,4 +1,4 @@
1
- import { Bool } from "o1js";
1
+ import { Bool, Provable } from "o1js";
2
2
  import { container } from "tsyringe";
3
3
  import { log } from "@proto-kit/common";
4
4
 
@@ -18,12 +18,14 @@ export function assert(condition: Bool, message?: string) {
18
18
  const previousStatus = executionContext.current().result.status;
19
19
  const status = condition.and(previousStatus);
20
20
 
21
- if (!condition.toBoolean()) {
22
- if (!executionContext.current().isSimulated) {
23
- log.debug("Assertion failed: ", message);
21
+ Provable.asProver(() => {
22
+ if (!condition.toBoolean()) {
23
+ if (!executionContext.current().isSimulated) {
24
+ log.debug("Assertion failed: ", message);
25
+ }
26
+ executionContext.setStatusMessage(message);
24
27
  }
25
- executionContext.setStatusMessage(message);
26
- }
28
+ });
27
29
 
28
30
  executionContext.setStatus(status);
29
31
  }
@@ -29,10 +29,12 @@ export interface RuntimeMethodExecutionData {
29
29
  networkState: NetworkState;
30
30
  }
31
31
 
32
- export class RuntimeMethodExecutionDataStruct extends Struct({
33
- transaction: RuntimeTransaction,
34
- networkState: NetworkState,
35
- }) {}
32
+ export class RuntimeMethodExecutionDataStruct
33
+ extends Struct({
34
+ transaction: RuntimeTransaction,
35
+ networkState: NetworkState,
36
+ })
37
+ implements RuntimeMethodExecutionData {}
36
38
 
37
39
  /**
38
40
  * Execution context used to wrap runtime module methods,
@@ -125,7 +127,8 @@ export class RuntimeMethodExecutionContext extends ProvableMethodExecutionContex
125
127
  super.afterMethod();
126
128
  if (this.isFinished) {
127
129
  this.lastInput = this.input;
128
- this.input = undefined;
130
+ // TODO: find out why input isnt set in TransactionFeeHook during assert
131
+ // this.input = undefined;
129
132
  this.isSimulated = false;
130
133
  }
131
134
  }
@@ -1,4 +1,4 @@
1
- import { Field, FlexibleProvablePure, Poseidon } from "o1js";
1
+ import { Field, Poseidon, ProvablePure } from "o1js";
2
2
  import { hashWithPrefix, prefixToField } from "@proto-kit/common";
3
3
 
4
4
  import { ProvableHashList } from "./ProvableHashList";
@@ -51,7 +51,7 @@ export class MinaPrefixedProvableHashList<
51
51
  Value
52
52
  > extends ProvableHashList<Value> {
53
53
  public constructor(
54
- valueType: FlexibleProvablePure<Value>,
54
+ valueType: ProvablePure<Value>,
55
55
  public readonly prefix: string,
56
56
  internalCommitment: Field = Field(0)
57
57
  ) {
@@ -1,4 +1,4 @@
1
- import { Field, FlexibleProvablePure, Poseidon } from "o1js";
1
+ import { Field, ProvablePure, Poseidon } from "o1js";
2
2
 
3
3
  import { ProvableHashList } from "./ProvableHashList.js";
4
4
  import { stringToField } from "./utils";
@@ -7,7 +7,7 @@ export class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
7
7
  private readonly prefix: Field;
8
8
 
9
9
  public constructor(
10
- valueType: FlexibleProvablePure<Value>,
10
+ valueType: ProvablePure<Value>,
11
11
  prefix: string,
12
12
  internalCommitment: Field = Field(0)
13
13
  ) {
@@ -1,11 +1,11 @@
1
- import { Field, Poseidon, FlexibleProvablePure, Bool, Provable } from "o1js";
1
+ import { Field, Poseidon, Bool, Provable, ProvablePure } from "o1js";
2
2
 
3
3
  /**
4
4
  * Utilities for creating a hash list from a given value type.
5
5
  */
6
6
  export abstract class ProvableHashList<Value> {
7
7
  public constructor(
8
- private readonly valueType: FlexibleProvablePure<Value>,
8
+ protected readonly valueType: ProvablePure<Value>,
9
9
  public commitment: Field = Field(0)
10
10
  ) {}
11
11
 
@@ -47,4 +47,4 @@ export class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
47
47
  public hash(elements: Field[]): Field {
48
48
  return Poseidon.hash(elements);
49
49
  }
50
- }
50
+ }