@proto-kit/protocol 0.1.1-develop.600 → 0.1.1-develop.833
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.
- package/LICENSE.md +201 -201
- package/dist/blockmodules/AccountStateModule.d.ts +37 -37
- package/dist/blockmodules/AccountStateModule.js +43 -43
- package/dist/blockmodules/BlockHeightHook.d.ts +6 -6
- package/dist/blockmodules/BlockHeightHook.js +15 -15
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +7 -7
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -15
- package/dist/blockmodules/NoopBlockHook.d.ts +8 -8
- package/dist/blockmodules/NoopBlockHook.js +9 -9
- package/dist/blockmodules/NoopSettlementHook.d.ts +5 -5
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopSettlementHook.js +18 -18
- package/dist/blockmodules/NoopTransactionHook.d.ts +5 -5
- package/dist/blockmodules/NoopTransactionHook.js +4 -4
- package/dist/hooks/AccountStateHook.d.ts +19 -5
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +15 -9
- package/dist/hooks/BlockHeightHook.d.ts +3 -3
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/hooks/BlockHeightHook.js +5 -4
- package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +15 -0
- package/dist/hooks/NoopBlockHook.d.ts +6 -4
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
- package/dist/hooks/NoopBlockHook.js +4 -4
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/hooks/NoopSettlementHook.js +17 -0
- package/dist/hooks/NoopTransactionHook.d.ts +1 -1
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -1
- package/dist/hooks/NoopTransactionHook.js +4 -1
- package/dist/index.d.ts +18 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -8
- package/dist/model/MethodPublicOutput.d.ts +68 -34
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/Option.d.ts +39 -19
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +6 -0
- package/dist/model/Path.d.ts +1 -1
- package/dist/model/Path.d.ts.map +1 -1
- package/dist/model/Path.js +0 -2
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +1 -0
- package/dist/model/StateTransition.d.ts +51 -14
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +3 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +71 -14
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
- package/dist/model/StateTransitionReduction.d.ts +3 -0
- package/dist/model/StateTransitionReduction.d.ts.map +1 -0
- package/dist/model/StateTransitionReduction.js +26 -0
- package/dist/model/network/NetworkState.d.ts +73 -18
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +2 -2
- package/dist/model/transaction/ProtocolTransaction.d.ts +69 -69
- package/dist/model/transaction/ProtocolTransaction.js +18 -18
- package/dist/model/transaction/RuntimeTransaction.d.ts +50 -16
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +4 -4
- package/dist/model/transaction/SignedTransaction.d.ts +39 -3
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -1
- package/dist/model/transaction/SignedTransaction.js +1 -1
- package/dist/model/transaction/ValueOption.d.ts +86 -32
- package/dist/model/transaction/ValueOption.d.ts.map +1 -1
- package/dist/model/transaction/ValueOption.js +1 -1
- package/dist/protocol/Protocol.d.ts +14 -20
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +13 -27
- package/dist/protocol/ProtocolEnvironment.d.ts +3 -3
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.d.ts +1 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +4 -2
- package/dist/protocol/ProvableBlockHook.d.ts +2 -2
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.d.ts +240 -98
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.d.ts +8 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +55 -45
- package/dist/prover/block/BlockTransactionPosition.d.ts +35 -35
- package/dist/prover/block/BlockTransactionPosition.js +25 -25
- package/dist/prover/block/BundleTransactionPosition.d.ts +36 -0
- package/dist/prover/block/BundleTransactionPosition.d.ts.map +1 -0
- package/dist/prover/block/BundleTransactionPosition.js +25 -0
- package/dist/prover/block/SplitPrefilledStateService.d.ts +11 -0
- package/dist/prover/block/SplitPrefilledStateService.d.ts.map +1 -0
- package/dist/prover/block/SplitPrefilledStateService.js +1 -0
- package/dist/prover/block/SplitStateService.d.ts +11 -0
- package/dist/prover/block/SplitStateService.d.ts.map +1 -0
- package/dist/prover/block/SplitStateService.js +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +35 -16
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -1
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -1
- package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/acummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +116 -58
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.d.ts +10 -9
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +18 -22
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +1 -2
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +1 -2
- package/dist/settlement/ContractModule.d.ts +15 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +11 -0
- package/dist/settlement/DispatchContract.d.ts +20 -0
- package/dist/settlement/DispatchContract.d.ts.map +1 -0
- package/dist/settlement/DispatchContract.js +112 -0
- package/dist/settlement/OutgoingMessageArgument.d.ts +109 -0
- package/dist/settlement/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/ProvableSettlementHook.d.ts +25 -25
- package/dist/settlement/ProvableSettlementHook.js +3 -3
- package/dist/settlement/SettlementContract.d.ts +229 -229
- package/dist/settlement/SettlementContract.js +346 -346
- package/dist/settlement/SettlementContractModule.d.ts +40 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +71 -0
- package/dist/settlement/contracts/DispatchContract.d.ts +21 -0
- package/dist/settlement/contracts/DispatchContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContract.js +111 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/{hooks/TransactionFeeHook.js → settlement/contracts/DispatchContractProtocolModule.js} +17 -21
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
- package/dist/settlement/contracts/SettlementContract.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContract.js +43 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +42 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +246 -0
- package/dist/settlement/messages/Deposit.d.ts +64 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +6 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +189 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/messages/Withdrawal.d.ts +65 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +13 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +3 -3
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
- package/dist/settlement/modules/NetworkStateSettlementModule.js +4 -2
- package/dist/state/State.d.ts +4 -3
- package/dist/state/State.d.ts.map +1 -1
- package/dist/state/State.js +18 -12
- package/dist/state/StateMap.d.ts +3 -3
- package/dist/state/StateMap.d.ts.map +1 -1
- package/dist/state/StateMap.js +4 -5
- package/dist/state/StateService.d.ts +3 -3
- package/dist/state/StateService.d.ts.map +1 -1
- package/dist/state/StateServiceProvider.d.ts +3 -3
- package/dist/state/StateServiceProvider.d.ts.map +1 -1
- package/dist/state/StateServiceProvider.js +1 -3
- package/dist/state/assert/assert.d.ts +1 -1
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +11 -5
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts +1 -1
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/ProtocolMethodExecutionContext.js +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +55 -4
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +6 -6
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/TransitionMethodExecutionContext.js +0 -1
- package/dist/state/context/contextExecution.d.ts +14 -0
- package/dist/state/context/contextExecution.d.ts.map +1 -0
- package/dist/state/context/contextExecution.js +30 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -1
- package/dist/state/protocol/ProtocolState.js +0 -3
- package/dist/utils/AppliedBatchHashList.d.ts +17 -0
- package/dist/utils/AppliedBatchHashList.d.ts.map +1 -0
- package/dist/utils/AppliedBatchHashList.js +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/MinaPrefixedProvableHashList.js +1 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableHashList.d.ts +4 -4
- package/dist/utils/ProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +50 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +60 -0
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +11 -0
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +1 -0
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +12 -0
- package/dist/utils/merkletree/MerkleTreeStore.d.ts +5 -0
- package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +1 -0
- package/dist/utils/merkletree/MerkleTreeStore.js +1 -0
- package/dist/utils/merkletree/RollupMerkleTree.d.ts +133 -0
- package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +1 -0
- package/dist/utils/merkletree/RollupMerkleTree.js +255 -0
- package/dist/utils/utils.d.ts +1 -1
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +5 -10
- package/package.json +5 -5
- package/src/{blockmodules/AccountStateModule.ts → hooks/AccountStateHook.ts} +13 -9
- package/src/{blockmodules → hooks}/BlockHeightHook.ts +3 -4
- package/src/{blockmodules → hooks}/LastStateRootBlockHook.ts +4 -4
- package/src/{blockmodules → hooks}/NoopBlockHook.ts +6 -5
- package/src/{blockmodules → hooks}/NoopSettlementHook.ts +3 -4
- package/src/{blockmodules → hooks}/NoopTransactionHook.ts +5 -1
- package/src/index.ts +18 -8
- package/src/model/MethodPublicOutput.ts +2 -2
- package/src/model/Option.ts +21 -1
- package/src/model/Path.ts +1 -3
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +9 -1
- package/src/model/Transaction.ts +2 -0
- package/src/model/network/NetworkState.ts +2 -2
- package/src/model/transaction/RuntimeTransaction.ts +5 -12
- package/src/model/transaction/SignedTransaction.ts +1 -8
- package/src/model/transaction/ValueOption.ts +1 -1
- package/src/protocol/Protocol.ts +34 -48
- package/src/protocol/ProtocolEnvironment.ts +7 -6
- package/src/protocol/ProtocolModule.ts +8 -4
- package/src/protocol/ProvableBlockHook.ts +3 -3
- package/src/protocol/ProvableTransactionHook.ts +4 -2
- package/src/protocol/TransitioningProtocolModule.ts +1 -1
- package/src/prover/block/BlockProvable.ts +3 -3
- package/src/prover/block/BlockProver.ts +98 -63
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +2 -2
- package/src/prover/statetransition/StateTransitionProvable.ts +3 -3
- package/src/prover/statetransition/StateTransitionProver.ts +26 -28
- package/src/settlement/ContractModule.ts +24 -0
- package/src/settlement/SettlementContractModule.ts +132 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +136 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +67 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +350 -0
- package/src/settlement/messages/Deposit.ts +6 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
- package/src/settlement/messages/Withdrawal.ts +14 -0
- package/src/settlement/{ProvableSettlementHook.ts → modularity/ProvableSettlementHook.ts} +9 -13
- package/src/settlement/modules/NetworkStateSettlementModule.ts +8 -5
- package/src/state/State.ts +21 -13
- package/src/state/StateMap.ts +4 -5
- package/src/state/StateService.ts +3 -3
- package/src/state/StateServiceProvider.ts +6 -7
- package/src/state/assert/assert.ts +13 -7
- package/src/state/context/RuntimeMethodExecutionContext.ts +13 -7
- package/src/state/context/TransitionMethodExecutionContext.ts +0 -1
- package/src/state/protocol/ProtocolState.ts +1 -4
- package/src/utils/MinaPrefixedProvableHashList.ts +4 -3
- package/src/utils/PrefixedProvableHashList.ts +2 -2
- package/src/utils/ProvableHashList.ts +2 -2
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +89 -0
- package/src/utils/utils.ts +4 -9
- package/test/BlockProver.test.ts +110 -128
- package/test/Protocol.test.ts +14 -21
- package/test/State.test.ts +8 -8
- package/test/StateTransition.test.ts +56 -66
- package/test/TestingProtocol.ts +48 -0
- package/test/model/Option.test.ts +72 -0
- package/{src → test}/state/assert/assert.test.ts +4 -4
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +0 -3
- package/dist/hooks/TransactionFeeHook.d.ts +0 -16
- package/dist/hooks/TransactionFeeHook.d.ts.map +0 -1
- package/src/blockmodules/SequenceStateTransactionModule.ts +0 -25
- package/src/model/Option.test.ts +0 -21
- package/src/settlement/SettlementContract.ts +0 -444
- package/src/state/context/ProtocolMethodExecutionContext.ts +0 -36
- package/test/Option.test.ts +0 -64
- package/tsconfig.test.json +0 -9
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import {
|
|
2
|
+
prefixToField,
|
|
3
|
+
RollupMerkleTree,
|
|
4
|
+
TypedClass,
|
|
5
|
+
mapSequential,
|
|
6
|
+
} from "@proto-kit/common";
|
|
7
|
+
import {
|
|
8
|
+
AccountUpdate,
|
|
9
|
+
Bool,
|
|
10
|
+
Field,
|
|
11
|
+
method,
|
|
12
|
+
Mina,
|
|
13
|
+
Poseidon,
|
|
14
|
+
Proof,
|
|
15
|
+
Provable,
|
|
16
|
+
PublicKey,
|
|
17
|
+
Signature,
|
|
18
|
+
SmartContract,
|
|
19
|
+
State,
|
|
20
|
+
state,
|
|
21
|
+
TokenId,
|
|
22
|
+
UInt32,
|
|
23
|
+
UInt64,
|
|
24
|
+
TokenContract,
|
|
25
|
+
AccountUpdateForest,
|
|
26
|
+
} from "o1js";
|
|
27
|
+
|
|
28
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
29
|
+
import { Path } from "../../model/Path";
|
|
30
|
+
import { BlockHashMerkleTree } from "../../prover/block/accummulators/BlockHashMerkleTree";
|
|
31
|
+
import {
|
|
32
|
+
BlockProverPublicInput,
|
|
33
|
+
BlockProverPublicOutput,
|
|
34
|
+
} from "../../prover/block/BlockProvable";
|
|
35
|
+
import {
|
|
36
|
+
OUTGOING_MESSAGE_BATCH_SIZE,
|
|
37
|
+
OutgoingMessageArgumentBatch,
|
|
38
|
+
} from "../messages/OutgoingMessageArgument";
|
|
39
|
+
import { Withdrawal } from "../messages/Withdrawal";
|
|
40
|
+
import {
|
|
41
|
+
ProvableSettlementHook,
|
|
42
|
+
SettlementHookInputs,
|
|
43
|
+
SettlementStateRecord,
|
|
44
|
+
} from "../modularity/ProvableSettlementHook";
|
|
45
|
+
|
|
46
|
+
import { DispatchContractType } from "./DispatchSmartContract";
|
|
47
|
+
|
|
48
|
+
/* eslint-disable @typescript-eslint/lines-between-class-members */
|
|
49
|
+
|
|
50
|
+
export class LazyBlockProof extends Proof<
|
|
51
|
+
BlockProverPublicInput,
|
|
52
|
+
BlockProverPublicOutput
|
|
53
|
+
> {
|
|
54
|
+
public static publicInputType = BlockProverPublicInput;
|
|
55
|
+
|
|
56
|
+
public static publicOutputType = BlockProverPublicOutput;
|
|
57
|
+
|
|
58
|
+
public static tag: () => { name: string } = () => {
|
|
59
|
+
throw new Error("Tag not initialized yet");
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface SettlementContractType {
|
|
64
|
+
initialize: (
|
|
65
|
+
sequencer: PublicKey,
|
|
66
|
+
dispatchContract: PublicKey
|
|
67
|
+
) => Promise<void>;
|
|
68
|
+
settle: (
|
|
69
|
+
blockProof: LazyBlockProof,
|
|
70
|
+
signature: Signature,
|
|
71
|
+
dispatchContractAddress: PublicKey,
|
|
72
|
+
publicKey: PublicKey,
|
|
73
|
+
inputNetworkState: NetworkState,
|
|
74
|
+
outputNetworkState: NetworkState,
|
|
75
|
+
newPromisedMessagesHash: Field
|
|
76
|
+
) => Promise<void>;
|
|
77
|
+
rollupOutgoingMessages: (
|
|
78
|
+
batch: OutgoingMessageArgumentBatch
|
|
79
|
+
) => Promise<void>;
|
|
80
|
+
redeem: (additionUpdate: AccountUpdate) => Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Some random prefix for the sequencer signature
|
|
84
|
+
export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
|
|
85
|
+
|
|
86
|
+
export class SettlementSmartContract
|
|
87
|
+
extends TokenContract
|
|
88
|
+
implements SettlementContractType
|
|
89
|
+
{
|
|
90
|
+
// This pattern of injecting args into a smartcontract is currently the only
|
|
91
|
+
// viable solution that works given the inheritance issues of o1js
|
|
92
|
+
public static args: {
|
|
93
|
+
DispatchContract: TypedClass<DispatchContractType & SmartContract>;
|
|
94
|
+
hooks: ProvableSettlementHook<unknown>[];
|
|
95
|
+
withdrawalStatePath: [string, string];
|
|
96
|
+
escapeHatchSlotsInterval: number;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
@state(Field) public sequencerKey = State<Field>();
|
|
100
|
+
@state(UInt32) public lastSettlementL1Block = State<UInt32>();
|
|
101
|
+
|
|
102
|
+
@state(Field) public stateRoot = State<Field>();
|
|
103
|
+
@state(Field) public networkStateHash = State<Field>();
|
|
104
|
+
@state(Field) public blockHashRoot = State<Field>();
|
|
105
|
+
|
|
106
|
+
@state(Field) public dispatchContractAddressX = State<Field>();
|
|
107
|
+
|
|
108
|
+
@state(Field) public outgoingMessageCursor = State<Field>();
|
|
109
|
+
|
|
110
|
+
@method async approveBase(forest: AccountUpdateForest) {
|
|
111
|
+
this.checkZeroBalanceChange(forest);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@method
|
|
115
|
+
public async initialize(sequencer: PublicKey, dispatchContract: PublicKey) {
|
|
116
|
+
this.sequencerKey.getAndRequireEquals().assertEquals(Field(0));
|
|
117
|
+
this.stateRoot.getAndRequireEquals().assertEquals(Field(0));
|
|
118
|
+
this.blockHashRoot.getAndRequireEquals().assertEquals(Field(0));
|
|
119
|
+
this.networkStateHash.getAndRequireEquals().assertEquals(Field(0));
|
|
120
|
+
this.dispatchContractAddressX.getAndRequireEquals().assertEquals(Field(0));
|
|
121
|
+
|
|
122
|
+
this.sequencerKey.set(sequencer.x);
|
|
123
|
+
this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
|
|
124
|
+
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
|
|
125
|
+
this.networkStateHash.set(NetworkState.empty().hash());
|
|
126
|
+
this.dispatchContractAddressX.set(dispatchContract.x);
|
|
127
|
+
|
|
128
|
+
const { DispatchContract } = SettlementSmartContract.args;
|
|
129
|
+
await new DispatchContract(dispatchContract).initialize(this.address);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@method
|
|
133
|
+
public async settle(
|
|
134
|
+
blockProof: LazyBlockProof,
|
|
135
|
+
signature: Signature,
|
|
136
|
+
dispatchContractAddress: PublicKey,
|
|
137
|
+
publicKey: PublicKey,
|
|
138
|
+
inputNetworkState: NetworkState,
|
|
139
|
+
outputNetworkState: NetworkState,
|
|
140
|
+
newPromisedMessagesHash: Field
|
|
141
|
+
) {
|
|
142
|
+
// Verify the blockproof
|
|
143
|
+
blockProof.verify();
|
|
144
|
+
|
|
145
|
+
// Get and assert on-chain values
|
|
146
|
+
const stateRoot = this.stateRoot.getAndRequireEquals();
|
|
147
|
+
const networkStateHash = this.networkStateHash.getAndRequireEquals();
|
|
148
|
+
const blockHashRoot = this.blockHashRoot.getAndRequireEquals();
|
|
149
|
+
const sequencerKey = this.sequencerKey.getAndRequireEquals();
|
|
150
|
+
const lastSettlementL1Block =
|
|
151
|
+
this.lastSettlementL1Block.getAndRequireEquals();
|
|
152
|
+
const onChainDispatchContractAddressX =
|
|
153
|
+
this.dispatchContractAddressX.getAndRequireEquals();
|
|
154
|
+
|
|
155
|
+
onChainDispatchContractAddressX.assertEquals(
|
|
156
|
+
dispatchContractAddress.x,
|
|
157
|
+
"DispatchContract address not provided correctly"
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
const { DispatchContract, escapeHatchSlotsInterval, hooks } =
|
|
161
|
+
SettlementSmartContract.args;
|
|
162
|
+
|
|
163
|
+
// Get dispatch contract values
|
|
164
|
+
// These values are witnesses but will be checked later on the AU
|
|
165
|
+
// call to the dispatch contract via .updateMessagesHash()
|
|
166
|
+
const dispatchContract = new DispatchContract(dispatchContractAddress);
|
|
167
|
+
const promisedMessagesHash = dispatchContract.promisedMessagesHash.get();
|
|
168
|
+
|
|
169
|
+
// Get block height and use the lower bound for all ops
|
|
170
|
+
const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
|
|
171
|
+
this.network.globalSlotSinceGenesis.requireBetween(
|
|
172
|
+
minBlockIncluded,
|
|
173
|
+
// 5 because that is the length the newPromisedMessagesHash will be valid
|
|
174
|
+
minBlockIncluded.add(4)
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
// Check signature/escape catch
|
|
178
|
+
publicKey.x.assertEquals(
|
|
179
|
+
sequencerKey,
|
|
180
|
+
"Sequencer public key witness not matching"
|
|
181
|
+
);
|
|
182
|
+
const signatureValid = signature.verify(publicKey, [
|
|
183
|
+
BATCH_SIGNATURE_PREFIX,
|
|
184
|
+
lastSettlementL1Block.value,
|
|
185
|
+
]);
|
|
186
|
+
const escapeHatchActivated = lastSettlementL1Block
|
|
187
|
+
.add(UInt32.from(escapeHatchSlotsInterval))
|
|
188
|
+
.lessThan(minBlockIncluded);
|
|
189
|
+
signatureValid
|
|
190
|
+
.or(escapeHatchActivated)
|
|
191
|
+
.assertTrue(
|
|
192
|
+
"Sequencer signature not valid and escape hatch not activated"
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
// Assert correctness of networkState witness
|
|
196
|
+
Provable.log("Network State Hash ", networkStateHash);
|
|
197
|
+
Provable.log("input Hash ", inputNetworkState.hash());
|
|
198
|
+
Provable.log("equals ", inputNetworkState.hash().equals(networkStateHash));
|
|
199
|
+
|
|
200
|
+
inputNetworkState
|
|
201
|
+
.hash()
|
|
202
|
+
.assertEquals(networkStateHash, "InputNetworkState witness not valid");
|
|
203
|
+
outputNetworkState
|
|
204
|
+
.hash()
|
|
205
|
+
.assertEquals(
|
|
206
|
+
blockProof.publicOutput.networkStateHash,
|
|
207
|
+
"OutputNetworkState witness not valid"
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
blockProof.publicOutput.closed.assertEquals(
|
|
211
|
+
Bool(true),
|
|
212
|
+
"Supplied proof is not a closed BlockProof"
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
// Execute onSettlementHooks for additional checks
|
|
216
|
+
const stateRecord: SettlementStateRecord = {
|
|
217
|
+
blockHashRoot,
|
|
218
|
+
stateRoot,
|
|
219
|
+
networkStateHash,
|
|
220
|
+
lastSettlementL1Block,
|
|
221
|
+
sequencerKey: publicKey,
|
|
222
|
+
};
|
|
223
|
+
const inputs: SettlementHookInputs = {
|
|
224
|
+
blockProof,
|
|
225
|
+
contractState: stateRecord,
|
|
226
|
+
newPromisedMessagesHash,
|
|
227
|
+
fromNetworkState: inputNetworkState,
|
|
228
|
+
toNetworkState: outputNetworkState,
|
|
229
|
+
currentL1Block: minBlockIncluded,
|
|
230
|
+
};
|
|
231
|
+
await mapSequential(hooks, async (hook) => {
|
|
232
|
+
await hook.beforeSettlement(this, inputs);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// Apply blockProof
|
|
236
|
+
stateRoot.assertEquals(
|
|
237
|
+
blockProof.publicInput.stateRoot,
|
|
238
|
+
"Input state root not matching"
|
|
239
|
+
);
|
|
240
|
+
Provable.log("Network State Hash ", networkStateHash);
|
|
241
|
+
Provable.log("input Hash ", inputNetworkState.hash());
|
|
242
|
+
Provable.log("Proof Hash ", blockProof.publicInput.networkStateHash);
|
|
243
|
+
|
|
244
|
+
networkStateHash.assertEquals(
|
|
245
|
+
blockProof.publicInput.networkStateHash,
|
|
246
|
+
"Input networkStateHash not matching"
|
|
247
|
+
);
|
|
248
|
+
blockHashRoot.assertEquals(
|
|
249
|
+
blockProof.publicInput.blockHashRoot,
|
|
250
|
+
"Input blockHashRoot not matching"
|
|
251
|
+
);
|
|
252
|
+
this.stateRoot.set(blockProof.publicOutput.stateRoot);
|
|
253
|
+
this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
|
|
254
|
+
this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
|
|
255
|
+
|
|
256
|
+
// Assert and apply deposit commitments
|
|
257
|
+
promisedMessagesHash.assertEquals(
|
|
258
|
+
blockProof.publicOutput.incomingMessagesHash,
|
|
259
|
+
"Promised messages not honored"
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
// Call DispatchContract
|
|
263
|
+
// This call checks that the promisedMessagesHash, which is already proven
|
|
264
|
+
// to be the blockProofs publicoutput, is actually the current on-chain
|
|
265
|
+
// promisedMessageHash. It also checks the newPromisedMessagesHash to be
|
|
266
|
+
// a current sequencestate value
|
|
267
|
+
await dispatchContract.updateMessagesHash(
|
|
268
|
+
promisedMessagesHash,
|
|
269
|
+
newPromisedMessagesHash
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
this.lastSettlementL1Block.set(minBlockIncluded);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@method
|
|
276
|
+
public async rollupOutgoingMessages(batch: OutgoingMessageArgumentBatch) {
|
|
277
|
+
let counter = this.outgoingMessageCursor.getAndRequireEquals();
|
|
278
|
+
const stateRoot = this.stateRoot.getAndRequireEquals();
|
|
279
|
+
|
|
280
|
+
const [withdrawalModule, withdrawalStateName] =
|
|
281
|
+
SettlementSmartContract.args.withdrawalStatePath;
|
|
282
|
+
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
283
|
+
|
|
284
|
+
let accountCreationFeePaid = Field(0);
|
|
285
|
+
|
|
286
|
+
for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
|
|
287
|
+
const args = batch.arguments[i];
|
|
288
|
+
|
|
289
|
+
// Check witness
|
|
290
|
+
const path = Path.fromKey(mapPath, Field, counter);
|
|
291
|
+
|
|
292
|
+
args.witness
|
|
293
|
+
.checkMembership(
|
|
294
|
+
stateRoot,
|
|
295
|
+
path,
|
|
296
|
+
Poseidon.hash(Withdrawal.toFields(args.value))
|
|
297
|
+
)
|
|
298
|
+
.assertTrue("Provided Withdrawal witness not valid");
|
|
299
|
+
|
|
300
|
+
// Process message
|
|
301
|
+
const { address, amount } = args.value;
|
|
302
|
+
const isDummy = address.equals(this.address);
|
|
303
|
+
|
|
304
|
+
const tokenAu = this.internal.mint({ address, amount });
|
|
305
|
+
const isNewAccount = tokenAu.account.isNew.getAndRequireEquals();
|
|
306
|
+
tokenAu.body.balanceChange.magnitude =
|
|
307
|
+
tokenAu.body.balanceChange.magnitude.sub(
|
|
308
|
+
Provable.if(
|
|
309
|
+
isNewAccount,
|
|
310
|
+
Mina.getNetworkConstants().accountCreationFee.toConstant(),
|
|
311
|
+
UInt64.zero
|
|
312
|
+
)
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
accountCreationFeePaid = accountCreationFeePaid.add(
|
|
316
|
+
Provable.if(isNewAccount, Field(1e9), Field(0))
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
this.balance.subInPlace(UInt64.Unsafe.fromField(accountCreationFeePaid));
|
|
323
|
+
|
|
324
|
+
this.outgoingMessageCursor.set(counter);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
@method
|
|
328
|
+
public async redeem(additionUpdate: AccountUpdate) {
|
|
329
|
+
additionUpdate.body.tokenId.assertEquals(
|
|
330
|
+
TokenId.default,
|
|
331
|
+
"Tokenid not default token"
|
|
332
|
+
);
|
|
333
|
+
additionUpdate.body.balanceChange.sgn
|
|
334
|
+
.isPositive()
|
|
335
|
+
.assertTrue("Sign not correct");
|
|
336
|
+
const amount = additionUpdate.body.balanceChange.magnitude;
|
|
337
|
+
|
|
338
|
+
// Burn tokens
|
|
339
|
+
this.internal.burn({
|
|
340
|
+
address: additionUpdate.publicKey,
|
|
341
|
+
amount,
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
// Send mina
|
|
345
|
+
this.approve(additionUpdate);
|
|
346
|
+
this.balance.subInPlace(amount);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* eslint-enable @typescript-eslint/lines-between-class-members */
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Bool, Provable, Struct } from "o1js";
|
|
2
|
+
import { RollupMerkleTreeWitness } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { Withdrawal } from "./Withdrawal";
|
|
5
|
+
|
|
6
|
+
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
7
|
+
|
|
8
|
+
export class OutgoingMessageArgument extends Struct({
|
|
9
|
+
witness: RollupMerkleTreeWitness,
|
|
10
|
+
value: Withdrawal,
|
|
11
|
+
}) {
|
|
12
|
+
public static dummy(): OutgoingMessageArgument {
|
|
13
|
+
return new OutgoingMessageArgument({
|
|
14
|
+
witness: RollupMerkleTreeWitness.dummy(),
|
|
15
|
+
value: Withdrawal.dummy(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class OutgoingMessageArgumentBatch extends Struct({
|
|
21
|
+
arguments: Provable.Array(
|
|
22
|
+
OutgoingMessageArgument,
|
|
23
|
+
OUTGOING_MESSAGE_BATCH_SIZE
|
|
24
|
+
),
|
|
25
|
+
|
|
26
|
+
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
27
|
+
}) {
|
|
28
|
+
public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
|
|
29
|
+
const batch = providedArguments.slice();
|
|
30
|
+
const isDummys = batch.map(() => Bool(false));
|
|
31
|
+
|
|
32
|
+
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
33
|
+
batch.push(OutgoingMessageArgument.dummy());
|
|
34
|
+
isDummys.push(Bool(true));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return new OutgoingMessageArgumentBatch({
|
|
38
|
+
arguments: batch,
|
|
39
|
+
isDummys,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -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,17 @@
|
|
|
1
|
-
import { Field, UInt32 } from "o1js";
|
|
1
|
+
import { Field, PublicKey, UInt32 } from "o1js";
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import type { SettlementContract } from "./SettlementContract";
|
|
3
|
+
import { ProtocolModule } from "../../protocol/ProtocolModule";
|
|
4
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
5
|
+
import type { BlockProof } from "../../prover/block/BlockProver";
|
|
6
|
+
import type { SettlementSmartContract } from "../contracts/SettlementSmartContract";
|
|
8
7
|
|
|
9
8
|
export type SettlementStateRecord = {
|
|
10
|
-
sequencerKey:
|
|
9
|
+
sequencerKey: PublicKey;
|
|
11
10
|
lastSettlementL1Block: UInt32;
|
|
12
11
|
|
|
13
12
|
stateRoot: Field;
|
|
14
13
|
networkStateHash: Field;
|
|
15
14
|
blockHashRoot: Field;
|
|
16
|
-
|
|
17
|
-
promisedMessagesHash: Field;
|
|
18
|
-
honoredMessagesHash: Field;
|
|
19
15
|
};
|
|
20
16
|
|
|
21
17
|
export type SettlementHookInputs = {
|
|
@@ -28,10 +24,10 @@ export type SettlementHookInputs = {
|
|
|
28
24
|
};
|
|
29
25
|
|
|
30
26
|
export abstract class ProvableSettlementHook<
|
|
31
|
-
Config
|
|
27
|
+
Config,
|
|
32
28
|
> extends ProtocolModule<Config> {
|
|
33
29
|
public abstract beforeSettlement(
|
|
34
|
-
smartContract:
|
|
30
|
+
smartContract: SettlementSmartContract,
|
|
35
31
|
inputs: SettlementHookInputs
|
|
36
|
-
): void
|
|
32
|
+
): Promise<void>;
|
|
37
33
|
}
|
|
@@ -3,16 +3,17 @@ import { UInt64 } from "o1js";
|
|
|
3
3
|
import {
|
|
4
4
|
ProvableSettlementHook,
|
|
5
5
|
SettlementHookInputs,
|
|
6
|
-
} from "../ProvableSettlementHook";
|
|
7
|
-
import {
|
|
6
|
+
} from "../modularity/ProvableSettlementHook";
|
|
7
|
+
import { SettlementSmartContract } from "../contracts/SettlementSmartContract";
|
|
8
8
|
|
|
9
9
|
type NetworkStateSettlementModuleConfig = {
|
|
10
10
|
blocksPerL1Block: UInt64;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
13
14
|
export class NetworkStateSettlementModule extends ProvableSettlementHook<NetworkStateSettlementModuleConfig> {
|
|
14
|
-
public beforeSettlement(
|
|
15
|
-
smartContract:
|
|
15
|
+
public async beforeSettlement(
|
|
16
|
+
smartContract: SettlementSmartContract,
|
|
16
17
|
{
|
|
17
18
|
blockProof,
|
|
18
19
|
fromNetworkState,
|
|
@@ -20,7 +21,7 @@ export class NetworkStateSettlementModule extends ProvableSettlementHook<Network
|
|
|
20
21
|
contractState,
|
|
21
22
|
currentL1Block,
|
|
22
23
|
}: SettlementHookInputs
|
|
23
|
-
)
|
|
24
|
+
) {
|
|
24
25
|
const { lastSettlementL1Block } = contractState;
|
|
25
26
|
|
|
26
27
|
const blocksPerL1Block = this.config.blocksPerL1Block.toConstant();
|
|
@@ -37,3 +38,5 @@ export class NetworkStateSettlementModule extends ProvableSettlementHook<Network
|
|
|
37
38
|
// TODO Check within bounds efficiently
|
|
38
39
|
}
|
|
39
40
|
}
|
|
41
|
+
|
|
42
|
+
/* eslint-enable @typescript-eslint/no-unused-vars */
|
package/src/state/State.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Mixin } from "ts-mixer";
|
|
2
|
-
import { Bool, Field, Provable, type FlexibleProvablePure } from "o1js";
|
|
2
|
+
import { Bool, Field, Provable, type FlexibleProvablePure, Struct } from "o1js";
|
|
3
3
|
import { container } from "tsyringe";
|
|
4
4
|
import { dummyValue } from "@proto-kit/common";
|
|
5
5
|
|
|
@@ -54,6 +54,11 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
54
54
|
super();
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
private stateType = class StateType extends Struct({
|
|
58
|
+
value: this.valueType,
|
|
59
|
+
isSome: Bool,
|
|
60
|
+
}) {};
|
|
61
|
+
|
|
57
62
|
/**
|
|
58
63
|
* Returns the state that is currently the current state tree
|
|
59
64
|
* value: The value-fields, or if not state was found, dummy values
|
|
@@ -61,7 +66,7 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
61
66
|
* (Basically, whether the value-fields are dummy values or actual values
|
|
62
67
|
* @private
|
|
63
68
|
*/
|
|
64
|
-
private getState(): { value: Value; isSome: Bool } {
|
|
69
|
+
private async getState(): Promise<{ value: Value; isSome: Bool }> {
|
|
65
70
|
this.hasStateServiceOrFail();
|
|
66
71
|
this.hasPathOrFail();
|
|
67
72
|
|
|
@@ -71,8 +76,10 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
71
76
|
.resolve(RuntimeMethodExecutionContext)
|
|
72
77
|
.current().result;
|
|
73
78
|
|
|
79
|
+
// TODO Use Stateservice for this
|
|
74
80
|
// First try to find a match inside already created stateTransitions
|
|
75
|
-
|
|
81
|
+
let previousMutatingTransitions: StateTransition<any>[] = [];
|
|
82
|
+
previousMutatingTransitions = stateTransitions.filter((transition) =>
|
|
76
83
|
transition.path.equals(path).and(transition.to.isSome).toBoolean()
|
|
77
84
|
);
|
|
78
85
|
const pmtLength = previousMutatingTransitions.length;
|
|
@@ -88,7 +95,7 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
88
95
|
}
|
|
89
96
|
|
|
90
97
|
// If the value is still undefined, look it up in the stateService
|
|
91
|
-
const fields = stateServiceProvider.stateService.get(path);
|
|
98
|
+
const fields = await stateServiceProvider.stateService.get(path);
|
|
92
99
|
if (fields) {
|
|
93
100
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
94
101
|
value = valueType.fromFields(fields) as Value;
|
|
@@ -106,12 +113,13 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
106
113
|
*
|
|
107
114
|
* @returns Optional value of the current state
|
|
108
115
|
*/
|
|
109
|
-
private witnessFromState() {
|
|
116
|
+
private async witnessFromState() {
|
|
110
117
|
// get the value from storage, or return a dummy value instead
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
// also check if the value exists in the storage or not
|
|
119
|
+
const { value, isSome } = await Provable.witnessAsync(
|
|
120
|
+
this.stateType,
|
|
121
|
+
async () => await this.getState()
|
|
122
|
+
);
|
|
115
123
|
|
|
116
124
|
return Option.from(isSome, value, this.valueType);
|
|
117
125
|
}
|
|
@@ -122,8 +130,8 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
122
130
|
*
|
|
123
131
|
* @returns Option representation of the current state.
|
|
124
132
|
*/
|
|
125
|
-
public get(): Option<Value
|
|
126
|
-
const option = this.witnessFromState();
|
|
133
|
+
public async get(): Promise<Option<Value>> {
|
|
134
|
+
const option = await this.witnessFromState();
|
|
127
135
|
|
|
128
136
|
this.hasPathOrFail();
|
|
129
137
|
|
|
@@ -147,9 +155,9 @@ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
|
|
|
147
155
|
*
|
|
148
156
|
* @param value - Value to be set as the current state
|
|
149
157
|
*/
|
|
150
|
-
public set(value: Value) {
|
|
158
|
+
public async set(value: Value) {
|
|
151
159
|
// link the transition to the current state
|
|
152
|
-
const fromOption = this.witnessFromState();
|
|
160
|
+
const fromOption = await this.witnessFromState();
|
|
153
161
|
const toOption = Option.fromValue(value, this.valueType);
|
|
154
162
|
|
|
155
163
|
this.hasPathOrFail();
|
package/src/state/StateMap.ts
CHANGED
|
@@ -9,7 +9,6 @@ import { State, WithStateServiceProvider, WithPath } from "./State";
|
|
|
9
9
|
/**
|
|
10
10
|
* Map-like wrapper for state
|
|
11
11
|
*/
|
|
12
|
-
// eslint-disable-next-line new-cap
|
|
13
12
|
export class StateMap<KeyType, ValueType> extends Mixin(
|
|
14
13
|
WithPath,
|
|
15
14
|
WithStateServiceProvider
|
|
@@ -46,14 +45,14 @@ export class StateMap<KeyType, ValueType> extends Mixin(
|
|
|
46
45
|
* @param key - Key to obtain the state for
|
|
47
46
|
* @returns Value for the provided key.
|
|
48
47
|
*/
|
|
49
|
-
public get(key: KeyType): Option<ValueType
|
|
48
|
+
public async get(key: KeyType): Promise<Option<ValueType>> {
|
|
50
49
|
const state = State.from(this.valueType);
|
|
51
50
|
this.hasPathOrFail();
|
|
52
51
|
this.hasStateServiceOrFail();
|
|
53
52
|
|
|
54
53
|
state.path = this.getPath(key);
|
|
55
54
|
state.stateServiceProvider = this.stateServiceProvider;
|
|
56
|
-
return state.get();
|
|
55
|
+
return await state.get();
|
|
57
56
|
}
|
|
58
57
|
|
|
59
58
|
/**
|
|
@@ -62,13 +61,13 @@ export class StateMap<KeyType, ValueType> extends Mixin(
|
|
|
62
61
|
* @param key - Key to store the value under
|
|
63
62
|
* @param value - Value to be stored under the given key
|
|
64
63
|
*/
|
|
65
|
-
public set(key: KeyType, value: ValueType): void {
|
|
64
|
+
public async set(key: KeyType, value: ValueType): Promise<void> {
|
|
66
65
|
const state = State.from(this.valueType);
|
|
67
66
|
this.hasPathOrFail();
|
|
68
67
|
this.hasStateServiceOrFail();
|
|
69
68
|
|
|
70
69
|
state.path = Path.fromKey(this.path, this.keyType, key);
|
|
71
70
|
state.stateServiceProvider = this.stateServiceProvider;
|
|
72
|
-
state.set(value);
|
|
71
|
+
return await state.set(value);
|
|
73
72
|
}
|
|
74
73
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Field } from "o1js";
|
|
2
2
|
|
|
3
|
-
export interface
|
|
4
|
-
get: (key: Field) => Field[] | undefined
|
|
5
|
-
set: (key: Field, value: Field[] | undefined) => void
|
|
3
|
+
export interface SimpleAsyncStateService {
|
|
4
|
+
get: (key: Field) => Promise<Field[] | undefined>;
|
|
5
|
+
set: (key: Field, value: Field[] | undefined) => Promise<void>;
|
|
6
6
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { StateService } from "./StateService";
|
|
1
|
+
import { injectable } from "tsyringe";
|
|
4
2
|
import { log } from "@proto-kit/common";
|
|
5
3
|
|
|
4
|
+
import { SimpleAsyncStateService } from "./StateService";
|
|
5
|
+
|
|
6
6
|
const errors = {
|
|
7
7
|
stateServiceNotSet: () =>
|
|
8
8
|
new Error(
|
|
@@ -12,19 +12,18 @@ const errors = {
|
|
|
12
12
|
|
|
13
13
|
@injectable()
|
|
14
14
|
export class StateServiceProvider {
|
|
15
|
-
private readonly stateServiceStack:
|
|
15
|
+
private readonly stateServiceStack: SimpleAsyncStateService[] = [];
|
|
16
16
|
|
|
17
|
-
public get stateService():
|
|
17
|
+
public get stateService(): SimpleAsyncStateService {
|
|
18
18
|
if (this.stateServiceStack.length === 0) {
|
|
19
19
|
throw errors.stateServiceNotSet();
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// Assertion here is ok, because we check that the array is not empty above
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
24
23
|
return this.stateServiceStack.at(-1)!;
|
|
25
24
|
}
|
|
26
25
|
|
|
27
|
-
public setCurrentStateService(service:
|
|
26
|
+
public setCurrentStateService(service: SimpleAsyncStateService) {
|
|
28
27
|
this.stateServiceStack.push(service);
|
|
29
28
|
}
|
|
30
29
|
|