@proto-kit/protocol 0.1.1-develop.1088 → 0.1.1-develop.1313
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/dist/Constants.js +1 -0
- package/dist/Constants.js.map +1 -0
- package/dist/hooks/AccountStateHook.js +1 -0
- package/dist/hooks/AccountStateHook.js.map +1 -0
- package/dist/hooks/BlockHeightHook.js +1 -0
- package/dist/hooks/BlockHeightHook.js.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +1 -0
- package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
- package/dist/hooks/NoopBlockHook.js +1 -0
- package/dist/hooks/NoopBlockHook.js.map +1 -0
- package/dist/hooks/NoopSettlementHook.d.ts +2 -2
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -1
- package/dist/hooks/NoopSettlementHook.js +1 -0
- package/dist/hooks/NoopSettlementHook.js.map +1 -0
- package/dist/hooks/NoopTransactionHook.js +1 -0
- package/dist/hooks/NoopTransactionHook.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -0
- package/dist/model/MethodPublicOutput.js +1 -0
- package/dist/model/MethodPublicOutput.js.map +1 -0
- package/dist/model/Option.js +1 -0
- package/dist/model/Option.js.map +1 -0
- package/dist/model/Path.js +1 -0
- package/dist/model/Path.js.map +1 -0
- package/dist/model/RuntimeLike.js +1 -0
- package/dist/model/RuntimeLike.js.map +1 -0
- package/dist/model/StateTransition.js +1 -0
- package/dist/model/StateTransition.js.map +1 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +28 -2
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
- package/dist/model/StateTransitionProvableBatch.js +9 -3
- package/dist/model/StateTransitionProvableBatch.js.map +1 -0
- package/dist/model/network/NetworkState.js +1 -0
- package/dist/model/network/NetworkState.js.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.js +1 -0
- package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +1 -0
- package/dist/model/transaction/SignedTransaction.js.map +1 -0
- package/dist/model/transaction/ValueOption.js +1 -0
- package/dist/model/transaction/ValueOption.js.map +1 -0
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +31 -6
- package/dist/protocol/Protocol.js.map +1 -0
- package/dist/protocol/ProtocolEnvironment.js +1 -0
- package/dist/protocol/ProtocolEnvironment.js.map +1 -0
- package/dist/protocol/ProtocolModule.d.ts +1 -1
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +2 -1
- package/dist/protocol/ProtocolModule.js.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +1 -0
- package/dist/protocol/ProvableBlockHook.js.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +1 -0
- package/dist/protocol/ProvableTransactionHook.js.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.js +1 -0
- package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
- package/dist/prover/block/BlockProvable.d.ts +19 -5
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +5 -2
- package/dist/prover/block/BlockProvable.js.map +1 -0
- package/dist/prover/block/BlockProver.d.ts +11 -9
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +79 -41
- package/dist/prover/block/BlockProver.js.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +2 -2
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +2 -4
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProvable.js +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +7 -10
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +27 -28
- package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
- package/dist/settlement/ContractModule.d.ts +4 -3
- package/dist/settlement/ContractModule.d.ts.map +1 -1
- package/dist/settlement/ContractModule.js +2 -1
- package/dist/settlement/ContractModule.js.map +1 -0
- package/dist/settlement/SettlementContractModule.d.ts +25 -12
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -1
- package/dist/settlement/SettlementContractModule.js +29 -20
- package/dist/settlement/SettlementContractModule.js.map +1 -0
- package/dist/settlement/contracts/BridgeContract.d.ts +97 -0
- package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContract.js +164 -0
- package/dist/settlement/contracts/BridgeContract.js.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +10 -1
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -1
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +24 -2
- package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +26 -4
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -1
- package/dist/settlement/contracts/DispatchSmartContract.js +139 -19
- package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +10 -8
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -1
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +47 -9
- package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +98 -17
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -1
- package/dist/settlement/contracts/SettlementSmartContract.js +147 -79
- package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
- package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
- package/dist/settlement/messages/Deposit.d.ts +13 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -1
- package/dist/settlement/messages/Deposit.js +3 -1
- package/dist/settlement/messages/Deposit.js.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +8 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -1
- package/dist/settlement/messages/OutgoingMessageArgument.js +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
- package/dist/settlement/messages/Withdrawal.d.ts +13 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -1
- package/dist/settlement/messages/Withdrawal.js +4 -1
- package/dist/settlement/messages/Withdrawal.js.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +5 -3
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -1
- package/dist/settlement/modularity/ProvableSettlementHook.js +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
- package/dist/settlement/modularity/types.d.ts +8 -0
- package/dist/settlement/modularity/types.d.ts.map +1 -0
- package/dist/settlement/modularity/types.js +2 -0
- package/dist/settlement/modularity/types.js.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
- package/dist/state/State.js +1 -0
- package/dist/state/State.js.map +1 -0
- package/dist/state/StateMap.js +1 -0
- package/dist/state/StateMap.js.map +1 -0
- package/dist/state/StateService.js +1 -0
- package/dist/state/StateService.js.map +1 -0
- package/dist/state/StateServiceProvider.js +1 -0
- package/dist/state/StateServiceProvider.js.map +1 -0
- package/dist/state/assert/assert.js +1 -0
- package/dist/state/assert/assert.js.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
- package/dist/state/protocol/ProtocolState.js +1 -0
- package/dist/state/protocol/ProtocolState.js.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
- package/dist/utils/PrefixedProvableHashList.js +1 -0
- package/dist/utils/PrefixedProvableHashList.js.map +1 -0
- package/dist/utils/ProvableHashList.js +1 -0
- package/dist/utils/ProvableHashList.js.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +1 -0
- package/dist/utils/ProvableReductionHashList.js.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +1 -0
- package/dist/utils/StateTransitionReductionList.js.map +1 -0
- package/dist/utils/utils.js +1 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.cjs +12 -1
- package/package.json +4 -4
- package/src/hooks/NoopSettlementHook.ts +2 -2
- package/src/index.ts +6 -2
- package/src/model/StateTransitionProvableBatch.ts +24 -4
- package/src/protocol/Protocol.ts +36 -7
- package/src/protocol/ProtocolModule.ts +1 -1
- package/src/prover/block/BlockProvable.ts +9 -9
- package/src/prover/block/BlockProver.ts +94 -58
- package/src/prover/statetransition/StateTransitionProvable.ts +5 -8
- package/src/prover/statetransition/StateTransitionProver.ts +46 -40
- package/src/settlement/ContractModule.ts +17 -10
- package/src/settlement/SettlementContractModule.ts +54 -41
- package/src/settlement/contracts/BridgeContract.ts +237 -0
- package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +37 -3
- package/src/settlement/contracts/DispatchSmartContract.ts +213 -23
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +61 -20
- package/src/settlement/contracts/SettlementSmartContract.ts +261 -107
- package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
- package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
- package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
- package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
- package/src/settlement/messages/Deposit.ts +2 -1
- package/src/settlement/messages/Withdrawal.ts +3 -1
- package/src/settlement/modularity/ProvableSettlementHook.ts +6 -3
- package/src/settlement/modularity/types.ts +22 -0
- package/test/BlockProver.test.ts +2 -1
- package/test/TestingProtocol.ts +17 -12
- package/test/compiling/types.ts +28 -0
- package/test/modularity/types.ts +35 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +0 -16
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +0 -7
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +0 -1
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +0 -19
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts +0 -22
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +0 -1
- package/dist/state/context/ProtocolMethodExecutionContext.js +0 -28
- package/src/prover/statetransition/StateTransitionWitnessProvider.ts +0 -23
- package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +0 -17
|
@@ -4,6 +4,9 @@ import {
|
|
|
4
4
|
provableMethod,
|
|
5
5
|
RollupMerkleTreeWitness,
|
|
6
6
|
ZkProgrammable,
|
|
7
|
+
CompilableModule,
|
|
8
|
+
type ArtifactRecord,
|
|
9
|
+
type CompileRegistry,
|
|
7
10
|
} from "@proto-kit/common";
|
|
8
11
|
import { Field, Provable, SelfProof, ZkProgram } from "o1js";
|
|
9
12
|
import { injectable } from "tsyringe";
|
|
@@ -27,15 +30,24 @@ import {
|
|
|
27
30
|
StateTransitionProverPublicInput,
|
|
28
31
|
StateTransitionProverPublicOutput,
|
|
29
32
|
} from "./StateTransitionProvable";
|
|
30
|
-
import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
|
|
31
|
-
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
32
33
|
|
|
33
34
|
const errors = {
|
|
34
35
|
propertyNotMatching: (property: string, step: string) =>
|
|
35
36
|
`${property} not matching ${step}`,
|
|
36
37
|
|
|
37
|
-
merkleWitnessNotCorrect: (
|
|
38
|
-
|
|
38
|
+
merkleWitnessNotCorrect: (
|
|
39
|
+
index: number,
|
|
40
|
+
type: ProvableStateTransitionType
|
|
41
|
+
) => {
|
|
42
|
+
let s = `MerkleWitness not valid for StateTransition (${index}, type unknown)`;
|
|
43
|
+
Provable.asProver(() => {
|
|
44
|
+
s = s.replace(
|
|
45
|
+
"unknown",
|
|
46
|
+
type.isNormal().toBoolean() ? "normal" : "protocol"
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
return s;
|
|
50
|
+
},
|
|
39
51
|
|
|
40
52
|
noWitnessProviderSet: () =>
|
|
41
53
|
new Error(
|
|
@@ -64,14 +76,13 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
64
76
|
StateTransitionProverPublicOutput
|
|
65
77
|
> {
|
|
66
78
|
public constructor(
|
|
67
|
-
private readonly stateTransitionProver: StateTransitionProver
|
|
68
|
-
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
|
|
79
|
+
private readonly stateTransitionProver: StateTransitionProver
|
|
69
80
|
) {
|
|
70
81
|
super();
|
|
71
82
|
}
|
|
72
83
|
|
|
73
|
-
public get
|
|
74
|
-
return this.stateTransitionProver.
|
|
84
|
+
public get areProofsEnabled(): AreProofsEnabled | undefined {
|
|
85
|
+
return this.stateTransitionProver.areProofsEnabled;
|
|
75
86
|
}
|
|
76
87
|
|
|
77
88
|
public zkProgramFactory(): PlainZkProgram<
|
|
@@ -86,7 +97,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
86
97
|
publicOutput: StateTransitionProverPublicOutput,
|
|
87
98
|
|
|
88
99
|
methods: {
|
|
89
|
-
|
|
100
|
+
runBatch: {
|
|
90
101
|
privateInputs: [StateTransitionProvableBatch],
|
|
91
102
|
|
|
92
103
|
async method(
|
|
@@ -115,7 +126,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
115
126
|
});
|
|
116
127
|
|
|
117
128
|
const methods = {
|
|
118
|
-
|
|
129
|
+
runBatch: program.runBatch.bind(program),
|
|
119
130
|
merge: program.merge.bind(program),
|
|
120
131
|
};
|
|
121
132
|
|
|
@@ -123,6 +134,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
123
134
|
|
|
124
135
|
return [
|
|
125
136
|
{
|
|
137
|
+
name: program.name,
|
|
126
138
|
compile: program.compile.bind(program),
|
|
127
139
|
verify: program.verify.bind(program),
|
|
128
140
|
analyzeMethods: program.analyzeMethods.bind(program),
|
|
@@ -132,14 +144,6 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
132
144
|
];
|
|
133
145
|
}
|
|
134
146
|
|
|
135
|
-
private get witnessProvider(): StateTransitionWitnessProvider {
|
|
136
|
-
const provider = this.witnessProviderReference.getWitnessProvider();
|
|
137
|
-
if (provider === undefined) {
|
|
138
|
-
throw errors.noWitnessProviderSet();
|
|
139
|
-
}
|
|
140
|
-
return provider;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
147
|
/**
|
|
144
148
|
* Applies the state transitions to the current stateRoot
|
|
145
149
|
* and returns the new prover state
|
|
@@ -168,12 +172,19 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
168
172
|
|
|
169
173
|
const transitions = transitionBatch.batch;
|
|
170
174
|
const types = transitionBatch.transitionTypes;
|
|
175
|
+
const merkleWitness = transitionBatch.merkleWitnesses;
|
|
171
176
|
for (
|
|
172
177
|
let index = 0;
|
|
173
178
|
index < constants.stateTransitionProverBatchSize;
|
|
174
179
|
index++
|
|
175
180
|
) {
|
|
176
|
-
this.applyTransition(
|
|
181
|
+
this.applyTransition(
|
|
182
|
+
state,
|
|
183
|
+
transitions[index],
|
|
184
|
+
types[index],
|
|
185
|
+
merkleWitness[index],
|
|
186
|
+
index
|
|
187
|
+
);
|
|
177
188
|
}
|
|
178
189
|
|
|
179
190
|
return state;
|
|
@@ -187,13 +198,10 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
187
198
|
state: StateTransitionProverExecutionState,
|
|
188
199
|
transition: ProvableStateTransition,
|
|
189
200
|
type: ProvableStateTransitionType,
|
|
201
|
+
merkleWitness: RollupMerkleTreeWitness,
|
|
190
202
|
index = 0
|
|
191
203
|
) {
|
|
192
|
-
const
|
|
193
|
-
this.witnessProvider.getWitness(transition.path)
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
const membershipValid = witness.checkMembership(
|
|
204
|
+
const membershipValid = merkleWitness.checkMembership(
|
|
197
205
|
state.stateRoot,
|
|
198
206
|
transition.path,
|
|
199
207
|
transition.from.value
|
|
@@ -201,14 +209,9 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
201
209
|
|
|
202
210
|
membershipValid
|
|
203
211
|
.or(transition.from.isSome.not())
|
|
204
|
-
.assertTrue(
|
|
205
|
-
errors.merkleWitnessNotCorrect(
|
|
206
|
-
index,
|
|
207
|
-
type.isNormal().toBoolean() ? "normal" : "protocol"
|
|
208
|
-
)
|
|
209
|
-
);
|
|
212
|
+
.assertTrue(errors.merkleWitnessNotCorrect(index, type));
|
|
210
213
|
|
|
211
|
-
const newRoot =
|
|
214
|
+
const newRoot = merkleWitness.calculateRoot(transition.to.value);
|
|
212
215
|
|
|
213
216
|
state.stateRoot = Provable.if(
|
|
214
217
|
transition.to.isSome,
|
|
@@ -339,19 +342,22 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
339
342
|
@injectable()
|
|
340
343
|
export class StateTransitionProver
|
|
341
344
|
extends ProtocolModule
|
|
342
|
-
implements
|
|
345
|
+
implements
|
|
346
|
+
StateTransitionProvable,
|
|
347
|
+
StateTransitionProverType,
|
|
348
|
+
CompilableModule
|
|
343
349
|
{
|
|
344
350
|
public zkProgrammable: StateTransitionProverProgrammable;
|
|
345
351
|
|
|
346
|
-
public constructor(
|
|
347
|
-
// Injected
|
|
348
|
-
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
|
|
349
|
-
) {
|
|
352
|
+
public constructor() {
|
|
350
353
|
super();
|
|
351
|
-
this.zkProgrammable = new StateTransitionProverProgrammable(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
354
|
+
this.zkProgrammable = new StateTransitionProverProgrammable(this);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public async compile(
|
|
358
|
+
registry: CompileRegistry
|
|
359
|
+
): Promise<void | ArtifactRecord> {
|
|
360
|
+
return await this.zkProgrammable.compile(registry);
|
|
355
361
|
}
|
|
356
362
|
|
|
357
363
|
public runBatch(
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ArtifactRecord,
|
|
3
|
+
type CompilableModule,
|
|
4
|
+
CompileRegistry,
|
|
5
|
+
ConfigurableModule,
|
|
6
|
+
NoConfig,
|
|
7
|
+
TypedClass,
|
|
8
|
+
} from "@proto-kit/common";
|
|
2
9
|
import { SmartContract } from "o1js";
|
|
3
10
|
|
|
4
11
|
export type SmartContractClassFromInterface<Type> = typeof SmartContract &
|
|
@@ -12,13 +19,13 @@ export type SmartContractClassFromInterface<Type> = typeof SmartContract &
|
|
|
12
19
|
* of SmartContract and implements a certain interface as specified by the
|
|
13
20
|
* ContractType generic.
|
|
14
21
|
*/
|
|
15
|
-
export abstract class ContractModule<
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
public abstract
|
|
22
|
-
|
|
23
|
-
):
|
|
22
|
+
export abstract class ContractModule<ContractType, Config = NoConfig>
|
|
23
|
+
extends ConfigurableModule<Config>
|
|
24
|
+
implements CompilableModule
|
|
25
|
+
{
|
|
26
|
+
public abstract contractFactory(): SmartContractClassFromInterface<ContractType>;
|
|
27
|
+
|
|
28
|
+
public abstract compile(
|
|
29
|
+
registry: CompileRegistry
|
|
30
|
+
): Promise<ArtifactRecord | undefined>;
|
|
24
31
|
}
|
|
@@ -5,17 +5,15 @@ import {
|
|
|
5
5
|
ModulesRecord,
|
|
6
6
|
TypedClass,
|
|
7
7
|
noop,
|
|
8
|
+
StringKeyOf,
|
|
8
9
|
} from "@proto-kit/common";
|
|
9
|
-
import { PublicKey, SmartContract } from "o1js";
|
|
10
|
+
import { Field, PublicKey, SmartContract } from "o1js";
|
|
10
11
|
import { injectable } from "tsyringe";
|
|
11
12
|
|
|
12
13
|
import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
|
|
13
14
|
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
14
15
|
|
|
15
|
-
import {
|
|
16
|
-
ContractModule,
|
|
17
|
-
SmartContractClassFromInterface,
|
|
18
|
-
} from "./ContractModule";
|
|
16
|
+
import { ContractModule } from "./ContractModule";
|
|
19
17
|
import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
|
|
20
18
|
import { DispatchContractType } from "./contracts/DispatchSmartContract";
|
|
21
19
|
import {
|
|
@@ -23,21 +21,24 @@ import {
|
|
|
23
21
|
SettlementContractProtocolModule,
|
|
24
22
|
} from "./contracts/SettlementContractProtocolModule";
|
|
25
23
|
import { SettlementContractType } from "./contracts/SettlementSmartContract";
|
|
24
|
+
import { BridgeContractType } from "./contracts/BridgeContract";
|
|
25
|
+
import {
|
|
26
|
+
BridgeContractConfig,
|
|
27
|
+
BridgeContractProtocolModule,
|
|
28
|
+
} from "./contracts/BridgeContractProtocolModule";
|
|
29
|
+
import { GetContracts } from "./modularity/types";
|
|
26
30
|
|
|
27
31
|
export type SettlementModulesRecord = ModulesRecord<
|
|
28
|
-
TypedClass<ContractModule<unknown, unknown
|
|
32
|
+
TypedClass<ContractModule<unknown, unknown>>
|
|
29
33
|
>;
|
|
30
34
|
|
|
31
35
|
export type MandatorySettlementModulesRecord = {
|
|
32
36
|
SettlementContract: TypedClass<
|
|
33
|
-
ContractModule<
|
|
34
|
-
SettlementContractType,
|
|
35
|
-
SmartContractClassFromInterface<DispatchContractType>,
|
|
36
|
-
SettlementContractConfig
|
|
37
|
-
>
|
|
37
|
+
ContractModule<SettlementContractType, SettlementContractConfig>
|
|
38
38
|
>;
|
|
39
|
-
DispatchContract: TypedClass<
|
|
40
|
-
|
|
39
|
+
DispatchContract: TypedClass<ContractModule<DispatchContractType, unknown>>;
|
|
40
|
+
BridgeContract: TypedClass<
|
|
41
|
+
ContractModule<BridgeContractType, BridgeContractConfig>
|
|
41
42
|
>;
|
|
42
43
|
};
|
|
43
44
|
|
|
@@ -66,17 +67,33 @@ export class SettlementContractModule<
|
|
|
66
67
|
};
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
public static
|
|
70
|
-
return
|
|
70
|
+
public static mandatoryModules() {
|
|
71
|
+
return {
|
|
71
72
|
SettlementContract: SettlementContractProtocolModule,
|
|
72
73
|
DispatchContract: DispatchContractProtocolModule,
|
|
73
|
-
|
|
74
|
+
BridgeContract: BridgeContractProtocolModule,
|
|
75
|
+
} as const;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public static fromDefaults() {
|
|
79
|
+
return SettlementContractModule.from(
|
|
80
|
+
SettlementContractModule.mandatoryModules()
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public static with<AdditionalModules extends SettlementModulesRecord>(
|
|
85
|
+
additionalModules: AdditionalModules
|
|
86
|
+
) {
|
|
87
|
+
return SettlementContractModule.from({
|
|
88
|
+
...SettlementContractModule.mandatoryModules(),
|
|
89
|
+
...additionalModules,
|
|
90
|
+
} as const);
|
|
74
91
|
}
|
|
75
92
|
|
|
76
93
|
// ** For protocol module
|
|
77
94
|
public protocol?: ProtocolEnvironment;
|
|
78
95
|
|
|
79
|
-
public get
|
|
96
|
+
public get areProofsEnabled(): AreProofsEnabled | undefined {
|
|
80
97
|
return this.protocol?.getAreProofsEnabled();
|
|
81
98
|
}
|
|
82
99
|
// **
|
|
@@ -89,25 +106,14 @@ export class SettlementContractModule<
|
|
|
89
106
|
noop();
|
|
90
107
|
}
|
|
91
108
|
|
|
92
|
-
public getContractClasses(): {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const settlementModule = this.resolve(settlementContractKey);
|
|
102
|
-
const dispatchModule = this.resolve(dispatchContractKey);
|
|
103
|
-
|
|
104
|
-
const dispatch = dispatchModule.contractFactory(undefined);
|
|
105
|
-
const settlement = settlementModule.contractFactory(dispatch);
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
settlement,
|
|
109
|
-
dispatch,
|
|
110
|
-
};
|
|
109
|
+
public getContractClasses(): GetContracts<SettlementModules> {
|
|
110
|
+
const contracts =
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
112
|
+
(this.moduleNames as StringKeyOf<SettlementModules>[]).map((name) => {
|
|
113
|
+
const module = this.resolve(name);
|
|
114
|
+
return [name, module.contractFactory()];
|
|
115
|
+
});
|
|
116
|
+
return Object.fromEntries(contracts);
|
|
111
117
|
}
|
|
112
118
|
|
|
113
119
|
public createContracts(addresses: {
|
|
@@ -117,16 +123,23 @@ export class SettlementContractModule<
|
|
|
117
123
|
settlement: SettlementContractType & SmartContract;
|
|
118
124
|
dispatch: DispatchContractType & SmartContract;
|
|
119
125
|
} {
|
|
120
|
-
const {
|
|
126
|
+
const { DispatchContract, SettlementContract } = this.getContractClasses();
|
|
121
127
|
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
// eslint-disable-next-line new-cap
|
|
125
|
-
const settlementInstance = new settlement(addresses.settlement);
|
|
128
|
+
const dispatchInstance = new DispatchContract(addresses.dispatch);
|
|
129
|
+
const settlementInstance = new SettlementContract(addresses.settlement);
|
|
126
130
|
|
|
127
131
|
return {
|
|
128
132
|
dispatch: dispatchInstance,
|
|
129
133
|
settlement: settlementInstance,
|
|
130
134
|
};
|
|
131
135
|
}
|
|
136
|
+
|
|
137
|
+
public createBridgeContract(
|
|
138
|
+
address: PublicKey,
|
|
139
|
+
tokenId?: Field
|
|
140
|
+
): BridgeContractType & SmartContract {
|
|
141
|
+
const { BridgeContract } = this.getContractClasses();
|
|
142
|
+
|
|
143
|
+
return new BridgeContract(address, tokenId);
|
|
144
|
+
}
|
|
132
145
|
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AccountUpdate,
|
|
3
|
+
Bool,
|
|
4
|
+
Field,
|
|
5
|
+
method,
|
|
6
|
+
Permissions,
|
|
7
|
+
Poseidon,
|
|
8
|
+
Provable,
|
|
9
|
+
PublicKey,
|
|
10
|
+
SmartContract,
|
|
11
|
+
State,
|
|
12
|
+
state,
|
|
13
|
+
Struct,
|
|
14
|
+
TokenContractV2,
|
|
15
|
+
TokenId,
|
|
16
|
+
VerificationKey,
|
|
17
|
+
} from "o1js";
|
|
18
|
+
import { noop, range, TypedClass } from "@proto-kit/common";
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
OUTGOING_MESSAGE_BATCH_SIZE,
|
|
22
|
+
OutgoingMessageArgumentBatch,
|
|
23
|
+
} from "../messages/OutgoingMessageArgument";
|
|
24
|
+
import { Path } from "../../model/Path";
|
|
25
|
+
import { Withdrawal } from "../messages/Withdrawal";
|
|
26
|
+
|
|
27
|
+
import type { SettlementContractType } from "./SettlementSmartContract";
|
|
28
|
+
|
|
29
|
+
export type BridgeContractType = {
|
|
30
|
+
stateRoot: State<Field>;
|
|
31
|
+
outgoingMessageCursor: State<Field>;
|
|
32
|
+
|
|
33
|
+
rollupOutgoingMessages: (
|
|
34
|
+
batch: OutgoingMessageArgumentBatch
|
|
35
|
+
) => Promise<Field>;
|
|
36
|
+
redeem: (additionUpdate: AccountUpdate) => Promise<void>;
|
|
37
|
+
|
|
38
|
+
deployProvable: (
|
|
39
|
+
args: VerificationKey | undefined,
|
|
40
|
+
signedSettlement: boolean,
|
|
41
|
+
permissions: Permissions,
|
|
42
|
+
settlementContractAddress: PublicKey
|
|
43
|
+
) => Promise<AccountUpdate>;
|
|
44
|
+
|
|
45
|
+
updateStateRoot: (root: Field) => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Equal to WithdrawalKey
|
|
49
|
+
export class OutgoingMessageKey extends Struct({
|
|
50
|
+
index: Field,
|
|
51
|
+
tokenId: Field,
|
|
52
|
+
}) {}
|
|
53
|
+
|
|
54
|
+
export abstract class BridgeContractBase extends TokenContractV2 {
|
|
55
|
+
public static args: {
|
|
56
|
+
SettlementContract:
|
|
57
|
+
| (TypedClass<SettlementContractType> & typeof SmartContract)
|
|
58
|
+
| undefined;
|
|
59
|
+
withdrawalStatePath: [string, string];
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
abstract settlementContractAddress: State<PublicKey>;
|
|
63
|
+
|
|
64
|
+
abstract stateRoot: State<Field>;
|
|
65
|
+
|
|
66
|
+
abstract outgoingMessageCursor: State<Field>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Function to deploy the bridging contract in a provable way, so that it can be
|
|
70
|
+
* a provable process initiated by the settlement contract with a baked-in vk
|
|
71
|
+
*
|
|
72
|
+
* @returns Creates and returns an account update deploying the bridge contract
|
|
73
|
+
*/
|
|
74
|
+
public async deployProvable(
|
|
75
|
+
verificationKey: VerificationKey | undefined,
|
|
76
|
+
signedSettlement: boolean,
|
|
77
|
+
permissions: Permissions,
|
|
78
|
+
settlementContractAddress: PublicKey
|
|
79
|
+
) {
|
|
80
|
+
const accountUpdate = this.self;
|
|
81
|
+
|
|
82
|
+
if (!signedSettlement) {
|
|
83
|
+
if (verificationKey === undefined) {
|
|
84
|
+
throw new Error("Verification Key not provided, can't deploy");
|
|
85
|
+
}
|
|
86
|
+
accountUpdate.account.verificationKey.set(verificationKey);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
accountUpdate.requireSignature();
|
|
90
|
+
this.account.permissions.set(permissions);
|
|
91
|
+
|
|
92
|
+
range(0, 8).forEach((i) => {
|
|
93
|
+
accountUpdate.update.appState[i] = {
|
|
94
|
+
isSome: Bool(true),
|
|
95
|
+
value: Field(0),
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
this.settlementContractAddress.set(settlementContractAddress);
|
|
100
|
+
|
|
101
|
+
accountUpdate.body.mayUseToken = {
|
|
102
|
+
// Set to true for custom tokens only
|
|
103
|
+
inheritFromParent: accountUpdate.tokenId.equals(TokenId.default).not(),
|
|
104
|
+
parentsOwnToken: Bool(false),
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return accountUpdate;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public async approveBase(): Promise<void> {
|
|
111
|
+
noop();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public async updateStateRootBase(root: Field) {
|
|
115
|
+
this.stateRoot.set(root);
|
|
116
|
+
|
|
117
|
+
const settlementContractAddress =
|
|
118
|
+
this.settlementContractAddress.getAndRequireEquals();
|
|
119
|
+
const SettlementContractClass = BridgeContractBase.args.SettlementContract;
|
|
120
|
+
if (SettlementContractClass === undefined) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
"Settlement Contract class hasn't been set yet, something is wrong with your module composition"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
const settlementContract = new SettlementContractClass(
|
|
126
|
+
settlementContractAddress
|
|
127
|
+
);
|
|
128
|
+
const accountUpdate = settlementContract.assertStateRoot(root);
|
|
129
|
+
this.approve(accountUpdate);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public async rollupOutgoingMessagesBase(
|
|
133
|
+
batch: OutgoingMessageArgumentBatch
|
|
134
|
+
): Promise<Field> {
|
|
135
|
+
let counter = this.outgoingMessageCursor.getAndRequireEquals();
|
|
136
|
+
const stateRoot = this.stateRoot.getAndRequireEquals();
|
|
137
|
+
|
|
138
|
+
const [withdrawalModule, withdrawalStateName] =
|
|
139
|
+
BridgeContractBase.args.withdrawalStatePath;
|
|
140
|
+
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
141
|
+
|
|
142
|
+
// Count account creation fee to return later, so that the sender can fund
|
|
143
|
+
// those accounts with a separate AU
|
|
144
|
+
let accountCreationFeePaid = Field(0);
|
|
145
|
+
|
|
146
|
+
for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
|
|
147
|
+
const args = batch.arguments[i];
|
|
148
|
+
|
|
149
|
+
// Check witness
|
|
150
|
+
const path = Path.fromKey(mapPath, OutgoingMessageKey, {
|
|
151
|
+
index: counter,
|
|
152
|
+
tokenId: this.tokenId,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Process message
|
|
156
|
+
const { address, amount } = args.value;
|
|
157
|
+
const isDummy = address.equals(this.address);
|
|
158
|
+
|
|
159
|
+
args.witness
|
|
160
|
+
.checkMembership(
|
|
161
|
+
stateRoot,
|
|
162
|
+
path,
|
|
163
|
+
Poseidon.hash(Withdrawal.toFields(args.value))
|
|
164
|
+
)
|
|
165
|
+
.or(isDummy)
|
|
166
|
+
.assertTrue("Provided Withdrawal witness not valid");
|
|
167
|
+
|
|
168
|
+
const tokenAu = this.internal.mint({ address, amount });
|
|
169
|
+
const isNewAccount = tokenAu.account.isNew.getAndRequireEquals();
|
|
170
|
+
|
|
171
|
+
accountCreationFeePaid = accountCreationFeePaid.add(
|
|
172
|
+
Provable.if(isNewAccount, Field(1e9), Field(0))
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
this.outgoingMessageCursor.set(counter);
|
|
179
|
+
|
|
180
|
+
return accountCreationFeePaid;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected async redeemBase(additionUpdate: AccountUpdate) {
|
|
184
|
+
additionUpdate.body.tokenId.assertEquals(
|
|
185
|
+
this.tokenId,
|
|
186
|
+
"Tokenid not same as this bridging contract's tokenId"
|
|
187
|
+
);
|
|
188
|
+
additionUpdate.body.balanceChange.sgn
|
|
189
|
+
.isPositive()
|
|
190
|
+
.assertTrue("Sign not correct");
|
|
191
|
+
const amount = additionUpdate.body.balanceChange.magnitude;
|
|
192
|
+
|
|
193
|
+
// Burn tokens
|
|
194
|
+
this.internal.burn({
|
|
195
|
+
address: additionUpdate.publicKey,
|
|
196
|
+
amount,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Inherit from parent for custom tokens
|
|
200
|
+
additionUpdate.body.mayUseToken = {
|
|
201
|
+
inheritFromParent: this.tokenId.equals(TokenId.default).not(),
|
|
202
|
+
parentsOwnToken: Bool(false),
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// Send mina
|
|
206
|
+
this.approve(additionUpdate);
|
|
207
|
+
this.balance.subInPlace(amount);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export class BridgeContract
|
|
212
|
+
extends BridgeContractBase
|
|
213
|
+
implements BridgeContractType
|
|
214
|
+
{
|
|
215
|
+
@state(PublicKey) public settlementContractAddress = State<PublicKey>();
|
|
216
|
+
|
|
217
|
+
@state(Field) public stateRoot = State<Field>();
|
|
218
|
+
|
|
219
|
+
@state(Field) public outgoingMessageCursor = State<Field>();
|
|
220
|
+
|
|
221
|
+
@method
|
|
222
|
+
public async updateStateRoot(root: Field) {
|
|
223
|
+
return await this.updateStateRootBase(root);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@method.returns(Field)
|
|
227
|
+
public async rollupOutgoingMessages(
|
|
228
|
+
batch: OutgoingMessageArgumentBatch
|
|
229
|
+
): Promise<Field> {
|
|
230
|
+
return await this.rollupOutgoingMessagesBase(batch);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@method
|
|
234
|
+
public async redeem(additionUpdate: AccountUpdate) {
|
|
235
|
+
return await this.redeemBase(additionUpdate);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { injectable } from "tsyringe";
|
|
2
|
+
import { CompileRegistry } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { ContractModule } from "../ContractModule";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
BridgeContract,
|
|
8
|
+
BridgeContractBase,
|
|
9
|
+
BridgeContractType,
|
|
10
|
+
} from "./BridgeContract";
|
|
11
|
+
|
|
12
|
+
export type BridgeContractConfig = {
|
|
13
|
+
withdrawalStatePath: `${string}.${string}`;
|
|
14
|
+
withdrawalEventName: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
@injectable()
|
|
18
|
+
export class BridgeContractProtocolModule extends ContractModule<
|
|
19
|
+
BridgeContractType,
|
|
20
|
+
BridgeContractConfig
|
|
21
|
+
> {
|
|
22
|
+
public contractFactory() {
|
|
23
|
+
const { config } = this;
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
25
|
+
const withdrawalStatePathSplit = config.withdrawalStatePath.split(".") as [
|
|
26
|
+
string,
|
|
27
|
+
string,
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
BridgeContractBase.args = {
|
|
31
|
+
withdrawalStatePath: withdrawalStatePathSplit,
|
|
32
|
+
SettlementContract: BridgeContractBase.args?.SettlementContract,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return BridgeContract;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public async compile(registry: CompileRegistry) {
|
|
39
|
+
return {
|
|
40
|
+
BridgeContract: await registry.compile(BridgeContract),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|