@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 +1 @@
1
- {"version":3,"file":"MinaPrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/MinaPrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAY,MAAM,MAAM,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,wBAAgB,YAAY,IAAI,KAAK,CAEpC;AAED,wBAAgB,WAAW,IAAI,KAAK,CAEnC;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,UAAU,CACf,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,GAAE,KAAsB,GACnC,KAAK;CAOT;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,KAAqB,GAAG,KAAK;CAO7E;AAED,qBAAa,4BAA4B,CACvC,KAAK,CACL,SAAQ,gBAAgB,CAAC,KAAK,CAAC;aAGb,MAAM,EAAE,MAAM;gBAD9B,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,EACtB,MAAM,EAAE,MAAM,EAC9B,kBAAkB,GAAE,KAAgB;IAKtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAKzC;AAED,qBAAa,mBAAoB,SAAQ,4BAA4B,CAAC,KAAK,CAAC;gBACvD,kBAAkB,GAAE,KAAgB;CAGxD"}
1
+ {"version":3,"file":"MinaPrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/MinaPrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,YAAY,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,wBAAgB,YAAY,IAAI,KAAK,CAEpC;AAED,wBAAgB,WAAW,IAAI,KAAK,CAEnC;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,UAAU,CACf,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,GAAE,KAAsB,GACnC,KAAK;CAOT;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,KAAqB,GAAG,KAAK;CAO7E;AAED,qBAAa,4BAA4B,CACvC,KAAK,CACL,SAAQ,gBAAgB,CAAC,KAAK,CAAC;aAGb,MAAM,EAAE,MAAM;gBAD9B,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EACd,MAAM,EAAE,MAAM,EAC9B,kBAAkB,GAAE,KAAgB;IAKtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAKzC;AAED,qBAAa,mBAAoB,SAAQ,4BAA4B,CAAC,KAAK,CAAC;gBACvD,kBAAkB,GAAE,KAAgB;CAGxD"}
@@ -1,8 +1,8 @@
1
- import { Field, FlexibleProvablePure } from "o1js";
1
+ import { Field, ProvablePure } from "o1js";
2
2
  import { ProvableHashList } from "./ProvableHashList.js";
3
3
  export declare class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
4
4
  private readonly prefix;
5
- constructor(valueType: FlexibleProvablePure<Value>, prefix: string, internalCommitment?: Field);
5
+ constructor(valueType: ProvablePure<Value>, prefix: string, internalCommitment?: Field);
6
6
  protected hash(elements: Field[]): Field;
7
7
  }
8
8
  //# sourceMappingURL=PrefixedProvableHashList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/PrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAY,MAAM,MAAM,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,qBAAa,wBAAwB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAG7B,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,EACtC,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,KAAgB;IAMtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGzC"}
1
+ {"version":3,"file":"PrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/PrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAY,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,qBAAa,wBAAwB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAG7B,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,KAAgB;IAMtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGzC"}
@@ -1,11 +1,11 @@
1
- import { Field, FlexibleProvablePure, Bool } from "o1js";
1
+ import { Field, Bool, ProvablePure } from "o1js";
2
2
  /**
3
3
  * Utilities for creating a hash list from a given value type.
4
4
  */
5
5
  export declare abstract class ProvableHashList<Value> {
6
- private readonly valueType;
6
+ protected readonly valueType: ProvablePure<Value>;
7
7
  commitment: Field;
8
- constructor(valueType: FlexibleProvablePure<Value>, commitment?: Field);
8
+ constructor(valueType: ProvablePure<Value>, commitment?: Field);
9
9
  protected abstract hash(elements: Field[]): Field;
10
10
  /**
11
11
  * Converts the provided value to Field[] and appends it to
@@ -1 +1 @@
1
- {"version":3,"file":"ProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/ProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,oBAAoB,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AAE7E;;GAEG;AACH,8BAAsB,gBAAgB,CAAC,KAAK;IAExC,OAAO,CAAC,QAAQ,CAAC,SAAS;IACnB,UAAU,EAAE,KAAK;gBADP,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,EAChD,UAAU,GAAE,KAAgB;IAGrC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;IAEjD;;;;;;OAMG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK;IAQjB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAS3C;;OAEG;IACI,OAAO;CAGf;AAED,qBAAa,uBAAuB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGtC"}
1
+ {"version":3,"file":"ProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/ProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,IAAI,EAAY,YAAY,EAAE,MAAM,MAAM,CAAC;AAErE;;GAEG;AACH,8BAAsB,gBAAgB,CAAC,KAAK;IAExC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC;IAC1C,UAAU,EAAE,KAAK;gBADL,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1C,UAAU,GAAE,KAAgB;IAGrC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;IAEjD;;;;;;OAMG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK;IAQjB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAS3C;;OAEG;IACI,OAAO;CAGf;AAED,qBAAa,uBAAuB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGtC"}
@@ -0,0 +1,14 @@
1
+ import { Bool, Field } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export declare class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
4
+ unconstrainedList: Value[];
5
+ private constrainedLastValue;
6
+ private preimage;
7
+ pushAndReduce(value: Value, reduce: (previous: Value) => [Value, Bool]): {
8
+ popLast: Bool;
9
+ value: Value;
10
+ };
11
+ pushIf(value: Value, condition: Bool): this;
12
+ hash(elements: Field[]): Field;
13
+ }
14
+ //# sourceMappingURL=ProvableReductionHashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvableReductionHashList.d.ts","sourceRoot":"","sources":["../../src/utils/ProvableReductionHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAsB,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,qBAAa,yBAAyB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IACpE,iBAAiB,EAAE,KAAK,EAAE,CAAM;IAEvC,OAAO,CAAC,oBAAoB,CAAgC;IAE5D,OAAO,CAAC,QAAQ,CAA0B;IAEnC,aAAa,CAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GACzC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE;IA4C3B,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAMpC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGtC"}
@@ -0,0 +1,50 @@
1
+ import { Bool, Poseidon, Provable } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export class ProvableReductionHashList extends ProvableHashList {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.unconstrainedList = [];
7
+ this.constrainedLastValue = undefined;
8
+ this.preimage = this.commitment;
9
+ }
10
+ pushAndReduce(value, reduce) {
11
+ let valueToPush = value;
12
+ let popLast = Bool(false);
13
+ // Theoretically, we can feed the preimage + last value as a witness
14
+ // for non-zero commitment starts (like used in the BlockProver), because
15
+ // currently it won't reduce across chunks. But this is okay for now I think
16
+ if (this.constrainedLastValue !== undefined) {
17
+ [valueToPush, popLast] = reduce(this.constrainedLastValue);
18
+ }
19
+ Provable.asProver(() => {
20
+ if (popLast.toBoolean()) {
21
+ this.unconstrainedList.pop();
22
+ }
23
+ const valueAsConstant = this.valueType.fromFields(this.valueType.toFields(valueToPush).map((field) => field.toConstant()));
24
+ this.unconstrainedList.push(valueAsConstant);
25
+ });
26
+ const currentCommitment = this.commitment;
27
+ const noPopCommitment = this.hash([
28
+ currentCommitment,
29
+ ...this.valueType.toFields(valueToPush),
30
+ ]);
31
+ const popCommitment = this.hash([
32
+ this.preimage,
33
+ ...this.valueType.toFields(valueToPush),
34
+ ]);
35
+ this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
36
+ this.constrainedLastValue = valueToPush;
37
+ this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
38
+ return {
39
+ popLast,
40
+ value: valueToPush,
41
+ };
42
+ }
43
+ pushIf(value, condition) {
44
+ throw new Error("pushIf is not implemented for ReducedHashList");
45
+ return this;
46
+ }
47
+ hash(elements) {
48
+ return Poseidon.hash(elements);
49
+ }
50
+ }
@@ -0,0 +1,11 @@
1
+ import { ProvableStateTransition, StateTransition } from "../model/StateTransition";
2
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
3
+ export declare class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
4
+ push(value: ProvableStateTransition): this;
5
+ pushWithMetadata(value: ProvableStateTransition): {
6
+ popLast: import("o1js/dist/node/lib/bool").Bool;
7
+ value: ProvableStateTransition;
8
+ };
9
+ }
10
+ export declare function reduceStateTransitions(transitions: StateTransition<unknown>[]): StateTransition<unknown>[];
11
+ //# sourceMappingURL=StateTransitionReductionList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionReductionList.d.ts","sourceRoot":"","sources":["../../src/utils/StateTransitionReductionList.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,qBAAa,4BAA6B,SAAQ,yBAAyB,CAAC,uBAAuB,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,uBAAuB;IAMnC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB;;;;CAyCvD;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GACtC,eAAe,CAAC,OAAO,CAAC,EAAE,CA0B5B"}
@@ -0,0 +1,60 @@
1
+ import { Provable } from "o1js";
2
+ import { ProvableOption } from "../model/Option";
3
+ import { ProvableStateTransition, StateTransition, } from "../model/StateTransition";
4
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
5
+ export class StateTransitionReductionList extends ProvableReductionHashList {
6
+ push(value) {
7
+ this.pushWithMetadata(value);
8
+ return this;
9
+ }
10
+ pushWithMetadata(value) {
11
+ return this.pushAndReduce(value, (previous) => {
12
+ const pathsMatch = previous.path.equals(value.path);
13
+ // Take the previous.from if the paths match, otherwise leave ST as is
14
+ const from = Provable.if(pathsMatch, ProvableOption, previous.from, value.from);
15
+ // In case we have a layout like
16
+ // { from: 5, to: 10 }, { from: 10, to: none }
17
+ // we just take the first and discard the second
18
+ const to = Provable.if(value.to.isSome.or(pathsMatch.not()), ProvableOption, value.to, previous.to);
19
+ const transition = new ProvableStateTransition({
20
+ path: value.path,
21
+ from: new ProvableOption(from),
22
+ to: new ProvableOption(to),
23
+ });
24
+ // Assert that connection is correct
25
+ previous.to.value
26
+ .equals(value.from.value)
27
+ .or(previous.to.isSome
28
+ .not()
29
+ .and(previous.from.value.equals(value.from.value)))
30
+ .or(pathsMatch.not())
31
+ .assertTrue();
32
+ return [transition, pathsMatch];
33
+ });
34
+ }
35
+ }
36
+ export function reduceStateTransitions(transitions) {
37
+ const reduced = [];
38
+ for (const st of transitions) {
39
+ if (reduced.length === 0) {
40
+ reduced.push(st);
41
+ continue;
42
+ }
43
+ const last = reduced.at(-1);
44
+ if (last.path.equals(st.path).toBoolean()) {
45
+ if (st.toValue.isSome.toBoolean()) {
46
+ reduced.pop();
47
+ reduced.push(new StateTransition(st.path, last.fromValue, st.toValue));
48
+ }
49
+ else {
50
+ // Do nothing, because we discard that ST
51
+ // { from: 5, to: 10 }, { from: 10, to: none }
52
+ // cancel the 2nd
53
+ }
54
+ }
55
+ else {
56
+ reduced.push(st);
57
+ }
58
+ }
59
+ return reduced;
60
+ }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "license": "MIT",
4
4
  "private": false,
5
5
  "type": "module",
6
- "version": "0.1.1-develop.600+699a7df",
6
+ "version": "0.1.1-develop.651+7591cb6",
7
7
  "scripts": {
8
8
  "build": "tsc -p tsconfig.json",
9
9
  "dev": "tsc -p tsconfig.json --watch",
@@ -32,5 +32,5 @@
32
32
  "@jest/globals": "^29.5.0",
33
33
  "@types/lodash": "^4.14.194"
34
34
  },
35
- "gitHead": "699a7dfa3b5d3415ab4500f0cd495d6781365c6a"
35
+ "gitHead": "7591cb6bdf58a6cd525a10902c25bc292efcfc6b"
36
36
  }
@@ -5,12 +5,14 @@ import { StateMap } from "../state/StateMap";
5
5
  import { protocolState } from "../state/protocol/ProtocolState";
6
6
  import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
7
7
  import { assert } from "../state/assert/assert";
8
+ import { injectable } from "tsyringe";
8
9
 
9
10
  export class AccountState extends Struct({
10
11
  nonce: UInt64,
11
12
  }) {}
12
13
 
13
- export class AccountStateModule extends ProvableTransactionHook {
14
+ @injectable()
15
+ export class AccountStateHook extends ProvableTransactionHook {
14
16
  @protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
15
17
  PublicKey,
16
18
  AccountState
@@ -2,11 +2,10 @@ import { injectable } from "tsyringe";
2
2
  import { noop } from "@proto-kit/common";
3
3
  import { SmartContract } from "o1js";
4
4
 
5
- import { BlockProof } from "../prover/block/BlockProver";
6
5
  import {
7
6
  ProvableSettlementHook,
8
7
  SettlementHookInputs,
9
- } from "../settlement/ProvableSettlementHook";
8
+ } from "../settlement/modularity/ProvableSettlementHook";
10
9
 
11
10
  @injectable()
12
11
  export class NoopSettlementHook extends ProvableSettlementHook<
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
- export * from "./blockmodules/AccountStateModule";
2
- export * from "./blockmodules/BlockHeightHook";
3
- export * from "./blockmodules/LastStateRootBlockHook";
1
+ export * from "./hooks/AccountStateHook";
2
+ export * from "./hooks/BlockHeightHook";
4
3
  export * from "./utils/ProvableHashList";
4
+ export * from "./hooks/LastStateRootBlockHook";
5
5
  export * from "./model/StateTransition";
6
6
  export * from "./model/StateTransitionProvableBatch";
7
7
  export * from "./model/Option";
@@ -10,8 +10,13 @@ export * from "./model/network/NetworkState";
10
10
  export * from "./model/transaction/SignedTransaction";
11
11
  export * from "./model/transaction/RuntimeTransaction";
12
12
  export * from "./model/transaction/ValueOption";
13
+ export * from "./model/MethodPublicOutput";
14
+ export * from "./model/RuntimeLike";
15
+ export * from "./utils/ProvableHashList";
13
16
  export * from "./utils/PrefixedProvableHashList";
14
17
  export * from "./utils/MinaPrefixedProvableHashList";
18
+ export * from "./utils/ProvableReductionHashList";
19
+ export * from "./utils/StateTransitionReductionList";
15
20
  export * from "./utils/utils";
16
21
  export * from "./prover/block/BlockProver";
17
22
  export * from "./prover/block/BlockProvable";
@@ -19,7 +24,6 @@ export * from "./prover/block/accummulators/BlockHashMerkleTree";
19
24
  export * from "./prover/statetransition/StateTransitionProver";
20
25
  export * from "./prover/statetransition/StateTransitionProvable";
21
26
  export * from "./prover/statetransition/StateTransitionWitnessProvider";
22
- export * from "./model/MethodPublicOutput";
23
27
  export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
24
28
  export * from "./protocol/Protocol";
25
29
  export * from "./protocol/ProtocolModule";
@@ -35,7 +39,15 @@ export * from "./state/StateMap";
35
39
  export * from "./state/StateService";
36
40
  export * from "./state/StateServiceProvider";
37
41
  export * from "./state/assert/assert";
38
- export * from "./settlement/SettlementContract";
39
- export * from "./settlement/ProvableSettlementHook";
42
+ export * from "./settlement/contracts/SettlementSmartContract";
43
+ export * from "./settlement/contracts/SettlementContractProtocolModule";
44
+ export * from "./settlement/contracts/DispatchSmartContract";
45
+ export * from "./settlement/contracts/DispatchContractProtocolModule";
46
+ export * from "./settlement/SettlementContractModule";
47
+ export * from "./settlement/ContractModule";
48
+ export * from "./settlement/modularity/ProvableSettlementHook";
49
+ export * from "./settlement/messages/OutgoingMessageArgument";
40
50
  export * from "./settlement/modules/NetworkStateSettlementModule";
51
+ export * from "./settlement/messages/Deposit";
52
+ export * from "./settlement/messages/Withdrawal";
41
53
  export { constants as ProtocolConstants } from "./Constants";
@@ -4,6 +4,7 @@ import {
4
4
  type FlexibleProvablePure,
5
5
  Poseidon,
6
6
  Provable,
7
+ ProvablePure,
7
8
  Struct,
8
9
  } from "o1js";
9
10
 
@@ -149,4 +150,19 @@ export class Option<Value> extends OptionBase {
149
150
  defaultValue
150
151
  );
151
152
  }
153
+
154
+ public toConstant() {
155
+ const valueConstant = (this.valueType as ProvablePure<Value>).fromFields(
156
+ this.valueType.toFields(this.value).map((field) => field.toConstant())
157
+ );
158
+ const boolConstant = (bool: Bool) =>
159
+ Bool.fromFields([bool.toField().toConstant()]);
160
+
161
+ return new Option(
162
+ boolConstant(this.isSome),
163
+ valueConstant,
164
+ this.valueType,
165
+ boolConstant(this.isForcedSome)
166
+ );
167
+ }
152
168
  }
@@ -0,0 +1,12 @@
1
+ export type RuntimeMethodInvocationType = "INCOMING_MESSAGE" | "SIGNATURE";
2
+
3
+ export type RuntimeMethodIdMapping = Record<
4
+ `${string}.${string}`,
5
+ { methodId: bigint; type: RuntimeMethodInvocationType }
6
+ >;
7
+
8
+ export interface RuntimeLike {
9
+ get methodIdResolver(): {
10
+ methodIdMap: () => RuntimeMethodIdMapping;
11
+ };
12
+ }
@@ -1,4 +1,4 @@
1
- import { Field, Struct } from "o1js";
1
+ import { Bool, Field, ProvablePure, Struct } from "o1js";
2
2
 
3
3
  import { Option, ProvableOption } from "./Option";
4
4
 
@@ -44,7 +44,7 @@ export class StateTransition<Value> {
44
44
 
45
45
  public constructor(
46
46
  public path: Field,
47
- public fromValue: Option<Field> | Option<Value>,
47
+ public fromValue: Option<Value>,
48
48
  public toValue: Option<Field> | Option<Value>
49
49
  ) {}
50
50
 
@@ -77,4 +77,12 @@ export class StateTransition<Value> {
77
77
  to: this.toValue.toJSON(),
78
78
  };
79
79
  }
80
+
81
+ public toConstant(): StateTransition<Value> {
82
+ return new StateTransition<Value>(
83
+ this.path.toConstant(),
84
+ this.fromValue.toConstant(),
85
+ this.toValue.toConstant()
86
+ );
87
+ }
80
88
  }
@@ -19,15 +19,15 @@ import { StateService } from "../state/StateService";
19
19
 
20
20
  import { ProtocolModule } from "./ProtocolModule";
21
21
  import { ProvableTransactionHook } from "./ProvableTransactionHook";
22
- import { NoopTransactionHook } from "../blockmodules/NoopTransactionHook";
22
+ import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
23
23
  import { ProtocolEnvironment } from "./ProtocolEnvironment";
24
- import { AccountStateModule } from "../blockmodules/AccountStateModule";
24
+ import { AccountStateHook } from "../hooks/AccountStateHook";
25
25
  import { ProvableBlockHook } from "./ProvableBlockHook";
26
- import { NoopBlockHook } from "../blockmodules/NoopBlockHook";
27
- import { BlockHeightHook } from "../blockmodules/BlockHeightHook";
28
- import { LastStateRootBlockHook } from "../blockmodules/LastStateRootBlockHook";
29
- import { ProvableSettlementHook } from "../settlement/ProvableSettlementHook";
30
- import { NoopSettlementHook } from "../blockmodules/NoopSettlementHook";
26
+ import { NoopBlockHook } from "../hooks/NoopBlockHook";
27
+ import { BlockHeightHook } from "../hooks/BlockHeightHook";
28
+ import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
29
+ import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
30
+ import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
31
31
 
32
32
  const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
33
33
  ProvableTransactionHook: "ProvableTransactionHook",
@@ -35,42 +35,38 @@ const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
35
35
  ProvableSettlementHook: "ProvableSettlementHook",
36
36
  };
37
37
 
38
- export type GenericProtocolModuleRecord = ModulesRecord<
38
+ export type ProtocolModulesRecord = ModulesRecord<
39
39
  TypedClass<ProtocolModule<unknown>>
40
40
  >;
41
41
 
42
- interface BlockProverType extends ProtocolModule, BlockProvable {}
42
+ export interface BlockProverType extends ProtocolModule, BlockProvable {}
43
43
 
44
- interface StateTransitionProverType
44
+ export interface StateTransitionProverType
45
45
  extends ProtocolModule,
46
46
  StateTransitionProvable {}
47
47
 
48
- export interface ProtocolCustomModulesRecord
49
- extends GenericProtocolModuleRecord {
48
+ export type MandatoryProtocolModulesRecord = {
50
49
  BlockProver: TypedClass<BlockProverType>;
51
50
  StateTransitionProver: TypedClass<StateTransitionProverType>;
52
- AccountState: TypedClass<AccountStateModule>;
51
+ AccountState: TypedClass<AccountStateHook>;
53
52
  BlockHeight: TypedClass<BlockHeightHook>;
54
53
  LastStateRoot: TypedClass<LastStateRootBlockHook>;
55
- }
56
-
57
- export interface ProtocolModulesRecord
58
- extends GenericProtocolModuleRecord,
59
- ProtocolCustomModulesRecord {}
54
+ };
60
55
 
61
56
  export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
62
57
  modules: Modules;
63
58
  config?: ModulesConfig<Modules>;
64
59
  }
65
60
 
66
- export class Protocol<Modules extends ProtocolModulesRecord>
61
+ export class Protocol<
62
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
63
+ >
67
64
  extends ModuleContainer<Modules>
68
65
  implements ProtocolEnvironment
69
66
  {
70
- // .from() to create Protocol
71
- public static from<Modules extends ProtocolModulesRecord>(
72
- modules: ProtocolDefinition<Modules>
73
- ): TypedClass<Protocol<Modules>> {
67
+ public static from<
68
+ Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord
69
+ >(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
74
70
  return class ScopedProtocol extends Protocol<Modules> {
75
71
  public constructor() {
76
72
  super(modules);
@@ -188,24 +184,3 @@ export class Protocol<Modules extends ProtocolModulesRecord>
188
184
  });
189
185
  }
190
186
  }
191
-
192
- export const VanillaProtocol = {
193
- create() {
194
- return VanillaProtocol.from({});
195
- },
196
-
197
- from<AdditonalModules extends GenericProtocolModuleRecord>(
198
- additionalModules: AdditonalModules
199
- ): TypedClass<Protocol<ProtocolCustomModulesRecord & AdditonalModules>> {
200
- return Protocol.from<ProtocolCustomModulesRecord & AdditonalModules>({
201
- modules: {
202
- StateTransitionProver,
203
- BlockProver,
204
- AccountState: AccountStateModule,
205
- BlockHeight: BlockHeightHook,
206
- LastStateRoot: LastStateRootBlockHook,
207
- ...additionalModules,
208
- },
209
- });
210
- },
211
- };
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  AreProofsEnabled,
3
3
  ChildContainerProvider,
4
- ConfigurableModule, NoConfig,
5
- noop
4
+ ConfigurableModule,
5
+ NoConfig,
6
+ noop,
6
7
  } from "@proto-kit/common";
7
8
 
8
9
  import { ProtocolEnvironment } from "./ProtocolEnvironment";
@@ -2,10 +2,11 @@
2
2
  import {
3
3
  Bool,
4
4
  Experimental,
5
- Field, Poseidon,
5
+ Field,
6
+ Poseidon,
6
7
  type Proof,
7
8
  Provable,
8
- SelfProof
9
+ SelfProof,
9
10
  } from "o1js";
10
11
  import { container, inject, injectable, injectAll } from "tsyringe";
11
12
  import {
@@ -35,7 +36,11 @@ import { RuntimeMethodExecutionContext } from "../../state/context/RuntimeMethod
35
36
  import { ProvableBlockHook } from "../../protocol/ProvableBlockHook";
36
37
  import { NetworkState } from "../../model/network/NetworkState";
37
38
  import { SignedTransaction } from "../../model/transaction/SignedTransaction";
38
- import { MinaActions, MinaActionsHashList } from "../../utils/MinaPrefixedProvableHashList";
39
+ import {
40
+ MinaActions,
41
+ MinaActionsHashList,
42
+ } from "../../utils/MinaPrefixedProvableHashList";
43
+ import { StateTransitionReductionList } from "../../utils/StateTransitionReductionList";
39
44
 
40
45
  import {
41
46
  BlockProvable,
@@ -274,7 +279,7 @@ export class BlockProverProgrammable extends ZkProgrammable<
274
279
  transition.toProvable()
275
280
  );
276
281
 
277
- const hashList = new DefaultProvableHashList(
282
+ const hashList = new StateTransitionReductionList(
278
283
  ProvableStateTransition,
279
284
  stateTransitionProof.publicInput.protocolTransitionsHash
280
285
  );
@@ -369,7 +374,9 @@ export class BlockProverProgrammable extends ZkProgrammable<
369
374
  // Append tx to incomingMessagesHash
370
375
  const actionHash = MinaActions.actionHash(transaction.hashData());
371
376
 
372
- const incomingMessagesList = new MinaActionsHashList(state.incomingMessagesHash);
377
+ const incomingMessagesList = new MinaActionsHashList(
378
+ state.incomingMessagesHash
379
+ );
373
380
  incomingMessagesList.pushIf(actionHash, isMessage);
374
381
 
375
382
  stateTo.incomingMessagesHash = incomingMessagesList.commitment;
@@ -506,7 +513,7 @@ export class BlockProverProgrammable extends ZkProgrammable<
506
513
  "beforeBlock"
507
514
  );
508
515
 
509
- const beforeBlockHashList = new DefaultProvableHashList(
516
+ const beforeBlockHashList = new StateTransitionReductionList(
510
517
  ProvableStateTransition
511
518
  );
512
519
  beforeBlockResult.stateTransitions.forEach((st) => {
@@ -554,7 +561,7 @@ export class BlockProverProgrammable extends ZkProgrammable<
554
561
  "afterBlock"
555
562
  );
556
563
 
557
- const afterBlockHashList = new DefaultProvableHashList(
564
+ const afterBlockHashList = new StateTransitionReductionList(
558
565
  ProvableStateTransition
559
566
  );
560
567
  afterBlockResult.stateTransitions.forEach((st) => {
@@ -568,7 +575,11 @@ export class BlockProverProgrammable extends ZkProgrammable<
568
575
  afterBlockHashList.commitment,
569
576
  "STProof from-ST-hash not matching generated ST-hash from afterBlock hooks"
570
577
  );
571
- state.stateRoot = stateTransitionProof.publicInput.stateRoot;
578
+ state.stateRoot = Provable.if(
579
+ stsEmitted,
580
+ stateTransitionProof.publicOutput.stateRoot,
581
+ state.stateRoot
582
+ );
572
583
 
573
584
  // 6. Close block
574
585
 
@@ -800,6 +811,7 @@ export class BlockProverProgrammable extends ZkProgrammable<
800
811
  return {
801
812
  compile: program.compile.bind(program),
802
813
  verify: program.verify.bind(program),
814
+ analyzeMethods: program.analyzeMethods.bind(program),
803
815
  Proof: SelfProofClass,
804
816
  methods,
805
817
  };
@@ -1,7 +1,7 @@
1
1
  import { createMerkleTree } from "@proto-kit/common";
2
2
  import { Bool, Field, Poseidon, Provable, Struct } from "o1js";
3
3
 
4
- export class BlockHashMerkleTree extends createMerkleTree(16) {}
4
+ export class BlockHashMerkleTree extends createMerkleTree(40) {}
5
5
  export class BlockHashMerkleTreeWitness extends BlockHashMerkleTree.WITNESS {}
6
6
 
7
7
  export class BlockHashTreeEntry extends Struct({
@@ -30,6 +30,7 @@ import {
30
30
  StateTransitionProverPublicOutput,
31
31
  } from "./StateTransitionProvable";
32
32
  import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
33
+ import { StateTransitionProverType } from "../../protocol/Protocol";
33
34
 
34
35
  const errors = {
35
36
  propertyNotMatching: (property: string, step: string) =>
@@ -127,6 +128,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
127
128
  return {
128
129
  compile: program.compile.bind(program),
129
130
  verify: program.verify.bind(program),
131
+ analyzeMethods: program.analyzeMethods.bind(program),
130
132
  Proof: SelfProofClass,
131
133
  methods,
132
134
  };
@@ -339,9 +341,9 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
339
341
  @injectable()
340
342
  export class StateTransitionProver
341
343
  extends ProtocolModule
342
- implements StateTransitionProvable
344
+ implements StateTransitionProvable, StateTransitionProverType
343
345
  {
344
- public readonly zkProgrammable: StateTransitionProverProgrammable;
346
+ public zkProgrammable: StateTransitionProverProgrammable;
345
347
 
346
348
  public constructor(
347
349
  // Injected
@@ -0,0 +1,24 @@
1
+ import { ConfigurableModule, NoConfig, TypedClass } from "@proto-kit/common";
2
+ import { SmartContract } from "o1js";
3
+
4
+ export type SmartContractClassFromInterface<Type> = typeof SmartContract &
5
+ TypedClass<Type>;
6
+
7
+ /**
8
+ * This module type is used to define a contract module that can be used to
9
+ * construct and inject smart contract instances.
10
+ * It defines a method contractFactory, whose arguments can be configured via
11
+ * the Argument generic. It returns a smart contract class that is a subclass
12
+ * of SmartContract and implements a certain interface as specified by the
13
+ * ContractType generic.
14
+ */
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>;
24
+ }