@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,50 @@
|
|
|
1
|
+
import { Bool, Poseidon, Provable } from "o1js";
|
|
2
|
+
import { ProvableHashList } from "./ProvableHashList";
|
|
3
|
+
export class ProvableReductionHashList extends ProvableHashList {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.unconstrainedList = [];
|
|
7
|
+
this.constrainedLastValue = undefined;
|
|
8
|
+
this.preimage = this.commitment;
|
|
9
|
+
}
|
|
10
|
+
pushAndReduce(value, reduce) {
|
|
11
|
+
let valueToPush = value;
|
|
12
|
+
let popLast = Bool(false);
|
|
13
|
+
// Theoretically, we can feed the preimage + last value as a witness
|
|
14
|
+
// for non-zero commitment starts (like used in the BlockProver), because
|
|
15
|
+
// currently it won't reduce across chunks. But this is okay for now I think
|
|
16
|
+
if (this.constrainedLastValue !== undefined) {
|
|
17
|
+
[valueToPush, popLast] = reduce(this.constrainedLastValue);
|
|
18
|
+
}
|
|
19
|
+
Provable.asProver(() => {
|
|
20
|
+
if (popLast.toBoolean()) {
|
|
21
|
+
this.unconstrainedList.pop();
|
|
22
|
+
}
|
|
23
|
+
const valueAsConstant = this.valueType.fromFields(this.valueType.toFields(valueToPush).map((field) => field.toConstant()));
|
|
24
|
+
this.unconstrainedList.push(valueAsConstant);
|
|
25
|
+
});
|
|
26
|
+
const currentCommitment = this.commitment;
|
|
27
|
+
const noPopCommitment = this.hash([
|
|
28
|
+
currentCommitment,
|
|
29
|
+
...this.valueType.toFields(valueToPush),
|
|
30
|
+
]);
|
|
31
|
+
const popCommitment = this.hash([
|
|
32
|
+
this.preimage,
|
|
33
|
+
...this.valueType.toFields(valueToPush),
|
|
34
|
+
]);
|
|
35
|
+
this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
|
|
36
|
+
this.constrainedLastValue = valueToPush;
|
|
37
|
+
this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
|
|
38
|
+
return {
|
|
39
|
+
popLast,
|
|
40
|
+
value: valueToPush,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
pushIf(value, condition) {
|
|
44
|
+
throw new Error("pushIf is not implemented for ReducedHashList");
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
hash(elements) {
|
|
48
|
+
return Poseidon.hash(elements);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ProvableStateTransition, StateTransition } from "../model/StateTransition";
|
|
2
|
+
import { ProvableReductionHashList } from "./ProvableReductionHashList";
|
|
3
|
+
export declare class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
|
|
4
|
+
push(value: ProvableStateTransition): this;
|
|
5
|
+
pushWithMetadata(value: ProvableStateTransition): {
|
|
6
|
+
popLast: import("o1js/dist/node/lib/provable/bool").Bool;
|
|
7
|
+
value: ProvableStateTransition;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function reduceStateTransitions(transitions: StateTransition<unknown>[]): StateTransition<unknown>[];
|
|
11
|
+
//# sourceMappingURL=StateTransitionReductionList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateTransitionReductionList.d.ts","sourceRoot":"","sources":["../../src/utils/StateTransitionReductionList.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,uBAAuB,EACvB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,qBAAa,4BAA6B,SAAQ,yBAAyB,CAAC,uBAAuB,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,uBAAuB;IAMnC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB;;;;CAyCvD;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GACtC,eAAe,CAAC,OAAO,CAAC,EAAE,CA0B5B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Provable } from "o1js";
|
|
2
|
+
import { ProvableOption } from "../model/Option";
|
|
3
|
+
import { ProvableStateTransition, StateTransition, } from "../model/StateTransition";
|
|
4
|
+
import { ProvableReductionHashList } from "./ProvableReductionHashList";
|
|
5
|
+
export class StateTransitionReductionList extends ProvableReductionHashList {
|
|
6
|
+
push(value) {
|
|
7
|
+
this.pushWithMetadata(value);
|
|
8
|
+
return this;
|
|
9
|
+
}
|
|
10
|
+
pushWithMetadata(value) {
|
|
11
|
+
return this.pushAndReduce(value, (previous) => {
|
|
12
|
+
const pathsMatch = previous.path.equals(value.path);
|
|
13
|
+
// Take the previous.from if the paths match, otherwise leave ST as is
|
|
14
|
+
const from = Provable.if(pathsMatch, ProvableOption, previous.from, value.from);
|
|
15
|
+
// In case we have a layout like
|
|
16
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
17
|
+
// we just take the first and discard the second
|
|
18
|
+
const to = Provable.if(value.to.isSome.or(pathsMatch.not()), ProvableOption, value.to, previous.to);
|
|
19
|
+
const transition = new ProvableStateTransition({
|
|
20
|
+
path: value.path,
|
|
21
|
+
from: new ProvableOption(from),
|
|
22
|
+
to: new ProvableOption(to),
|
|
23
|
+
});
|
|
24
|
+
// Assert that connection is correct
|
|
25
|
+
previous.to.value
|
|
26
|
+
.equals(value.from.value)
|
|
27
|
+
.or(previous.to.isSome
|
|
28
|
+
.not()
|
|
29
|
+
.and(previous.from.value.equals(value.from.value)))
|
|
30
|
+
.or(pathsMatch.not())
|
|
31
|
+
.assertTrue();
|
|
32
|
+
return [transition, pathsMatch];
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function reduceStateTransitions(transitions) {
|
|
37
|
+
const reduced = [];
|
|
38
|
+
transitions.forEach((st) => {
|
|
39
|
+
if (reduced.length === 0) {
|
|
40
|
+
reduced.push(st);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const last = reduced.at(-1);
|
|
44
|
+
if (last.path.equals(st.path).toBoolean()) {
|
|
45
|
+
if (st.toValue.isSome.toBoolean()) {
|
|
46
|
+
reduced.pop();
|
|
47
|
+
reduced.push(new StateTransition(st.path, last.fromValue, st.toValue));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Do nothing, because we discard that ST
|
|
51
|
+
// { from: 5, to: 10 }, { from: 10, to: none }
|
|
52
|
+
// cancel the 2nd
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
reduced.push(st);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return reduced;
|
|
60
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Field } from "o1js";
|
|
2
|
+
export type ReturnType<FunctionType extends Function> = FunctionType extends (...args: any[]) => infer Return ? Return : any;
|
|
3
|
+
export type Subclass<Class extends new (...args: any) => any> = (new (...args: any) => InstanceType<Class>) & {
|
|
4
|
+
[Key in keyof Class]: Class[Key];
|
|
5
|
+
} & {
|
|
6
|
+
prototype: InstanceType<Class>;
|
|
7
|
+
};
|
|
8
|
+
export declare function notInCircuit(): MethodDecorator;
|
|
9
|
+
export declare function stringToField(value: string): import("o1js/dist/node/lib/provable/field").Field;
|
|
10
|
+
export declare function singleFieldToString(value: Field | bigint): string;
|
|
11
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,MAAM,CAAC;AAGjD,MAAM,MAAM,UAAU,CAAC,YAAY,SAAS,QAAQ,IAAI,YAAY,SAAS,CAC3E,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,MAAM,GACb,MAAM,GACN,GAAG,CAAC;AAER,MAAM,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAC/D,GAAG,IAAI,EAAE,GAAG,KACT,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG;KACzB,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;CACjC,GAAG;IAAE,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAEvC,wBAAgB,YAAY,IAAI,eAAe,CAkB9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qDA+B1C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAMjE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Field, Poseidon, Provable } from "o1js";
|
|
2
|
+
import floor from "lodash/floor";
|
|
3
|
+
export function notInCircuit() {
|
|
4
|
+
return function ReplacedFunction(target, propertyKey, descriptor) {
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
6
|
+
const childFunction = descriptor.value;
|
|
7
|
+
descriptor.value = function value(...args) {
|
|
8
|
+
if (Provable.inCheckedComputation() || Provable.inProver()) {
|
|
9
|
+
throw new Error(`Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`);
|
|
10
|
+
}
|
|
11
|
+
return childFunction.apply(this, args);
|
|
12
|
+
};
|
|
13
|
+
return descriptor;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function stringToField(value) {
|
|
17
|
+
const fieldSize = Field.sizeInBytes - 1;
|
|
18
|
+
// Encode string as byte[]
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
const stringBytes = Array.from(encoder.encode(value));
|
|
21
|
+
// Add padding in case the string is not a multiple of Field.sizeInBytes
|
|
22
|
+
const padding = Array.from({
|
|
23
|
+
length: fieldSize - (stringBytes.length % fieldSize),
|
|
24
|
+
}).fill(0);
|
|
25
|
+
const data = stringBytes.concat(padding).reverse();
|
|
26
|
+
// Hash the result Field[] to reduce it to
|
|
27
|
+
const chunks = data.reduce((a, b, index) => {
|
|
28
|
+
const arrayIndex = floor(index / fieldSize);
|
|
29
|
+
a[arrayIndex].push(b);
|
|
30
|
+
return a;
|
|
31
|
+
}, Array.from({ length: floor(data.length / fieldSize) }).map(() => []));
|
|
32
|
+
const fields = chunks.map((x) =>
|
|
33
|
+
// We have to add a zero at the highest byte here, because a Field is
|
|
34
|
+
// a bit smaller than 2^256
|
|
35
|
+
Field.fromBytes(x.concat([0])));
|
|
36
|
+
return Poseidon.hash(fields);
|
|
37
|
+
}
|
|
38
|
+
export function singleFieldToString(value) {
|
|
39
|
+
let fieldValue = value;
|
|
40
|
+
if (typeof value === "bigint") {
|
|
41
|
+
fieldValue = Field(value);
|
|
42
|
+
}
|
|
43
|
+
return fieldValue.toString();
|
|
44
|
+
}
|
package/jest.config.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require("../../jest.config.cjs");
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@proto-kit/protocol",
|
|
3
|
+
"license": "MIT",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"version": "0.1.1-develop.1086+eeb4563a",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc -p tsconfig.json",
|
|
9
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
10
|
+
"lint": "eslint ./src ./test",
|
|
11
|
+
"test:file": "node --experimental-vm-modules --experimental-wasm-modules --experimental-wasm-threads ../../node_modules/jest/bin/jest.js",
|
|
12
|
+
"test": "npm run test:file -- ./test/**",
|
|
13
|
+
"test:watch": "npm run test:file -- ./test/** --watch"
|
|
14
|
+
},
|
|
15
|
+
"main": "dist/index.js",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"lodash": "^4.17.21",
|
|
21
|
+
"loglevel": "^1.8.1",
|
|
22
|
+
"reflect-metadata": "^0.1.13",
|
|
23
|
+
"ts-mixer": "^6.0.3"
|
|
24
|
+
},
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"@proto-kit/common": "*",
|
|
27
|
+
"o1js": "^1.1.0",
|
|
28
|
+
"ts-pattern": "^4.3.0",
|
|
29
|
+
"tsyringe": "^4.7.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@jest/globals": "^29.5.0",
|
|
33
|
+
"@types/lodash": "^4.14.194"
|
|
34
|
+
},
|
|
35
|
+
"gitHead": "eeb4563a685b29525358ec7404fa9f0251d258d4"
|
|
36
|
+
}
|
package/src/Constants.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { injectable } from "tsyringe";
|
|
3
|
+
|
|
4
|
+
import { BlockProverExecutionData } from "../prover/block/BlockProvable";
|
|
5
|
+
import { StateMap } from "../state/StateMap";
|
|
6
|
+
import { protocolState } from "../state/protocol/ProtocolState";
|
|
7
|
+
import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
|
|
8
|
+
import { assert } from "../state/assert/assert";
|
|
9
|
+
|
|
10
|
+
export class AccountState extends Struct({
|
|
11
|
+
nonce: UInt64,
|
|
12
|
+
}) {}
|
|
13
|
+
|
|
14
|
+
@injectable()
|
|
15
|
+
export class AccountStateHook extends ProvableTransactionHook {
|
|
16
|
+
@protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
|
|
17
|
+
PublicKey,
|
|
18
|
+
AccountState
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
public async onTransaction({ transaction }: BlockProverExecutionData) {
|
|
22
|
+
const sender = transaction.sender.value;
|
|
23
|
+
|
|
24
|
+
const aso = await this.accountState.get(sender);
|
|
25
|
+
|
|
26
|
+
const accountState = aso.orElse(new AccountState({ nonce: UInt64.zero }));
|
|
27
|
+
|
|
28
|
+
const currentNonce = accountState.nonce;
|
|
29
|
+
|
|
30
|
+
// Either the nonce matches or the tx is a message, in which case we don't care
|
|
31
|
+
assert(
|
|
32
|
+
currentNonce
|
|
33
|
+
.equals(transaction.nonce.value)
|
|
34
|
+
.or(transaction.sender.isSome.not()),
|
|
35
|
+
() =>
|
|
36
|
+
`Nonce not matching: tx sent ${transaction.nonce.value.toString()}, onchain value is ${currentNonce.toString()}`
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// Optimized version of transaction.sender.isSome ? currentNonce.add(1) : Field(0)
|
|
40
|
+
// Bcs Bool(true).toField() == 1
|
|
41
|
+
// TODO Think about if we want to rangecheck this. If not, we should store it as Field
|
|
42
|
+
const newNonce = UInt64.Unsafe.fromField(
|
|
43
|
+
currentNonce.value.add(1).mul(transaction.sender.isSome.toField())
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
await this.accountState.set(sender, new AccountState({ nonce: newNonce }));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
2
|
+
import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
|
|
3
|
+
|
|
4
|
+
export class BlockHeightHook extends ProvableBlockHook<Record<string, never>> {
|
|
5
|
+
public async afterBlock(networkState: NetworkState): Promise<NetworkState> {
|
|
6
|
+
return new NetworkState({
|
|
7
|
+
block: {
|
|
8
|
+
height: networkState.block.height.add(1),
|
|
9
|
+
},
|
|
10
|
+
previous: networkState.previous,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public async beforeBlock(networkState: NetworkState): Promise<NetworkState> {
|
|
15
|
+
return networkState;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
|
|
2
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
3
|
+
import { BlockProverState } from "../prover/block/BlockProver";
|
|
4
|
+
|
|
5
|
+
export class LastStateRootBlockHook extends ProvableBlockHook<
|
|
6
|
+
Record<string, never>
|
|
7
|
+
> {
|
|
8
|
+
public async afterBlock(
|
|
9
|
+
networkState: NetworkState,
|
|
10
|
+
state: BlockProverState
|
|
11
|
+
): Promise<NetworkState> {
|
|
12
|
+
return new NetworkState({
|
|
13
|
+
block: networkState.block,
|
|
14
|
+
previous: {
|
|
15
|
+
rootHash: state.stateRoot,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async beforeBlock(
|
|
21
|
+
networkState: NetworkState,
|
|
22
|
+
state: BlockProverState
|
|
23
|
+
): Promise<NetworkState> {
|
|
24
|
+
return networkState;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NoConfig } from "@proto-kit/common";
|
|
2
|
+
|
|
3
|
+
import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
|
|
4
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
5
|
+
import { BlockProverState } from "../prover/block/BlockProver";
|
|
6
|
+
|
|
7
|
+
export class NoopBlockHook extends ProvableBlockHook<NoConfig> {
|
|
8
|
+
public async afterBlock(
|
|
9
|
+
networkState: NetworkState,
|
|
10
|
+
state: BlockProverState
|
|
11
|
+
): Promise<NetworkState> {
|
|
12
|
+
return networkState;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public async beforeBlock(
|
|
16
|
+
networkState: NetworkState,
|
|
17
|
+
state: BlockProverState
|
|
18
|
+
): Promise<NetworkState> {
|
|
19
|
+
return networkState;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { injectable } from "tsyringe";
|
|
2
|
+
import { noop } from "@proto-kit/common";
|
|
3
|
+
import { SmartContract } from "o1js";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
ProvableSettlementHook,
|
|
7
|
+
SettlementHookInputs,
|
|
8
|
+
} from "../settlement/modularity/ProvableSettlementHook";
|
|
9
|
+
|
|
10
|
+
@injectable()
|
|
11
|
+
export class NoopSettlementHook extends ProvableSettlementHook<
|
|
12
|
+
Record<string, never>
|
|
13
|
+
> {
|
|
14
|
+
public async beforeSettlement(
|
|
15
|
+
contract: SmartContract,
|
|
16
|
+
state: SettlementHookInputs
|
|
17
|
+
) {
|
|
18
|
+
noop();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { noop } from "@proto-kit/common";
|
|
2
|
+
|
|
3
|
+
import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
|
|
4
|
+
import { BlockProverExecutionData } from "../prover/block/BlockProvable";
|
|
5
|
+
|
|
6
|
+
export class NoopTransactionHook extends ProvableTransactionHook {
|
|
7
|
+
public async onTransaction(executionData: BlockProverExecutionData) {
|
|
8
|
+
noop();
|
|
9
|
+
}
|
|
10
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export * from "./hooks/AccountStateHook";
|
|
2
|
+
export * from "./hooks/BlockHeightHook";
|
|
3
|
+
export * from "./hooks/LastStateRootBlockHook";
|
|
4
|
+
export * from "./model/StateTransition";
|
|
5
|
+
export * from "./model/StateTransitionProvableBatch";
|
|
6
|
+
export * from "./model/Option";
|
|
7
|
+
export * from "./model/Path";
|
|
8
|
+
export * from "./model/network/NetworkState";
|
|
9
|
+
export * from "./model/transaction/SignedTransaction";
|
|
10
|
+
export * from "./model/transaction/RuntimeTransaction";
|
|
11
|
+
export * from "./model/transaction/ValueOption";
|
|
12
|
+
export * from "./model/MethodPublicOutput";
|
|
13
|
+
export * from "./model/RuntimeLike";
|
|
14
|
+
export * from "./utils/ProvableHashList";
|
|
15
|
+
export * from "./utils/PrefixedProvableHashList";
|
|
16
|
+
export * from "./utils/MinaPrefixedProvableHashList";
|
|
17
|
+
export * from "./utils/ProvableReductionHashList";
|
|
18
|
+
export * from "./utils/StateTransitionReductionList";
|
|
19
|
+
export * from "./utils/utils";
|
|
20
|
+
export * from "./prover/block/BlockProver";
|
|
21
|
+
export * from "./prover/block/BlockProvable";
|
|
22
|
+
export * from "./prover/block/accummulators/RuntimeVerificationKeyTree";
|
|
23
|
+
export * from "./prover/block/accummulators/BlockHashMerkleTree";
|
|
24
|
+
export * from "./prover/block/services/RuntimeVerificationKeyRootService";
|
|
25
|
+
export * from "./prover/statetransition/StateTransitionProver";
|
|
26
|
+
export * from "./prover/statetransition/StateTransitionProvable";
|
|
27
|
+
export * from "./prover/statetransition/StateTransitionWitnessProvider";
|
|
28
|
+
export * from "./prover/statetransition/StateTransitionWitnessProviderReference";
|
|
29
|
+
export * from "./protocol/Protocol";
|
|
30
|
+
export * from "./protocol/ProtocolModule";
|
|
31
|
+
export * from "./protocol/ProtocolEnvironment";
|
|
32
|
+
export * from "./protocol/ProvableTransactionHook";
|
|
33
|
+
export * from "./protocol/ProvableBlockHook";
|
|
34
|
+
export * from "./state/context/TransitionMethodExecutionContext";
|
|
35
|
+
export * from "./state/context/RuntimeMethodExecutionContext";
|
|
36
|
+
export * from "./state/protocol/ProtocolState";
|
|
37
|
+
export * from "./state/State";
|
|
38
|
+
export * from "./state/StateMap";
|
|
39
|
+
export * from "./state/StateService";
|
|
40
|
+
export * from "./state/StateServiceProvider";
|
|
41
|
+
export * from "./state/assert/assert";
|
|
42
|
+
export * from "./settlement/contracts/SettlementSmartContract";
|
|
43
|
+
export * from "./settlement/contracts/SettlementContractProtocolModule";
|
|
44
|
+
export * from "./settlement/contracts/DispatchSmartContract";
|
|
45
|
+
export * from "./settlement/contracts/DispatchContractProtocolModule";
|
|
46
|
+
export * from "./settlement/SettlementContractModule";
|
|
47
|
+
export * from "./settlement/ContractModule";
|
|
48
|
+
export * from "./settlement/modularity/ProvableSettlementHook";
|
|
49
|
+
export * from "./settlement/messages/OutgoingMessageArgument";
|
|
50
|
+
export * from "./settlement/modules/NetworkStateSettlementModule";
|
|
51
|
+
export * from "./settlement/messages/Deposit";
|
|
52
|
+
export * from "./settlement/messages/Withdrawal";
|
|
53
|
+
export { constants as ProtocolConstants } from "./Constants";
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Bool, Field, Struct } from "o1js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Public input used to link in-circuit execution with
|
|
5
|
+
* the proof's public input.
|
|
6
|
+
*/
|
|
7
|
+
export class MethodPublicOutput extends Struct({
|
|
8
|
+
stateTransitionsHash: Field,
|
|
9
|
+
status: Bool,
|
|
10
|
+
transactionHash: Field,
|
|
11
|
+
networkStateHash: Field,
|
|
12
|
+
isMessage: Bool,
|
|
13
|
+
eventsHash: Field,
|
|
14
|
+
}) {}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Bool,
|
|
3
|
+
Field,
|
|
4
|
+
type FlexibleProvablePure,
|
|
5
|
+
Poseidon,
|
|
6
|
+
Provable,
|
|
7
|
+
ProvablePure,
|
|
8
|
+
Struct,
|
|
9
|
+
} from "o1js";
|
|
10
|
+
|
|
11
|
+
export class ProvableOption extends Struct({
|
|
12
|
+
isSome: Bool,
|
|
13
|
+
value: Field,
|
|
14
|
+
}) {
|
|
15
|
+
public toSome() {
|
|
16
|
+
this.isSome = Bool(true);
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export abstract class OptionBase {
|
|
22
|
+
protected constructor(
|
|
23
|
+
public isSome: Bool,
|
|
24
|
+
public isForcedSome: Bool
|
|
25
|
+
) {}
|
|
26
|
+
|
|
27
|
+
protected abstract encodeValueToFields(): Field[];
|
|
28
|
+
|
|
29
|
+
protected abstract clone(): OptionBase;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @returns Tree representation of the current value
|
|
33
|
+
*/
|
|
34
|
+
public get treeValue() {
|
|
35
|
+
const treeValue = Poseidon.hash(this.encodeValueToFields());
|
|
36
|
+
|
|
37
|
+
return Provable.if(
|
|
38
|
+
this.isSome.and(this.isForcedSome.not()),
|
|
39
|
+
treeValue,
|
|
40
|
+
Field(0)
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public forceSome() {
|
|
45
|
+
this.isForcedSome = Provable.if(this.isSome, Bool(false), Bool(true));
|
|
46
|
+
this.isSome = Bool(true);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns the `to`-value as decoded as a list of fields
|
|
51
|
+
* Not in circuit
|
|
52
|
+
*/
|
|
53
|
+
public toFields(): Field[] {
|
|
54
|
+
if (this.isSome.toBoolean()) {
|
|
55
|
+
return this.encodeValueToFields();
|
|
56
|
+
}
|
|
57
|
+
return [Field(0)];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @returns Provable representation of the current option.
|
|
62
|
+
*/
|
|
63
|
+
public toProvable() {
|
|
64
|
+
return new ProvableOption({
|
|
65
|
+
isSome: this.isSome,
|
|
66
|
+
value: this.treeValue,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public toJSON() {
|
|
71
|
+
const value = this.encodeValueToFields().map((field) => field.toString());
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
isSome: this.isSome.toBoolean(),
|
|
75
|
+
isForcedSome: this.isForcedSome.toBoolean(),
|
|
76
|
+
value,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Option facilitating in-circuit values that may or may not exist.
|
|
83
|
+
*/
|
|
84
|
+
export class Option<Value> extends OptionBase {
|
|
85
|
+
/**
|
|
86
|
+
* Creates a new Option from the provided parameters
|
|
87
|
+
*
|
|
88
|
+
* @param isSome
|
|
89
|
+
* @param value
|
|
90
|
+
* @param valueType
|
|
91
|
+
* @returns New option from the provided parameters.
|
|
92
|
+
*/
|
|
93
|
+
public static from<Value>(
|
|
94
|
+
isSome: Bool,
|
|
95
|
+
value: Value,
|
|
96
|
+
valueType: FlexibleProvablePure<Value>
|
|
97
|
+
) {
|
|
98
|
+
return new Option(isSome, value, valueType);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Creates a new Option from the provided parameters
|
|
103
|
+
*
|
|
104
|
+
* @param value
|
|
105
|
+
* @param valueType
|
|
106
|
+
* @returns New option from the provided parameters.
|
|
107
|
+
*/
|
|
108
|
+
public static fromValue<Value>(
|
|
109
|
+
value: Value,
|
|
110
|
+
valueType: FlexibleProvablePure<Value>
|
|
111
|
+
) {
|
|
112
|
+
return this.from(Bool(true), value, valueType);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @returns Empty / none option
|
|
117
|
+
*/
|
|
118
|
+
public static none() {
|
|
119
|
+
return new Option(Bool(false), Field(0), Field);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public constructor(
|
|
123
|
+
isSome: Bool,
|
|
124
|
+
public value: Value,
|
|
125
|
+
public valueType: FlexibleProvablePure<Value>,
|
|
126
|
+
isForcedSome = Bool(false)
|
|
127
|
+
) {
|
|
128
|
+
super(isSome, isForcedSome);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public encodeValueToFields(): Field[] {
|
|
132
|
+
return this.valueType.toFields(this.value);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public clone(): Option<Value> {
|
|
136
|
+
return new Option(
|
|
137
|
+
this.isSome,
|
|
138
|
+
this.value,
|
|
139
|
+
this.valueType,
|
|
140
|
+
this.isForcedSome
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @returns Returns the value of this option if it isSome,
|
|
146
|
+
* otherwise returns the given defaultValue
|
|
147
|
+
*/
|
|
148
|
+
public orElse(defaultValue: Value): Value {
|
|
149
|
+
return Provable.if<Value>(
|
|
150
|
+
this.isSome,
|
|
151
|
+
this.valueType,
|
|
152
|
+
this.value,
|
|
153
|
+
defaultValue
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public toConstant() {
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
159
|
+
const valueConstant = (this.valueType as ProvablePure<Value>).fromFields(
|
|
160
|
+
this.valueType.toFields(this.value).map((field) => field.toConstant())
|
|
161
|
+
);
|
|
162
|
+
const boolConstant = (bool: Bool) =>
|
|
163
|
+
Bool.fromFields([bool.toField().toConstant()]);
|
|
164
|
+
|
|
165
|
+
return new Option(
|
|
166
|
+
boolConstant(this.isSome),
|
|
167
|
+
valueConstant,
|
|
168
|
+
this.valueType,
|
|
169
|
+
boolConstant(this.isForcedSome)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Field, type FlexibleProvablePure, Poseidon } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { stringToField } from "../utils/utils";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Helps manage path (key) identifiers for key-values in trees.
|
|
7
|
+
*/
|
|
8
|
+
export class Path {
|
|
9
|
+
/**
|
|
10
|
+
* Encodes a JS string as a Field
|
|
11
|
+
*
|
|
12
|
+
* @param value
|
|
13
|
+
* @returns Field representation of the provided value
|
|
14
|
+
*/
|
|
15
|
+
public static toField(value: string) {
|
|
16
|
+
return stringToField(value);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Encodes a class name and its property name into a Field
|
|
21
|
+
*
|
|
22
|
+
* @param className
|
|
23
|
+
* @param propertyKey
|
|
24
|
+
* @returns Field representation of class name + property name
|
|
25
|
+
*/
|
|
26
|
+
public static fromProperty(className: string, propertyKey: string): Field {
|
|
27
|
+
return Poseidon.hash([
|
|
28
|
+
Path.toField(className),
|
|
29
|
+
Path.toField(propertyKey),
|
|
30
|
+
Field(0),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Encodes an existing path with the provided key into a single Field.
|
|
36
|
+
*
|
|
37
|
+
* @param path
|
|
38
|
+
* @param keyType
|
|
39
|
+
* @param key
|
|
40
|
+
* @returns Field representation of the leading path + the provided key.
|
|
41
|
+
*/
|
|
42
|
+
public static fromKey<KeyType>(
|
|
43
|
+
path: Field,
|
|
44
|
+
keyType: FlexibleProvablePure<KeyType>,
|
|
45
|
+
key: KeyType
|
|
46
|
+
): Field {
|
|
47
|
+
const keyHash = Poseidon.hash(keyType.toFields(key));
|
|
48
|
+
return Poseidon.hash([path, keyHash]);
|
|
49
|
+
}
|
|
50
|
+
}
|