@proto-kit/protocol 0.1.1-develop.1086
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 -0
- package/README.md +45 -0
- package/dist/Constants.d.ts +4 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +3 -0
- package/dist/hooks/AccountStateHook.d.ts +52 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -0
- package/dist/hooks/AccountStateHook.js +47 -0
- package/dist/hooks/BlockHeightHook.d.ts +7 -0
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
- package/dist/hooks/BlockHeightHook.js +15 -0
- 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 +9 -0
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
- package/dist/hooks/NoopBlockHook.js +9 -0
- 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 +6 -0
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
- package/dist/hooks/NoopTransactionHook.js +7 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/model/MethodPublicOutput.d.ts +113 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -0
- package/dist/model/MethodPublicOutput.js +14 -0
- package/dist/model/Option.d.ts +122 -0
- package/dist/model/Option.d.ts.map +1 -0
- package/dist/model/Option.js +110 -0
- package/dist/model/Path.d.ts +31 -0
- package/dist/model/Path.d.ts.map +1 -0
- package/dist/model/Path.js +42 -0
- 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 +135 -0
- package/dist/model/StateTransition.d.ts.map +1 -0
- package/dist/model/StateTransition.js +68 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +172 -0
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
- package/dist/model/StateTransitionProvableBatch.js +85 -0
- package/dist/model/network/NetworkState.d.ts +160 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -0
- package/dist/model/network/NetworkState.js +31 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.js +86 -0
- package/dist/model/transaction/SignedTransaction.d.ts +107 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +33 -0
- package/dist/model/transaction/ValueOption.d.ts +173 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +24 -0
- package/dist/protocol/Protocol.d.ts +43 -0
- package/dist/protocol/Protocol.d.ts.map +1 -0
- package/dist/protocol/Protocol.js +95 -0
- package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
- package/dist/protocol/ProtocolEnvironment.js +1 -0
- package/dist/protocol/ProtocolModule.d.ts +9 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -0
- package/dist/protocol/ProtocolModule.js +12 -0
- package/dist/protocol/ProvableBlockHook.d.ts +8 -0
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +4 -0
- package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +3 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.js +8 -0
- package/dist/prover/block/BlockProvable.d.ts +395 -0
- package/dist/prover/block/BlockProvable.d.ts.map +1 -0
- package/dist/prover/block/BlockProvable.js +45 -0
- package/dist/prover/block/BlockProver.d.ts +92 -0
- package/dist/prover/block/BlockProver.d.ts.map +1 -0
- package/dist/prover/block/BlockProver.js +472 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +20 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +22 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +174 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.js +15 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +51 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.js +188 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +16 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +16 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +7 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +19 -0
- 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/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/DispatchContractProtocolModule.d.ts +12 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +35 -0
- 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/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 +241 -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 +11 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +14 -0
- package/dist/state/State.d.ts +68 -0
- package/dist/state/State.d.ts.map +1 -0
- package/dist/state/State.js +129 -0
- package/dist/state/StateMap.d.ts +37 -0
- package/dist/state/StateMap.d.ts.map +1 -0
- package/dist/state/StateMap.js +55 -0
- package/dist/state/StateService.d.ts +6 -0
- package/dist/state/StateService.d.ts.map +1 -0
- package/dist/state/StateService.js +1 -0
- package/dist/state/StateServiceProvider.d.ts +8 -0
- package/dist/state/StateServiceProvider.d.ts.map +1 -0
- package/dist/state/StateServiceProvider.js +36 -0
- package/dist/state/assert/assert.d.ts +12 -0
- package/dist/state/assert/assert.d.ts.map +1 -0
- package/dist/state/assert/assert.js +30 -0
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts +22 -0
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/ProtocolMethodExecutionContext.js +28 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js +135 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js +5 -0
- package/dist/state/protocol/ProtocolState.d.ts +7 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
- package/dist/state/protocol/ProtocolState.js +39 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +52 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/PrefixedProvableHashList.js +12 -0
- package/dist/utils/ProvableHashList.d.ts +27 -0
- package/dist/utils/ProvableHashList.d.ts.map +1 -0
- package/dist/utils/ProvableHashList.js +43 -0
- 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/utils.d.ts +11 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +44 -0
- package/jest.config.cjs +1 -0
- package/package.json +36 -0
- package/src/Constants.ts +3 -0
- package/src/hooks/AccountStateHook.ts +48 -0
- package/src/hooks/BlockHeightHook.ts +17 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +21 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/NoopTransactionHook.ts +10 -0
- package/src/index.ts +53 -0
- package/src/model/MethodPublicOutput.ts +14 -0
- package/src/model/Option.ts +172 -0
- package/src/model/Path.ts +50 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +88 -0
- package/src/model/StateTransitionProvableBatch.ts +125 -0
- package/src/model/Transaction.ts +31 -0
- package/src/model/network/NetworkState.ts +33 -0
- package/src/model/transaction/RuntimeTransaction.ts +105 -0
- package/src/model/transaction/SignedTransaction.ts +47 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +197 -0
- package/src/protocol/ProtocolEnvironment.ts +10 -0
- package/src/protocol/ProtocolModule.ts +27 -0
- package/src/protocol/ProvableBlockHook.ts +19 -0
- package/src/protocol/ProvableTransactionHook.ts +13 -0
- package/src/protocol/TransitioningProtocolModule.ts +12 -0
- package/src/prover/block/BlockProvable.ts +99 -0
- package/src/prover/block/BlockProver.ts +954 -0
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
- package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
- package/src/prover/statetransition/StateTransitionProvable.ts +44 -0
- package/src/prover/statetransition/StateTransitionProver.ts +371 -0
- package/src/prover/statetransition/StateTransitionWitnessProvider.ts +23 -0
- package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +17 -0
- 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 +344 -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/modularity/ProvableSettlementHook.ts +33 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
- package/src/state/State.ts +175 -0
- package/src/state/StateMap.ts +73 -0
- package/src/state/StateService.ts +6 -0
- package/src/state/StateServiceProvider.ts +37 -0
- package/src/state/assert/assert.ts +35 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
- package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
- package/src/state/protocol/ProtocolState.ts +61 -0
- package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
- package/src/utils/PrefixedProvableHashList.ts +21 -0
- package/src/utils/ProvableHashList.ts +50 -0
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +89 -0
- package/src/utils/utils.ts +75 -0
- package/test/BlockProver.test.ts +211 -0
- package/test/Protocol.test.ts +37 -0
- package/test/State.test.ts +45 -0
- package/test/StateTransition.test.ts +174 -0
- package/test/TestingProtocol.ts +47 -0
- package/test/model/Option.test.ts +72 -0
- package/test/state/assert/assert.test.ts +56 -0
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +27 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Field, Poseidon, ProvablePure } from "o1js";
|
|
2
|
+
import { hashWithPrefix, prefixToField } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { ProvableHashList } from "./ProvableHashList";
|
|
5
|
+
|
|
6
|
+
function salt(prefix: string) {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
8
|
+
return Poseidon.update(
|
|
9
|
+
[Field(0), Field(0), Field(0)],
|
|
10
|
+
[prefixToField(prefix)]
|
|
11
|
+
) as [Field, Field, Field];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const MINA_EVENT_PREFIXES = {
|
|
15
|
+
event: "MinaZkappEvent******",
|
|
16
|
+
events: "MinaZkappEvents*****",
|
|
17
|
+
sequenceEvents: "MinaZkappSeqEvents**",
|
|
18
|
+
} as const;
|
|
19
|
+
|
|
20
|
+
export function emptyActions(): Field {
|
|
21
|
+
return salt("MinaZkappActionsEmpty")[0];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function emptyEvents(): Field {
|
|
25
|
+
return salt("MinaZkappEventsEmpty")[0];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class MinaActions {
|
|
29
|
+
static actionHash(
|
|
30
|
+
action: Field[],
|
|
31
|
+
previousHash: Field = emptyActions()
|
|
32
|
+
): Field {
|
|
33
|
+
const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, action);
|
|
34
|
+
return hashWithPrefix(MINA_EVENT_PREFIXES.sequenceEvents, [
|
|
35
|
+
previousHash,
|
|
36
|
+
actionDataHash,
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class MinaEvents {
|
|
42
|
+
static eventHash(event: Field[], previousHash: Field = emptyEvents()): Field {
|
|
43
|
+
const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, event);
|
|
44
|
+
return hashWithPrefix(MINA_EVENT_PREFIXES.events, [
|
|
45
|
+
previousHash,
|
|
46
|
+
actionDataHash,
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export class MinaPrefixedProvableHashList<
|
|
52
|
+
Value,
|
|
53
|
+
> extends ProvableHashList<Value> {
|
|
54
|
+
public constructor(
|
|
55
|
+
valueType: ProvablePure<Value>,
|
|
56
|
+
public readonly prefix: string,
|
|
57
|
+
internalCommitment: Field = Field(0)
|
|
58
|
+
) {
|
|
59
|
+
super(valueType, internalCommitment);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
protected hash(elements: Field[]): Field {
|
|
63
|
+
const init = salt(this.prefix);
|
|
64
|
+
const digest = Poseidon.update(init, elements);
|
|
65
|
+
return digest[0];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export class MinaActionsHashList extends MinaPrefixedProvableHashList<Field> {
|
|
70
|
+
public constructor(internalCommitment: Field = Field(0)) {
|
|
71
|
+
super(Field, MINA_EVENT_PREFIXES.sequenceEvents, internalCommitment);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Field, ProvablePure, Poseidon } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ProvableHashList } from "./ProvableHashList.js";
|
|
4
|
+
import { stringToField } from "./utils";
|
|
5
|
+
|
|
6
|
+
export class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
|
|
7
|
+
private readonly prefix: Field;
|
|
8
|
+
|
|
9
|
+
public constructor(
|
|
10
|
+
valueType: ProvablePure<Value>,
|
|
11
|
+
prefix: string,
|
|
12
|
+
internalCommitment: Field = Field(0)
|
|
13
|
+
) {
|
|
14
|
+
super(valueType, internalCommitment);
|
|
15
|
+
this.prefix = stringToField(prefix);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected hash(elements: Field[]): Field {
|
|
19
|
+
return Poseidon.hash([this.prefix, ...elements]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Field, Poseidon, Bool, Provable, ProvablePure } from "o1js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Utilities for creating a hash list from a given value type.
|
|
5
|
+
*/
|
|
6
|
+
export abstract class ProvableHashList<Value> {
|
|
7
|
+
public constructor(
|
|
8
|
+
protected readonly valueType: ProvablePure<Value>,
|
|
9
|
+
public commitment: Field = Field(0)
|
|
10
|
+
) {}
|
|
11
|
+
|
|
12
|
+
protected abstract hash(elements: Field[]): Field;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Converts the provided value to Field[] and appends it to
|
|
16
|
+
* the current hashlist.
|
|
17
|
+
*
|
|
18
|
+
* @param value - Value to be appended to the hash list
|
|
19
|
+
* @returns Current hash list.
|
|
20
|
+
*/
|
|
21
|
+
public push(value: Value) {
|
|
22
|
+
this.commitment = this.hash([
|
|
23
|
+
this.commitment,
|
|
24
|
+
...this.valueType.toFields(value),
|
|
25
|
+
]);
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public pushIf(value: Value, condition: Bool) {
|
|
30
|
+
const newCommitment = this.hash([
|
|
31
|
+
this.commitment,
|
|
32
|
+
...this.valueType.toFields(value),
|
|
33
|
+
]);
|
|
34
|
+
this.commitment = Provable.if(condition, newCommitment, this.commitment);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns Traling hash of the current hashlist.
|
|
40
|
+
*/
|
|
41
|
+
public toField() {
|
|
42
|
+
return this.commitment;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
|
|
47
|
+
public hash(elements: Field[]): Field {
|
|
48
|
+
return Poseidon.hash(elements);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Bool, Field, Poseidon, Provable } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ProvableHashList } from "./ProvableHashList";
|
|
4
|
+
|
|
5
|
+
export class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
|
|
6
|
+
public unconstrainedList: Value[] = [];
|
|
7
|
+
|
|
8
|
+
private constrainedLastValue: Value | undefined = undefined;
|
|
9
|
+
|
|
10
|
+
private preimage: Field = this.commitment;
|
|
11
|
+
|
|
12
|
+
public pushAndReduce(
|
|
13
|
+
value: Value,
|
|
14
|
+
reduce: (previous: Value) => [Value, Bool]
|
|
15
|
+
): { popLast: Bool; value: Value } {
|
|
16
|
+
let valueToPush = value;
|
|
17
|
+
let popLast = Bool(false);
|
|
18
|
+
|
|
19
|
+
// Theoretically, we can feed the preimage + last value as a witness
|
|
20
|
+
// for non-zero commitment starts (like used in the BlockProver), because
|
|
21
|
+
// currently it won't reduce across chunks. But this is okay for now I think
|
|
22
|
+
if (this.constrainedLastValue !== undefined) {
|
|
23
|
+
[valueToPush, popLast] = reduce(this.constrainedLastValue);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Provable.asProver(() => {
|
|
27
|
+
if (popLast.toBoolean()) {
|
|
28
|
+
this.unconstrainedList.pop();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const valueAsConstant = this.valueType.fromFields(
|
|
32
|
+
this.valueType.toFields(valueToPush).map((field) => field.toConstant())
|
|
33
|
+
);
|
|
34
|
+
this.unconstrainedList.push(valueAsConstant);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const currentCommitment = this.commitment;
|
|
38
|
+
const noPopCommitment = this.hash([
|
|
39
|
+
currentCommitment,
|
|
40
|
+
...this.valueType.toFields(valueToPush),
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
const popCommitment = this.hash([
|
|
44
|
+
this.preimage,
|
|
45
|
+
...this.valueType.toFields(valueToPush),
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
|
|
49
|
+
|
|
50
|
+
this.constrainedLastValue = valueToPush;
|
|
51
|
+
this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
popLast,
|
|
55
|
+
value: valueToPush,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public pushIf(value: Value, condition: Bool) {
|
|
60
|
+
throw new Error("pushIf is not implemented for ReducedHashList");
|
|
61
|
+
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public hash(elements: Field[]): Field {
|
|
66
|
+
return Poseidon.hash(elements);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Provable } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ProvableOption } from "../model/Option";
|
|
4
|
+
import {
|
|
5
|
+
ProvableStateTransition,
|
|
6
|
+
StateTransition,
|
|
7
|
+
} from "../model/StateTransition";
|
|
8
|
+
|
|
9
|
+
import { ProvableReductionHashList } from "./ProvableReductionHashList";
|
|
10
|
+
|
|
11
|
+
export class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
|
|
12
|
+
public push(value: ProvableStateTransition) {
|
|
13
|
+
this.pushWithMetadata(value);
|
|
14
|
+
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public pushWithMetadata(value: ProvableStateTransition) {
|
|
19
|
+
return this.pushAndReduce(value, (previous: ProvableStateTransition) => {
|
|
20
|
+
const pathsMatch = previous.path.equals(value.path);
|
|
21
|
+
|
|
22
|
+
// Take the previous.from if the paths match, otherwise leave ST as is
|
|
23
|
+
const from = Provable.if(
|
|
24
|
+
pathsMatch,
|
|
25
|
+
ProvableOption,
|
|
26
|
+
previous.from,
|
|
27
|
+
value.from
|
|
28
|
+
);
|
|
29
|
+
// In case we have a layout like
|
|
30
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
31
|
+
// we just take the first and discard the second
|
|
32
|
+
const to = Provable.if(
|
|
33
|
+
value.to.isSome.or(pathsMatch.not()),
|
|
34
|
+
ProvableOption,
|
|
35
|
+
value.to,
|
|
36
|
+
previous.to
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const transition = new ProvableStateTransition({
|
|
40
|
+
path: value.path,
|
|
41
|
+
from: new ProvableOption(from),
|
|
42
|
+
to: new ProvableOption(to),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Assert that connection is correct
|
|
46
|
+
previous.to.value
|
|
47
|
+
.equals(value.from.value)
|
|
48
|
+
.or(
|
|
49
|
+
previous.to.isSome
|
|
50
|
+
.not()
|
|
51
|
+
.and(previous.from.value.equals(value.from.value))
|
|
52
|
+
)
|
|
53
|
+
.or(pathsMatch.not())
|
|
54
|
+
.assertTrue();
|
|
55
|
+
|
|
56
|
+
return [transition, pathsMatch];
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function reduceStateTransitions(
|
|
62
|
+
transitions: StateTransition<unknown>[]
|
|
63
|
+
): StateTransition<unknown>[] {
|
|
64
|
+
const reduced: StateTransition<unknown>[] = [];
|
|
65
|
+
|
|
66
|
+
transitions.forEach((st) => {
|
|
67
|
+
if (reduced.length === 0) {
|
|
68
|
+
reduced.push(st);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const last = reduced.at(-1)!;
|
|
73
|
+
if (last.path.equals(st.path).toBoolean()) {
|
|
74
|
+
if (st.toValue.isSome.toBoolean()) {
|
|
75
|
+
reduced.pop();
|
|
76
|
+
reduced.push(
|
|
77
|
+
new StateTransition<unknown>(st.path, last.fromValue, st.toValue)
|
|
78
|
+
);
|
|
79
|
+
} else {
|
|
80
|
+
// Do nothing, because we discard that ST
|
|
81
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
82
|
+
// cancel the 2nd
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
reduced.push(st);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return reduced;
|
|
89
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Field, Poseidon, Provable } from "o1js";
|
|
2
|
+
import floor from "lodash/floor";
|
|
3
|
+
|
|
4
|
+
export type ReturnType<FunctionType extends Function> = FunctionType extends (
|
|
5
|
+
...args: any[]
|
|
6
|
+
) => infer Return
|
|
7
|
+
? Return
|
|
8
|
+
: any;
|
|
9
|
+
|
|
10
|
+
export type Subclass<Class extends new (...args: any) => any> = (new (
|
|
11
|
+
...args: any
|
|
12
|
+
) => InstanceType<Class>) & {
|
|
13
|
+
[Key in keyof Class]: Class[Key];
|
|
14
|
+
} & { prototype: InstanceType<Class> };
|
|
15
|
+
|
|
16
|
+
export function notInCircuit(): MethodDecorator {
|
|
17
|
+
return function ReplacedFunction(
|
|
18
|
+
target: any,
|
|
19
|
+
propertyKey: string | symbol,
|
|
20
|
+
descriptor: PropertyDescriptor
|
|
21
|
+
) {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
23
|
+
const childFunction = descriptor.value;
|
|
24
|
+
descriptor.value = function value(this: any, ...args: any[]) {
|
|
25
|
+
if (Provable.inCheckedComputation() || Provable.inProver()) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return childFunction.apply(this, args);
|
|
31
|
+
};
|
|
32
|
+
return descriptor;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function stringToField(value: string) {
|
|
37
|
+
const fieldSize = Field.sizeInBytes - 1;
|
|
38
|
+
|
|
39
|
+
// Encode string as byte[]
|
|
40
|
+
const encoder = new TextEncoder();
|
|
41
|
+
const stringBytes = Array.from(encoder.encode(value));
|
|
42
|
+
|
|
43
|
+
// Add padding in case the string is not a multiple of Field.sizeInBytes
|
|
44
|
+
const padding = Array.from<number>({
|
|
45
|
+
length: fieldSize - (stringBytes.length % fieldSize),
|
|
46
|
+
}).fill(0);
|
|
47
|
+
const data = stringBytes.concat(padding).reverse();
|
|
48
|
+
|
|
49
|
+
// Hash the result Field[] to reduce it to
|
|
50
|
+
const chunks = data.reduce<number[][]>(
|
|
51
|
+
(a, b, index) => {
|
|
52
|
+
const arrayIndex = floor(index / fieldSize);
|
|
53
|
+
a[arrayIndex].push(b);
|
|
54
|
+
return a;
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
Array.from<number[]>({ length: floor(data.length / fieldSize) }).map(
|
|
58
|
+
() => []
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
const fields = chunks.map((x) =>
|
|
62
|
+
// We have to add a zero at the highest byte here, because a Field is
|
|
63
|
+
// a bit smaller than 2^256
|
|
64
|
+
Field.fromBytes(x.concat([0]))
|
|
65
|
+
);
|
|
66
|
+
return Poseidon.hash(fields);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function singleFieldToString(value: Field | bigint): string {
|
|
70
|
+
let fieldValue = value;
|
|
71
|
+
if (typeof value === "bigint") {
|
|
72
|
+
fieldValue = Field(value);
|
|
73
|
+
}
|
|
74
|
+
return fieldValue.toString();
|
|
75
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import {
|
|
3
|
+
AreProofsEnabled,
|
|
4
|
+
PlainZkProgram,
|
|
5
|
+
ZkProgrammable,
|
|
6
|
+
} from "@proto-kit/common";
|
|
7
|
+
import { Bool, Field, Proof, UInt64, ZkProgram } from "o1js";
|
|
8
|
+
import "reflect-metadata";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
MethodPublicOutput,
|
|
12
|
+
NetworkState,
|
|
13
|
+
SignedTransaction,
|
|
14
|
+
StateTransitionProverPublicInput,
|
|
15
|
+
StateTransitionProverPublicOutput,
|
|
16
|
+
} from "../src";
|
|
17
|
+
|
|
18
|
+
import { createAndInitTestingProtocol } from "./TestingProtocol";
|
|
19
|
+
|
|
20
|
+
type BlockProverProofPair = [
|
|
21
|
+
Proof<void, MethodPublicOutput>,
|
|
22
|
+
Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>,
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
class MockAppChain implements AreProofsEnabled {
|
|
26
|
+
public areProofsEnabled: boolean = false;
|
|
27
|
+
|
|
28
|
+
setProofsEnabled(areProofsEnabled: boolean): void {
|
|
29
|
+
this.areProofsEnabled = areProofsEnabled;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class RuntimeZkProgrammable extends ZkProgrammable<
|
|
34
|
+
undefined,
|
|
35
|
+
MethodPublicOutput
|
|
36
|
+
> {
|
|
37
|
+
get appChain(): AreProofsEnabled | undefined {
|
|
38
|
+
return new MockAppChain();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
zkProgramFactory(): PlainZkProgram<undefined, MethodPublicOutput>[] {
|
|
42
|
+
const program = ZkProgram({
|
|
43
|
+
name: "BlockProverTestProgram",
|
|
44
|
+
publicOutput: MethodPublicOutput,
|
|
45
|
+
methods: {},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return [
|
|
49
|
+
{
|
|
50
|
+
compile: program.compile.bind(program),
|
|
51
|
+
verify: program.verify.bind(program),
|
|
52
|
+
analyzeMethods: program.analyzeMethods.bind(program),
|
|
53
|
+
methods: {},
|
|
54
|
+
Proof: ZkProgram.Proof(program),
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
describe("blockProver", () => {
|
|
61
|
+
const networkState = new NetworkState({
|
|
62
|
+
block: {
|
|
63
|
+
height: UInt64.zero,
|
|
64
|
+
},
|
|
65
|
+
previous: {
|
|
66
|
+
rootHash: Field(0),
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const protocol = createAndInitTestingProtocol();
|
|
71
|
+
|
|
72
|
+
function generateTestProofs(
|
|
73
|
+
fromStateRoot: Field,
|
|
74
|
+
toStateRoot: Field,
|
|
75
|
+
toProtocolRoot: Field,
|
|
76
|
+
protocolHash: Field,
|
|
77
|
+
tx: SignedTransaction,
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
79
|
+
networkState: NetworkState
|
|
80
|
+
): BlockProverProofPair {
|
|
81
|
+
const transactionHash = tx.transaction.hash();
|
|
82
|
+
const sthash = Field(123);
|
|
83
|
+
|
|
84
|
+
const appProof = new Proof<undefined, MethodPublicOutput>({
|
|
85
|
+
publicInput: undefined,
|
|
86
|
+
publicOutput: new MethodPublicOutput({
|
|
87
|
+
transactionHash,
|
|
88
|
+
stateTransitionsHash: sthash,
|
|
89
|
+
status: Bool(true),
|
|
90
|
+
networkStateHash: networkState.hash(),
|
|
91
|
+
isMessage: Bool(false),
|
|
92
|
+
eventsHash: Field(0),
|
|
93
|
+
}),
|
|
94
|
+
|
|
95
|
+
proof: "",
|
|
96
|
+
maxProofsVerified: 2,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const stProof = new Proof<
|
|
100
|
+
StateTransitionProverPublicInput,
|
|
101
|
+
StateTransitionProverPublicOutput
|
|
102
|
+
>({
|
|
103
|
+
publicInput: new StateTransitionProverPublicInput({
|
|
104
|
+
stateTransitionsHash: Field(0),
|
|
105
|
+
protocolTransitionsHash: Field(0),
|
|
106
|
+
stateRoot: fromStateRoot,
|
|
107
|
+
protocolStateRoot: fromStateRoot,
|
|
108
|
+
}),
|
|
109
|
+
publicOutput: new StateTransitionProverPublicOutput({
|
|
110
|
+
stateTransitionsHash: sthash,
|
|
111
|
+
protocolTransitionsHash: protocolHash,
|
|
112
|
+
stateRoot: toStateRoot,
|
|
113
|
+
protocolStateRoot: toProtocolRoot,
|
|
114
|
+
}),
|
|
115
|
+
|
|
116
|
+
proof: "",
|
|
117
|
+
maxProofsVerified: 2,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return [appProof, stProof];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
it("dummy", () => {
|
|
124
|
+
expect(1).toBe(1);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// TODO
|
|
128
|
+
// it("previously applied transaction should also pass with derived publicInputs", () => {
|
|
129
|
+
// expect.assertions(2);
|
|
130
|
+
//
|
|
131
|
+
// const priv = PrivateKey.random();
|
|
132
|
+
//
|
|
133
|
+
// const tx = new UnsignedTransaction({
|
|
134
|
+
// methodId: Field(0),
|
|
135
|
+
// args: [Field(0)],
|
|
136
|
+
// nonce: UInt64.zero,
|
|
137
|
+
// sender: priv.toPublicKey(),
|
|
138
|
+
// })
|
|
139
|
+
// .sign(priv)
|
|
140
|
+
// .toProtocolTransaction();
|
|
141
|
+
//
|
|
142
|
+
// const executionData = {
|
|
143
|
+
// networkState,
|
|
144
|
+
// transaction: tx,
|
|
145
|
+
// };
|
|
146
|
+
//
|
|
147
|
+
// // const asmodule = protocol.resolve()
|
|
148
|
+
//
|
|
149
|
+
// protocol.dependencyContainer
|
|
150
|
+
// .resolveAll<ProvableBlockHook<unknown>>("ProvableBlockHook")
|
|
151
|
+
// .forEach((module) => {
|
|
152
|
+
// module.beforeBlock(executionData);
|
|
153
|
+
// });
|
|
154
|
+
//
|
|
155
|
+
// const hashList = new DefaultProvableHashList(ProvableStateTransition);
|
|
156
|
+
//
|
|
157
|
+
// container
|
|
158
|
+
// .resolve(ProtocolMethodExecutionContext)
|
|
159
|
+
// .current()
|
|
160
|
+
// .result.stateTransitions.map((x) => x.toProvable())
|
|
161
|
+
// .forEach((st) => {
|
|
162
|
+
// hashList.push(st);
|
|
163
|
+
// });
|
|
164
|
+
//
|
|
165
|
+
// const blockProver = protocol.resolve("BlockProver");
|
|
166
|
+
//
|
|
167
|
+
// const fromState = Field(1);
|
|
168
|
+
// const toState = Field(2);
|
|
169
|
+
//
|
|
170
|
+
// const [appProof, stProof] = generateTestProofs(
|
|
171
|
+
// fromState,
|
|
172
|
+
// toState,
|
|
173
|
+
// hashList.commitment,
|
|
174
|
+
// tx,
|
|
175
|
+
// networkState
|
|
176
|
+
// );
|
|
177
|
+
//
|
|
178
|
+
// const fromProverState: BlockProverState = {
|
|
179
|
+
// stateRoot: fromState,
|
|
180
|
+
// transactionsHash: Field(0),
|
|
181
|
+
// networkStateHash: networkState.hash(),
|
|
182
|
+
// };
|
|
183
|
+
//
|
|
184
|
+
// const toProverState = blockProver.applyTransaction(
|
|
185
|
+
// fromProverState,
|
|
186
|
+
// stProof,
|
|
187
|
+
// appProof,
|
|
188
|
+
// executionData
|
|
189
|
+
// );
|
|
190
|
+
//
|
|
191
|
+
// const publicInput = new BlockProverPublicInput({
|
|
192
|
+
// stateRoot: fromProverState.stateRoot,
|
|
193
|
+
// transactionsHash: fromProverState.transactionsHash,
|
|
194
|
+
// networkStateHash: networkState.hash(),
|
|
195
|
+
// });
|
|
196
|
+
//
|
|
197
|
+
// const publicOutput = blockProver.proveTransaction(
|
|
198
|
+
// publicInput,
|
|
199
|
+
// stProof,
|
|
200
|
+
// appProof,
|
|
201
|
+
// { networkState, transaction: tx }
|
|
202
|
+
// );
|
|
203
|
+
//
|
|
204
|
+
// expect(publicOutput.stateRoot).toStrictEqual(toProverState.stateRoot);
|
|
205
|
+
// expect(publicOutput.transactionsHash).toStrictEqual(
|
|
206
|
+
// toProverState.transactionsHash
|
|
207
|
+
// );
|
|
208
|
+
// });
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
/* eslint-enable */
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { beforeEach } from "@jest/globals";
|
|
3
|
+
|
|
4
|
+
import { BlockProver } from "../src/prover/block/BlockProver";
|
|
5
|
+
import { StateTransitionProver } from "../src/prover/statetransition/StateTransitionProver";
|
|
6
|
+
import { ProvableTransactionHook } from "../src";
|
|
7
|
+
|
|
8
|
+
import { createAndInitTestingProtocol } from "./TestingProtocol";
|
|
9
|
+
|
|
10
|
+
describe("protocol", () => {
|
|
11
|
+
beforeEach(() => {});
|
|
12
|
+
|
|
13
|
+
it("should resolve all provers correctly", async () => {
|
|
14
|
+
expect.assertions(2);
|
|
15
|
+
|
|
16
|
+
const protocol = createAndInitTestingProtocol();
|
|
17
|
+
|
|
18
|
+
expect(protocol.blockProver instanceof BlockProver).toBe(true);
|
|
19
|
+
expect(
|
|
20
|
+
protocol.stateTransitionProver instanceof StateTransitionProver
|
|
21
|
+
).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("should initialize hooks correctly", () => {
|
|
25
|
+
expect.assertions(2);
|
|
26
|
+
|
|
27
|
+
const protocol = createAndInitTestingProtocol();
|
|
28
|
+
|
|
29
|
+
const hooks =
|
|
30
|
+
protocol.dependencyContainer.resolveAll<ProvableTransactionHook>(
|
|
31
|
+
"ProvableTransactionHook"
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
expect(hooks).toHaveLength(1);
|
|
35
|
+
expect(hooks[0].name).toBe("AccountState");
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { noop } from "@proto-kit/common";
|
|
3
|
+
import { Bool, Field, UInt64 } from "o1js";
|
|
4
|
+
import { container } from "tsyringe";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
NetworkState,
|
|
8
|
+
RuntimeMethodExecutionContext,
|
|
9
|
+
RuntimeTransaction,
|
|
10
|
+
State,
|
|
11
|
+
SimpleAsyncStateService,
|
|
12
|
+
StateServiceProvider,
|
|
13
|
+
} from "../src";
|
|
14
|
+
|
|
15
|
+
describe("state", () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
18
|
+
|
|
19
|
+
executionContext.setup({
|
|
20
|
+
transaction: undefined as unknown as RuntimeTransaction,
|
|
21
|
+
networkState: undefined as unknown as NetworkState,
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should decode state correctly", async () => {
|
|
26
|
+
expect.assertions(2);
|
|
27
|
+
|
|
28
|
+
const state = State.from<UInt64>(UInt64);
|
|
29
|
+
const stateService: SimpleAsyncStateService = {
|
|
30
|
+
get: async () => [Field(123)],
|
|
31
|
+
|
|
32
|
+
set: async () => {
|
|
33
|
+
noop();
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
state.stateServiceProvider = new StateServiceProvider();
|
|
37
|
+
state.stateServiceProvider.setCurrentStateService(stateService);
|
|
38
|
+
state.path = Field(1);
|
|
39
|
+
|
|
40
|
+
const retrieved = await state.get();
|
|
41
|
+
|
|
42
|
+
expect(retrieved.isSome).toStrictEqual(Bool(true));
|
|
43
|
+
expect(retrieved.value).toStrictEqual(UInt64.from(123));
|
|
44
|
+
});
|
|
45
|
+
});
|