@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
@@ -0,0 +1,127 @@
1
+ import {
2
+ AreProofsEnabled,
3
+ ChildContainerProvider,
4
+ ModuleContainer,
5
+ ModulesRecord, ResolvableModules, StringKeyOf,
6
+ TypedClass
7
+ } from "@proto-kit/common";
8
+ import { PublicKey, SmartContract } from "o1js";
9
+ import { injectable } from "tsyringe";
10
+
11
+ import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
12
+ import { ProtocolModule } from "../protocol/ProtocolModule";
13
+
14
+ import {
15
+ ContractModule,
16
+ SmartContractClassFromInterface,
17
+ } from "./ContractModule";
18
+ import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
19
+ import { DispatchContractType } from "./contracts/DispatchSmartContract";
20
+ import {
21
+ SettlementContractConfig,
22
+ SettlementContractProtocolModule,
23
+ } from "./contracts/SettlementContractProtocolModule";
24
+ import { SettlementContractType } from "./contracts/SettlementSmartContract";
25
+
26
+ export type SettlementModulesRecord = ModulesRecord<
27
+ TypedClass<ContractModule<unknown, unknown, unknown>>
28
+ >;
29
+
30
+ export type MandatorySettlementModulesRecord = {
31
+ SettlementContract: TypedClass<
32
+ ContractModule<
33
+ SettlementContractType,
34
+ SmartContractClassFromInterface<DispatchContractType>,
35
+ SettlementContractConfig
36
+ >
37
+ >;
38
+ DispatchContract: TypedClass<
39
+ ContractModule<DispatchContractType, unknown, unknown>
40
+ >;
41
+ };
42
+
43
+ @injectable()
44
+ export class SettlementContractModule<
45
+ SettlementModules extends SettlementModulesRecord &
46
+ MandatorySettlementModulesRecord
47
+ >
48
+ extends ModuleContainer<SettlementModules>
49
+ implements ProtocolModule<unknown>
50
+ {
51
+ public constructor(definition: { modules: SettlementModules }) {
52
+ super(definition);
53
+ }
54
+
55
+ public static from<
56
+ SettlementModules extends SettlementModulesRecord &
57
+ MandatorySettlementModulesRecord
58
+ >(
59
+ modules: SettlementModules
60
+ ): TypedClass<SettlementContractModule<SettlementModules>> {
61
+ return class ScopedSettlementContractModule extends SettlementContractModule<SettlementModules> {
62
+ public constructor() {
63
+ super({ modules });
64
+ }
65
+ };
66
+ }
67
+
68
+ public static fromDefaults() {
69
+ return SettlementContractModule.from({
70
+ SettlementContract: SettlementContractProtocolModule,
71
+ DispatchContract: DispatchContractProtocolModule,
72
+ });
73
+ }
74
+
75
+ // ** For protocol module
76
+ public protocol?: ProtocolEnvironment;
77
+
78
+ public get appChain(): AreProofsEnabled | undefined {
79
+ return this.protocol?.getAreProofsEnabled();
80
+ }
81
+ // **
82
+
83
+ public create(childContainerProvider: ChildContainerProvider) {
84
+ super.create(childContainerProvider);
85
+ }
86
+
87
+ // private assertIsKeyofModules
88
+
89
+ public getContractClasses(): {
90
+ settlement: SmartContractClassFromInterface<SettlementContractType>;
91
+ dispatch: SmartContractClassFromInterface<DispatchContractType>;
92
+ } {
93
+ const settlementContractKey = "SettlementContract"
94
+ const dispatchContractKey = "DispatchContract"
95
+ this.assertIsValidModuleName(settlementContractKey)
96
+ this.assertIsValidModuleName(dispatchContractKey)
97
+
98
+ const settlementModule = this.resolve(settlementContractKey);
99
+ const dispatchModule = this.resolve(dispatchContractKey);
100
+
101
+ const dispatch = dispatchModule.contractFactory(undefined);
102
+ const settlement = settlementModule.contractFactory(dispatch);
103
+
104
+ return {
105
+ settlement,
106
+ dispatch,
107
+ };
108
+ }
109
+
110
+ public createContracts(addresses: {
111
+ settlement: PublicKey;
112
+ dispatch: PublicKey;
113
+ }): {
114
+ settlement: SettlementContractType & SmartContract;
115
+ dispatch: DispatchContractType & SmartContract;
116
+ } {
117
+ const { dispatch, settlement } = this.getContractClasses();
118
+
119
+ const dispatchInstance = new dispatch(addresses.dispatch);
120
+ const settlementInstance = new settlement(addresses.settlement);
121
+
122
+ return {
123
+ dispatch: dispatchInstance,
124
+ settlement: settlementInstance,
125
+ };
126
+ }
127
+ }
@@ -0,0 +1,39 @@
1
+ import { inject, injectable } from "tsyringe";
2
+
3
+ import { RuntimeLike } from "../../model/RuntimeLike";
4
+ import {
5
+ ContractModule,
6
+ SmartContractClassFromInterface,
7
+ } from "../ContractModule";
8
+
9
+ import {
10
+ DispatchSmartContract,
11
+ DispatchContractType,
12
+ } from "./DispatchSmartContract";
13
+
14
+ export type DispatchContractConfig = {
15
+ incomingMessagesMethods: Record<string, `${string}.${string}`>;
16
+ };
17
+
18
+ @injectable()
19
+ export class DispatchContractProtocolModule extends ContractModule<
20
+ DispatchContractType,
21
+ undefined,
22
+ DispatchContractConfig
23
+ > {
24
+ public constructor(@inject("Runtime") private readonly runtime: RuntimeLike) {
25
+ super();
26
+ }
27
+
28
+ public contractFactory(): SmartContractClassFromInterface<DispatchContractType> {
29
+ const { incomingMessagesMethods } = this.config;
30
+ const methodIdMappings = this.runtime.methodIdResolver.methodIdMap();
31
+
32
+ DispatchSmartContract.args = {
33
+ incomingMessagesPaths: incomingMessagesMethods,
34
+ methodIdMappings,
35
+ };
36
+
37
+ return DispatchSmartContract;
38
+ }
39
+ }
@@ -0,0 +1,135 @@
1
+ import {
2
+ AccountUpdate,
3
+ Field,
4
+ method,
5
+ Poseidon,
6
+ ProvableExtended,
7
+ PublicKey,
8
+ Reducer,
9
+ SmartContract,
10
+ State,
11
+ state,
12
+ UInt64,
13
+ } from "o1js";
14
+
15
+ import { RuntimeMethodIdMapping } from "../../model/RuntimeLike";
16
+ import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
17
+ import {
18
+ MinaActions,
19
+ MinaEvents,
20
+ } from "../../utils/MinaPrefixedProvableHashList";
21
+ import { Deposit } from "../messages/Deposit";
22
+
23
+ export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
24
+
25
+ export interface DispatchContractType {
26
+ updateMessagesHash: (
27
+ executedMessagesHash: Field,
28
+ newPromisedMessagesHash: Field
29
+ ) => void;
30
+ initialize: (settlementContract: PublicKey) => void;
31
+
32
+ promisedMessagesHash: State<Field>;
33
+ }
34
+
35
+ export class DispatchSmartContract
36
+ extends SmartContract
37
+ implements DispatchContractType
38
+ {
39
+ public static args: {
40
+ methodIdMappings: RuntimeMethodIdMapping;
41
+ incomingMessagesPaths: Record<string, `${string}.${string}`>;
42
+ };
43
+
44
+ @state(Field) public promisedMessagesHash = State<Field>();
45
+
46
+ @state(Field) public honoredMessagesHash = State<Field>();
47
+
48
+ @state(PublicKey) public settlementContract = State<PublicKey>();
49
+
50
+ @method
51
+ public updateMessagesHash(
52
+ executedMessagesHash: Field,
53
+ newPromisedMessagesHash: Field
54
+ ) {
55
+ const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
56
+ this.honoredMessagesHash.getAndAssertEquals();
57
+
58
+ executedMessagesHash.assertEquals(promisedMessagesHash);
59
+
60
+ this.honoredMessagesHash.set(executedMessagesHash);
61
+
62
+ // Assert and apply new promisedMessagesHash
63
+ this.self.account.actionState.assertEquals(newPromisedMessagesHash);
64
+ this.promisedMessagesHash.set(newPromisedMessagesHash);
65
+ }
66
+
67
+ @method
68
+ public initialize(settlementContract: PublicKey) {
69
+ this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
70
+ this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
71
+ this.settlementContract
72
+ .getAndAssertEquals()
73
+ .assertEquals(PublicKey.empty());
74
+
75
+ this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
76
+ this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
77
+ this.settlementContract.set(settlementContract);
78
+ }
79
+
80
+ private dispatchMessage<Type>(
81
+ methodId: Field,
82
+ value: Type,
83
+ valueType: ProvableExtended<Type>
84
+ ) {
85
+ const args = valueType.toFields(value);
86
+ // Should be the same as RuntimeTransaction.hash
87
+ const argsHash = Poseidon.hash(args);
88
+ const runtimeTransaction = RuntimeTransaction.fromMessage({
89
+ methodId,
90
+ argsHash,
91
+ });
92
+
93
+ // Append tx to incomingMessagesHash
94
+ const actionData = runtimeTransaction.hashData();
95
+ const actionHash = MinaActions.actionHash(actionData);
96
+
97
+ this.self.body.actions = {
98
+ hash: actionHash,
99
+ data: [actionData],
100
+ };
101
+
102
+ const eventHash = MinaEvents.eventHash(args);
103
+ this.self.body.events = {
104
+ hash: eventHash,
105
+ data: [args],
106
+ };
107
+ }
108
+
109
+ @method
110
+ public deposit(amount: UInt64) {
111
+ // Save this, since otherwise it would be a second witness later,
112
+ // which could be a different values than the first
113
+ const { sender } = this;
114
+
115
+ const settlementContract = this.settlementContract.getAndAssertEquals();
116
+
117
+ // Credit the amount to the settlement contract
118
+ const balanceAU = AccountUpdate.create(settlementContract);
119
+ balanceAU.balance.addInPlace(amount);
120
+ this.self.approve(balanceAU);
121
+
122
+ const action = new Deposit({
123
+ address: sender,
124
+ amount,
125
+ });
126
+
127
+ const { methodIdMappings, incomingMessagesPaths } =
128
+ DispatchSmartContract.args;
129
+
130
+ const methodId = Field(
131
+ methodIdMappings[incomingMessagesPaths.deposit].methodId
132
+ ).toConstant();
133
+ this.dispatchMessage(methodId.toConstant(), action, Deposit);
134
+ }
135
+ }
@@ -0,0 +1,65 @@
1
+ import { TypedClass } from "@proto-kit/common";
2
+ import { SmartContract } from "o1js";
3
+ import { inject, injectable, injectAll } from "tsyringe";
4
+
5
+ import { BlockProvable } from "../../prover/block/BlockProvable";
6
+ import {
7
+ ContractModule,
8
+ SmartContractClassFromInterface,
9
+ } from "../ContractModule";
10
+ import { ProvableSettlementHook } from "../modularity/ProvableSettlementHook";
11
+
12
+ import { DispatchContractType } from "./DispatchSmartContract";
13
+ import {
14
+ LazyBlockProof,
15
+ SettlementContractType,
16
+ SettlementSmartContract,
17
+ } from "./SettlementSmartContract";
18
+
19
+ export type SettlementContractConfig = {
20
+ escapeHatchSlotsInterval?: number;
21
+ withdrawalStatePath: `${string}.${string}`;
22
+ withdrawalMethodPath: `${string}.${string}`;
23
+ };
24
+
25
+ // 24 hours
26
+ const DEFAULT_ESCAPE_HATCH = (60 / 3) * 24;
27
+
28
+ @injectable()
29
+ export class SettlementContractProtocolModule extends ContractModule<
30
+ SettlementContractType,
31
+ TypedClass<DispatchContractType & SmartContract>,
32
+ SettlementContractConfig
33
+ > {
34
+ public constructor(
35
+ @injectAll("ProvableSettlementHook")
36
+ private readonly hooks: ProvableSettlementHook<unknown>[],
37
+ @inject("BlockProver")
38
+ private readonly blockProver: BlockProvable
39
+ ) {
40
+ LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
41
+ super();
42
+ }
43
+
44
+ public contractFactory(
45
+ dispatchContract: TypedClass<DispatchContractType & SmartContract>
46
+ ): SmartContractClassFromInterface<SettlementContractType> {
47
+ const { hooks, config } = this;
48
+
49
+ const withdrawalStatePathSplit = this.config.withdrawalStatePath.split(
50
+ "."
51
+ ) as [string, string];
52
+
53
+ const escapeHatchSlotsInterval =
54
+ this.config.escapeHatchSlotsInterval ?? DEFAULT_ESCAPE_HATCH;
55
+
56
+ SettlementSmartContract.args = {
57
+ DispatchContract: dispatchContract,
58
+ hooks,
59
+ withdrawalStatePath: withdrawalStatePathSplit,
60
+ escapeHatchSlotsInterval,
61
+ };
62
+
63
+ return SettlementSmartContract;
64
+ }
65
+ }