@proto-kit/protocol 0.1.1-develop.651 → 0.1.1-develop.833
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +201 -201
- package/dist/blockmodules/AccountStateModule.d.ts +37 -37
- package/dist/blockmodules/AccountStateModule.js +43 -43
- package/dist/blockmodules/BlockHeightHook.d.ts +6 -6
- package/dist/blockmodules/BlockHeightHook.js +15 -15
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +7 -7
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -15
- package/dist/blockmodules/NoopBlockHook.d.ts +8 -8
- package/dist/blockmodules/NoopBlockHook.js +9 -9
- package/dist/blockmodules/NoopSettlementHook.d.ts +5 -5
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopSettlementHook.js +18 -18
- package/dist/blockmodules/NoopTransactionHook.d.ts +5 -5
- package/dist/blockmodules/NoopTransactionHook.js +4 -4
- package/dist/hooks/AccountStateHook.d.ts +19 -5
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +9 -10
- package/dist/hooks/BlockHeightHook.d.ts +2 -2
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/hooks/BlockHeightHook.js +3 -3
- package/dist/hooks/LastStateRootBlockHook.d.ts +2 -2
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -1
- package/dist/hooks/LastStateRootBlockHook.js +2 -2
- package/dist/hooks/NoopBlockHook.d.ts +3 -3
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
- package/dist/hooks/NoopBlockHook.js +2 -2
- package/dist/hooks/NoopSettlementHook.d.ts +1 -1
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -1
- package/dist/hooks/NoopSettlementHook.js +2 -3
- package/dist/hooks/NoopTransactionHook.d.ts +1 -1
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -1
- package/dist/hooks/NoopTransactionHook.js +4 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/model/MethodPublicOutput.d.ts +68 -34
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/Option.d.ts +39 -20
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +1 -0
- package/dist/model/Path.d.ts +1 -1
- package/dist/model/Path.d.ts.map +1 -1
- package/dist/model/Path.js +0 -2
- package/dist/model/StateTransition.d.ts +48 -12
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransitionProvableBatch.d.ts +71 -14
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
- package/dist/model/StateTransitionReduction.d.ts +2 -2
- package/dist/model/StateTransitionReduction.js +26 -26
- package/dist/model/network/NetworkState.d.ts +73 -18
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +2 -2
- package/dist/model/transaction/ProtocolTransaction.d.ts +69 -69
- package/dist/model/transaction/ProtocolTransaction.js +18 -18
- package/dist/model/transaction/RuntimeTransaction.d.ts +50 -16
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +4 -4
- package/dist/model/transaction/SignedTransaction.d.ts +39 -3
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -1
- package/dist/model/transaction/SignedTransaction.js +1 -1
- package/dist/model/transaction/ValueOption.d.ts +86 -32
- package/dist/model/transaction/ValueOption.d.ts.map +1 -1
- package/dist/model/transaction/ValueOption.js +1 -1
- package/dist/protocol/Protocol.d.ts +6 -5
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +12 -3
- package/dist/protocol/ProtocolEnvironment.d.ts +3 -3
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.d.ts +1 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +3 -1
- package/dist/protocol/ProvableBlockHook.d.ts +2 -2
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.d.ts +240 -98
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.d.ts +8 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +48 -40
- package/dist/prover/block/BlockTransactionPosition.d.ts +35 -35
- package/dist/prover/block/BlockTransactionPosition.js +25 -25
- package/dist/prover/block/BundleTransactionPosition.d.ts +36 -0
- package/dist/prover/block/BundleTransactionPosition.d.ts.map +1 -0
- package/dist/prover/block/BundleTransactionPosition.js +25 -0
- package/dist/prover/block/SplitPrefilledStateService.d.ts +11 -0
- package/dist/prover/block/SplitPrefilledStateService.d.ts.map +1 -0
- package/dist/prover/block/SplitPrefilledStateService.js +1 -0
- package/dist/prover/block/SplitStateService.d.ts +11 -0
- package/dist/prover/block/SplitStateService.d.ts.map +1 -0
- package/dist/prover/block/SplitStateService.js +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +35 -16
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -1
- package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/acummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +116 -58
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.d.ts +8 -8
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +17 -22
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +1 -2
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +1 -2
- package/dist/settlement/DispatchContract.d.ts +20 -0
- package/dist/settlement/DispatchContract.d.ts.map +1 -0
- package/dist/settlement/DispatchContract.js +112 -0
- package/dist/settlement/OutgoingMessageArgument.d.ts +109 -0
- package/dist/settlement/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/ProvableSettlementHook.d.ts +25 -25
- package/dist/settlement/ProvableSettlementHook.js +3 -3
- package/dist/settlement/SettlementContract.d.ts +229 -229
- package/dist/settlement/SettlementContract.js +346 -346
- package/dist/settlement/SettlementContractModule.d.ts +1 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -1
- package/dist/settlement/SettlementContractModule.js +7 -4
- package/dist/settlement/contracts/DispatchContract.d.ts +21 -0
- package/dist/settlement/contracts/DispatchContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContract.js +111 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +1 -2
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +8 -8
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -1
- package/dist/settlement/contracts/DispatchSmartContract.js +14 -14
- package/dist/settlement/contracts/SettlementContract.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContract.js +43 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -1
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +4 -4
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +18 -17
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -1
- package/dist/settlement/contracts/SettlementSmartContract.js +46 -35
- package/dist/settlement/messages/Deposit.d.ts +29 -4
- package/dist/settlement/messages/Deposit.d.ts.map +1 -1
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +94 -14
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -1
- package/dist/settlement/messages/Withdrawal.d.ts +29 -4
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -1
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +2 -2
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -1
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +1 -1
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
- package/dist/settlement/modules/NetworkStateSettlementModule.js +3 -1
- package/dist/state/State.d.ts +4 -3
- package/dist/state/State.d.ts.map +1 -1
- package/dist/state/State.js +16 -11
- package/dist/state/StateMap.d.ts +3 -3
- package/dist/state/StateMap.d.ts.map +1 -1
- package/dist/state/StateMap.js +4 -5
- package/dist/state/StateService.d.ts +3 -3
- package/dist/state/StateService.d.ts.map +1 -1
- package/dist/state/StateServiceProvider.d.ts +3 -3
- package/dist/state/StateServiceProvider.d.ts.map +1 -1
- package/dist/state/StateServiceProvider.js +1 -3
- package/dist/state/assert/assert.d.ts +1 -1
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +4 -1
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts +1 -1
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/ProtocolMethodExecutionContext.js +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +54 -3
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +4 -5
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/TransitionMethodExecutionContext.js +0 -1
- package/dist/state/context/contextExecution.d.ts +14 -0
- package/dist/state/context/contextExecution.d.ts.map +1 -0
- package/dist/state/context/contextExecution.js +30 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -1
- package/dist/state/protocol/ProtocolState.js +0 -3
- package/dist/utils/AppliedBatchHashList.d.ts +17 -0
- package/dist/utils/AppliedBatchHashList.d.ts.map +1 -0
- package/dist/utils/AppliedBatchHashList.js +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/MinaPrefixedProvableHashList.js +1 -0
- package/dist/utils/ProvableHashList.d.ts +1 -1
- package/dist/utils/StateTransitionReductionList.d.ts +1 -1
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -1
- package/dist/utils/StateTransitionReductionList.js +3 -3
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +11 -0
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +1 -0
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +12 -0
- package/dist/utils/merkletree/MerkleTreeStore.d.ts +5 -0
- package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +1 -0
- package/dist/utils/merkletree/MerkleTreeStore.js +1 -0
- package/dist/utils/merkletree/RollupMerkleTree.d.ts +133 -0
- package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +1 -0
- package/dist/utils/merkletree/RollupMerkleTree.js +255 -0
- package/dist/utils/utils.d.ts +1 -1
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +5 -10
- package/package.json +5 -5
- package/src/hooks/AccountStateHook.ts +11 -9
- package/src/hooks/BlockHeightHook.ts +3 -4
- package/src/hooks/LastStateRootBlockHook.ts +4 -4
- package/src/hooks/NoopBlockHook.ts +6 -5
- package/src/hooks/NoopSettlementHook.ts +2 -2
- package/src/hooks/NoopTransactionHook.ts +5 -1
- package/src/index.ts +0 -2
- package/src/model/MethodPublicOutput.ts +2 -2
- package/src/model/Option.ts +5 -1
- package/src/model/Path.ts +1 -3
- package/src/model/StateTransition.ts +1 -1
- package/src/model/Transaction.ts +2 -0
- package/src/model/network/NetworkState.ts +2 -2
- package/src/model/transaction/RuntimeTransaction.ts +5 -12
- package/src/model/transaction/SignedTransaction.ts +1 -8
- package/src/model/transaction/ValueOption.ts +1 -1
- package/src/protocol/Protocol.ts +24 -13
- package/src/protocol/ProtocolEnvironment.ts +7 -6
- package/src/protocol/ProtocolModule.ts +5 -2
- package/src/protocol/ProvableBlockHook.ts +3 -3
- package/src/protocol/ProvableTransactionHook.ts +4 -2
- package/src/protocol/TransitioningProtocolModule.ts +1 -1
- package/src/prover/block/BlockProvable.ts +3 -3
- package/src/prover/block/BlockProver.ts +78 -55
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +1 -1
- package/src/prover/statetransition/StateTransitionProvable.ts +3 -3
- package/src/prover/statetransition/StateTransitionProver.ts +23 -27
- package/src/settlement/ContractModule.ts +1 -1
- package/src/settlement/SettlementContractModule.ts +14 -9
- package/src/settlement/contracts/DispatchSmartContract.ts +15 -14
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +6 -4
- package/src/settlement/contracts/SettlementSmartContract.ts +55 -34
- package/src/settlement/messages/OutgoingMessageArgument.ts +1 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +3 -4
- package/src/settlement/modules/NetworkStateSettlementModule.ts +5 -2
- package/src/state/State.ts +19 -12
- package/src/state/StateMap.ts +4 -5
- package/src/state/StateService.ts +3 -3
- package/src/state/StateServiceProvider.ts +6 -7
- package/src/state/assert/assert.ts +6 -2
- package/src/state/context/RuntimeMethodExecutionContext.ts +5 -2
- package/src/state/context/TransitionMethodExecutionContext.ts +0 -1
- package/src/state/protocol/ProtocolState.ts +1 -4
- package/src/utils/MinaPrefixedProvableHashList.ts +2 -1
- package/src/utils/ProvableHashList.ts +1 -1
- package/src/utils/StateTransitionReductionList.ts +4 -3
- package/src/utils/utils.ts +4 -9
- package/test/BlockProver.test.ts +110 -128
- package/test/Protocol.test.ts +8 -20
- package/test/State.test.ts +8 -8
- package/test/StateTransition.test.ts +56 -66
- package/test/TestingProtocol.ts +48 -0
- package/test/model/Option.test.ts +72 -0
- package/{src → test}/state/assert/assert.test.ts +4 -4
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +5 -2
- package/test/utils.test.ts +0 -3
- package/dist/hooks/TransactionFeeHook.d.ts +0 -16
- package/dist/hooks/TransactionFeeHook.d.ts.map +0 -1
- package/dist/hooks/TransactionFeeHook.js +0 -39
- package/src/hooks/SequenceStateTransactionModule.ts +0 -25
- package/src/model/Option.test.ts +0 -21
- package/src/state/context/ProtocolMethodExecutionContext.ts +0 -36
- package/test/Option.test.ts +0 -64
- package/test/settlement/SettlementContract.test.ts +0 -45
- package/tsconfig.test.json +0 -9
|
@@ -1,346 +1,346 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
-
};
|
|
13
|
-
import { AccountUpdate, Bool, Field, method, Mina, Poseidon, Proof, Provable, PublicKey, Reducer, Signature, SmartContract, State, state, Struct, TokenId, UInt32, UInt64, } from "o1js";
|
|
14
|
-
import { EMPTY_PUBLICKEY, prefixToField, RollupMerkleTree, RollupMerkleTreeWitness, } from "@proto-kit/common";
|
|
15
|
-
import { inject, injectable, injectAll } from "tsyringe";
|
|
16
|
-
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
17
|
-
import { BlockProverPublicInput, BlockProverPublicOutput, } from "../prover/block/BlockProvable";
|
|
18
|
-
import { NetworkState } from "../model/network/NetworkState";
|
|
19
|
-
import { BlockHashMerkleTree } from "../prover/block/accummulators/BlockHashMerkleTree";
|
|
20
|
-
import { RuntimeTransaction } from "../model/transaction/RuntimeTransaction";
|
|
21
|
-
import { Path } from "../model/Path";
|
|
22
|
-
import { MinaActions, MinaEvents } from "../utils/MinaPrefixedProvableHashList";
|
|
23
|
-
class LazyBlockProof extends Proof {
|
|
24
|
-
}
|
|
25
|
-
LazyBlockProof.publicInputType = BlockProverPublicInput;
|
|
26
|
-
LazyBlockProof.publicOutputType = BlockProverPublicOutput;
|
|
27
|
-
LazyBlockProof.tag = () => {
|
|
28
|
-
throw new Error("Tag not initialized yet");
|
|
29
|
-
};
|
|
30
|
-
export class Deposit extends Struct({
|
|
31
|
-
address: PublicKey,
|
|
32
|
-
amount: UInt64,
|
|
33
|
-
}) {
|
|
34
|
-
}
|
|
35
|
-
export class Withdrawal extends Struct({
|
|
36
|
-
address: PublicKey,
|
|
37
|
-
amount: UInt64,
|
|
38
|
-
}) {
|
|
39
|
-
static dummy() {
|
|
40
|
-
return new Withdrawal({
|
|
41
|
-
address: EMPTY_PUBLICKEY,
|
|
42
|
-
amount: UInt64.from(0),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
47
|
-
export class OutgoingMessageArgument extends Struct({
|
|
48
|
-
witness: RollupMerkleTreeWitness,
|
|
49
|
-
value: Withdrawal,
|
|
50
|
-
}) {
|
|
51
|
-
static dummy() {
|
|
52
|
-
return new OutgoingMessageArgument({
|
|
53
|
-
witness: RollupMerkleTreeWitness.dummy(),
|
|
54
|
-
value: Withdrawal.dummy(),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export class OutgoingMessageArgumentBatch extends Struct({
|
|
59
|
-
arguments: Provable.Array(OutgoingMessageArgument, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
60
|
-
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
61
|
-
}) {
|
|
62
|
-
static fromMessages(providedArguments) {
|
|
63
|
-
const batch = providedArguments.slice();
|
|
64
|
-
const isDummys = batch.map(() => Bool(false));
|
|
65
|
-
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
66
|
-
batch.push(OutgoingMessageArgument.dummy());
|
|
67
|
-
isDummys.push(Bool(true));
|
|
68
|
-
}
|
|
69
|
-
return new OutgoingMessageArgumentBatch({
|
|
70
|
-
arguments: batch,
|
|
71
|
-
isDummys,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Some random prefix for the sequencer signature
|
|
76
|
-
export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
|
|
77
|
-
export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
|
|
78
|
-
export class SettlementContract extends SmartContract {
|
|
79
|
-
constructor(address, methodIdMappings, hooks, withdrawalStatePath, incomingMessagesPaths,
|
|
80
|
-
// 24 hours
|
|
81
|
-
escapeHatchSlotsInterval = (60 / 3) * 24) {
|
|
82
|
-
super(address);
|
|
83
|
-
this.methodIdMappings = methodIdMappings;
|
|
84
|
-
this.hooks = hooks;
|
|
85
|
-
this.withdrawalStatePath = withdrawalStatePath;
|
|
86
|
-
this.incomingMessagesPaths = incomingMessagesPaths;
|
|
87
|
-
this.escapeHatchSlotsInterval = escapeHatchSlotsInterval;
|
|
88
|
-
this.sequencerKey = State();
|
|
89
|
-
this.lastSettlementL1Block = State();
|
|
90
|
-
this.stateRoot = State();
|
|
91
|
-
this.networkStateHash = State();
|
|
92
|
-
this.blockHashRoot = State();
|
|
93
|
-
this.promisedMessagesHash = State();
|
|
94
|
-
this.honoredMessagesHash = State();
|
|
95
|
-
this.outgoingMessageCursor = State();
|
|
96
|
-
}
|
|
97
|
-
initialize(sequencer) {
|
|
98
|
-
this.sequencerKey.getAndAssertEquals().assertEquals(Field(0));
|
|
99
|
-
this.stateRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
100
|
-
this.blockHashRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
101
|
-
this.networkStateHash.getAndAssertEquals().assertEquals(Field(0));
|
|
102
|
-
this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
103
|
-
this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
104
|
-
this.sequencerKey.set(sequencer.x);
|
|
105
|
-
this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
|
|
106
|
-
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
|
|
107
|
-
this.networkStateHash.set(NetworkState.empty().hash());
|
|
108
|
-
this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
109
|
-
this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
110
|
-
}
|
|
111
|
-
settle(blockProof, signature, publicKey, inputNetworkState, outputNetworkState, newPromisedMessagesHash) {
|
|
112
|
-
// Verify the blockproof
|
|
113
|
-
blockProof.verify();
|
|
114
|
-
// Get and assert on-chain values
|
|
115
|
-
const stateRoot = this.stateRoot.getAndAssertEquals();
|
|
116
|
-
const networkStateHash = this.networkStateHash.getAndAssertEquals();
|
|
117
|
-
const blockHashRoot = this.blockHashRoot.getAndAssertEquals();
|
|
118
|
-
const sequencerKey = this.sequencerKey.getAndAssertEquals();
|
|
119
|
-
const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
|
|
120
|
-
const honoredMessagesHash = this.honoredMessagesHash.getAndAssertEquals();
|
|
121
|
-
const lastSettlementL1Block = this.lastSettlementL1Block.getAndAssertEquals();
|
|
122
|
-
// Get block height and use the lower bound for all ops
|
|
123
|
-
const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
|
|
124
|
-
this.network.globalSlotSinceGenesis.assertBetween(minBlockIncluded, minBlockIncluded.add(20));
|
|
125
|
-
// Check signature/escape catch
|
|
126
|
-
publicKey.x.assertEquals(sequencerKey, "Sequencer public key witness not matching");
|
|
127
|
-
const signatureValid = signature.verify(publicKey, [
|
|
128
|
-
BATCH_SIGNATURE_PREFIX,
|
|
129
|
-
lastSettlementL1Block.value,
|
|
130
|
-
]);
|
|
131
|
-
const escapeHatchActivated = lastSettlementL1Block
|
|
132
|
-
.add(UInt32.from(this.escapeHatchSlotsInterval))
|
|
133
|
-
.lessThan(minBlockIncluded);
|
|
134
|
-
signatureValid
|
|
135
|
-
.or(escapeHatchActivated)
|
|
136
|
-
.assertTrue("Sequencer signature not valid and escape hatch not activated");
|
|
137
|
-
// Assert correctness of networkState witness
|
|
138
|
-
inputNetworkState
|
|
139
|
-
.hash()
|
|
140
|
-
.assertEquals(networkStateHash, "InputNetworkState witness not valid");
|
|
141
|
-
outputNetworkState
|
|
142
|
-
.hash()
|
|
143
|
-
.assertEquals(blockProof.publicOutput.networkStateHash, "OutputNetworkState witness not valid");
|
|
144
|
-
blockProof.publicOutput.closed.assertEquals(Bool(true), "Supplied proof is not a closed BlockProof");
|
|
145
|
-
// Execute onSettlementHooks for additional checks
|
|
146
|
-
const stateRecord = {
|
|
147
|
-
blockHashRoot,
|
|
148
|
-
stateRoot,
|
|
149
|
-
networkStateHash,
|
|
150
|
-
honoredMessagesHash,
|
|
151
|
-
lastSettlementL1Block,
|
|
152
|
-
promisedMessagesHash,
|
|
153
|
-
sequencerKey,
|
|
154
|
-
};
|
|
155
|
-
const inputs = {
|
|
156
|
-
blockProof,
|
|
157
|
-
contractState: stateRecord,
|
|
158
|
-
newPromisedMessagesHash,
|
|
159
|
-
fromNetworkState: inputNetworkState,
|
|
160
|
-
toNetworkState: outputNetworkState,
|
|
161
|
-
currentL1Block: minBlockIncluded,
|
|
162
|
-
};
|
|
163
|
-
this.hooks.forEach((hook) => {
|
|
164
|
-
hook.beforeSettlement(this, inputs);
|
|
165
|
-
});
|
|
166
|
-
// Apply blockProof
|
|
167
|
-
stateRoot.assertEquals(blockProof.publicInput.stateRoot, "Input state root not matching");
|
|
168
|
-
networkStateHash.assertEquals(blockProof.publicInput.networkStateHash, "Input networkStateHash not matching");
|
|
169
|
-
blockHashRoot.assertEquals(blockProof.publicInput.blockHashRoot, "Input blockHashRoot not matching");
|
|
170
|
-
this.stateRoot.set(blockProof.publicOutput.stateRoot);
|
|
171
|
-
this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
|
|
172
|
-
this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
|
|
173
|
-
// Assert and apply deposit commitments
|
|
174
|
-
promisedMessagesHash.assertEquals(blockProof.publicOutput.incomingMessagesHash, "Promised messages not honored");
|
|
175
|
-
this.honoredMessagesHash.set(promisedMessagesHash);
|
|
176
|
-
// Assert and apply new promisedMessagesHash
|
|
177
|
-
this.self.account.actionState.assertEquals(newPromisedMessagesHash);
|
|
178
|
-
this.promisedMessagesHash.set(newPromisedMessagesHash);
|
|
179
|
-
this.lastSettlementL1Block.set(minBlockIncluded);
|
|
180
|
-
}
|
|
181
|
-
dispatchMessage(methodId, value, valueType) {
|
|
182
|
-
const args = valueType.toFields(value);
|
|
183
|
-
// Should be the same as RuntimeTransaction.hash
|
|
184
|
-
const argsHash = Poseidon.hash(args);
|
|
185
|
-
const runtimeTransaction = RuntimeTransaction.fromMessage({
|
|
186
|
-
methodId,
|
|
187
|
-
argsHash,
|
|
188
|
-
});
|
|
189
|
-
// Append tx to incomingMessagesHash
|
|
190
|
-
const actionData = runtimeTransaction.hashData();
|
|
191
|
-
const actionHash = MinaActions.actionHash(actionData);
|
|
192
|
-
this.self.body.actions = {
|
|
193
|
-
hash: actionHash,
|
|
194
|
-
data: [actionData],
|
|
195
|
-
};
|
|
196
|
-
const eventHash = MinaEvents.eventHash(args);
|
|
197
|
-
this.self.body.events = {
|
|
198
|
-
hash: eventHash,
|
|
199
|
-
data: [args],
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
deposit(amount) {
|
|
203
|
-
// Save this, since otherwise it would be a second witness later,
|
|
204
|
-
// which could be a different values than the first
|
|
205
|
-
const sender = this.sender;
|
|
206
|
-
// Credit the amount to the bridge contract
|
|
207
|
-
this.self.balance.addInPlace(amount);
|
|
208
|
-
const action = new Deposit({
|
|
209
|
-
address: sender,
|
|
210
|
-
amount,
|
|
211
|
-
});
|
|
212
|
-
const methodId = Field(this.methodIdMappings[this.incomingMessagesPaths["deposit"]]);
|
|
213
|
-
this.dispatchMessage(methodId.toConstant(), action, Deposit);
|
|
214
|
-
}
|
|
215
|
-
rollupOutgoingMessages(batch) {
|
|
216
|
-
let counter = this.outgoingMessageCursor.getAndAssertEquals();
|
|
217
|
-
const stateRoot = this.stateRoot.getAndAssertEquals();
|
|
218
|
-
const [withdrawalModule, withdrawalStateName] = this.withdrawalStatePath;
|
|
219
|
-
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
220
|
-
let accountCreationFeePaid = Field(0);
|
|
221
|
-
for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
|
|
222
|
-
const args = batch.arguments[i];
|
|
223
|
-
// Check witness
|
|
224
|
-
const path = Path.fromKey(mapPath, Field, counter);
|
|
225
|
-
args.witness
|
|
226
|
-
.checkMembership(stateRoot, path, Poseidon.hash(Withdrawal.toFields(args.value)))
|
|
227
|
-
.assertTrue("Provided Withdrawal witness not valid");
|
|
228
|
-
// Process message
|
|
229
|
-
const { address, amount } = args.value;
|
|
230
|
-
const isDummy = address.equals(this.address);
|
|
231
|
-
const tokenAu = this.token.mint({ address, amount });
|
|
232
|
-
const isNewAccount = tokenAu.account.isNew.getAndAssertEquals();
|
|
233
|
-
tokenAu.body.balanceChange.magnitude =
|
|
234
|
-
tokenAu.body.balanceChange.magnitude.sub(Provable.if(isNewAccount, Mina.accountCreationFee().toConstant(), UInt64.zero));
|
|
235
|
-
accountCreationFeePaid = accountCreationFeePaid.add(Provable.if(isNewAccount, Field(1e9), Field(0)));
|
|
236
|
-
counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
|
|
237
|
-
}
|
|
238
|
-
this.balance.subInPlace(UInt64.from(accountCreationFeePaid));
|
|
239
|
-
this.outgoingMessageCursor.set(counter);
|
|
240
|
-
}
|
|
241
|
-
redeem(additionUpdate) {
|
|
242
|
-
additionUpdate.body.tokenId.assertEquals(TokenId.default, "Tokenid not default token");
|
|
243
|
-
additionUpdate.body.balanceChange.sgn
|
|
244
|
-
.isPositive()
|
|
245
|
-
.assertTrue("Sign not correct");
|
|
246
|
-
const amount = additionUpdate.body.balanceChange.magnitude;
|
|
247
|
-
// Burn tokens
|
|
248
|
-
this.token.burn({
|
|
249
|
-
address: additionUpdate.publicKey,
|
|
250
|
-
amount,
|
|
251
|
-
});
|
|
252
|
-
// Send mina
|
|
253
|
-
this.approve(additionUpdate);
|
|
254
|
-
this.balance.subInPlace(amount);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
__decorate([
|
|
258
|
-
state(Field),
|
|
259
|
-
__metadata("design:type", Object)
|
|
260
|
-
], SettlementContract.prototype, "sequencerKey", void 0);
|
|
261
|
-
__decorate([
|
|
262
|
-
state(UInt32),
|
|
263
|
-
__metadata("design:type", Object)
|
|
264
|
-
], SettlementContract.prototype, "lastSettlementL1Block", void 0);
|
|
265
|
-
__decorate([
|
|
266
|
-
state(Field),
|
|
267
|
-
__metadata("design:type", Object)
|
|
268
|
-
], SettlementContract.prototype, "stateRoot", void 0);
|
|
269
|
-
__decorate([
|
|
270
|
-
state(Field),
|
|
271
|
-
__metadata("design:type", Object)
|
|
272
|
-
], SettlementContract.prototype, "networkStateHash", void 0);
|
|
273
|
-
__decorate([
|
|
274
|
-
state(Field),
|
|
275
|
-
__metadata("design:type", Object)
|
|
276
|
-
], SettlementContract.prototype, "blockHashRoot", void 0);
|
|
277
|
-
__decorate([
|
|
278
|
-
state(Field),
|
|
279
|
-
__metadata("design:type", Object)
|
|
280
|
-
], SettlementContract.prototype, "promisedMessagesHash", void 0);
|
|
281
|
-
__decorate([
|
|
282
|
-
state(Field),
|
|
283
|
-
__metadata("design:type", Object)
|
|
284
|
-
], SettlementContract.prototype, "honoredMessagesHash", void 0);
|
|
285
|
-
__decorate([
|
|
286
|
-
state(Field),
|
|
287
|
-
__metadata("design:type", Object)
|
|
288
|
-
], SettlementContract.prototype, "outgoingMessageCursor", void 0);
|
|
289
|
-
__decorate([
|
|
290
|
-
method,
|
|
291
|
-
__metadata("design:type", Function),
|
|
292
|
-
__metadata("design:paramtypes", [PublicKey]),
|
|
293
|
-
__metadata("design:returntype", void 0)
|
|
294
|
-
], SettlementContract.prototype, "initialize", null);
|
|
295
|
-
__decorate([
|
|
296
|
-
method,
|
|
297
|
-
__metadata("design:type", Function),
|
|
298
|
-
__metadata("design:paramtypes", [LazyBlockProof,
|
|
299
|
-
Signature,
|
|
300
|
-
PublicKey,
|
|
301
|
-
NetworkState,
|
|
302
|
-
NetworkState,
|
|
303
|
-
Field]),
|
|
304
|
-
__metadata("design:returntype", void 0)
|
|
305
|
-
], SettlementContract.prototype, "settle", null);
|
|
306
|
-
__decorate([
|
|
307
|
-
method,
|
|
308
|
-
__metadata("design:type", Function),
|
|
309
|
-
__metadata("design:paramtypes", [UInt64]),
|
|
310
|
-
__metadata("design:returntype", void 0)
|
|
311
|
-
], SettlementContract.prototype, "deposit", null);
|
|
312
|
-
__decorate([
|
|
313
|
-
method,
|
|
314
|
-
__metadata("design:type", Function),
|
|
315
|
-
__metadata("design:paramtypes", [OutgoingMessageArgumentBatch]),
|
|
316
|
-
__metadata("design:returntype", void 0)
|
|
317
|
-
], SettlementContract.prototype, "rollupOutgoingMessages", null);
|
|
318
|
-
__decorate([
|
|
319
|
-
method,
|
|
320
|
-
__metadata("design:type", Function),
|
|
321
|
-
__metadata("design:paramtypes", [AccountUpdate]),
|
|
322
|
-
__metadata("design:returntype", void 0)
|
|
323
|
-
], SettlementContract.prototype, "redeem", null);
|
|
324
|
-
let SettlementContractModule = class SettlementContractModule extends ProtocolModule {
|
|
325
|
-
constructor(hooks, blockProver) {
|
|
326
|
-
super();
|
|
327
|
-
this.hooks = hooks;
|
|
328
|
-
this.blockProver = blockProver;
|
|
329
|
-
LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
|
|
330
|
-
}
|
|
331
|
-
getContractClass() {
|
|
332
|
-
return SettlementContract;
|
|
333
|
-
}
|
|
334
|
-
createContract(address, methodIdMappings) {
|
|
335
|
-
// We know that this returns [string, string], but TS can't infer that
|
|
336
|
-
const withdrawalPath = this.config.withdrawalStatePath.split(".");
|
|
337
|
-
return new SettlementContract(address, methodIdMappings, this.hooks, [withdrawalPath[0], withdrawalPath[1]], this.config.incomingMessagesMethods);
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
SettlementContractModule = __decorate([
|
|
341
|
-
injectable(),
|
|
342
|
-
__param(0, injectAll("ProvableSettlementHook")),
|
|
343
|
-
__param(1, inject("BlockProver")),
|
|
344
|
-
__metadata("design:paramtypes", [Array, Object])
|
|
345
|
-
], SettlementContractModule);
|
|
346
|
-
export { SettlementContractModule };
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { AccountUpdate, Bool, Field, method, Mina, Poseidon, Proof, Provable, PublicKey, Reducer, Signature, SmartContract, State, state, Struct, TokenId, UInt32, UInt64, } from "o1js";
|
|
14
|
+
import { EMPTY_PUBLICKEY, prefixToField, RollupMerkleTree, RollupMerkleTreeWitness, } from "@proto-kit/common";
|
|
15
|
+
import { inject, injectable, injectAll } from "tsyringe";
|
|
16
|
+
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
17
|
+
import { BlockProverPublicInput, BlockProverPublicOutput, } from "../prover/block/BlockProvable";
|
|
18
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
19
|
+
import { BlockHashMerkleTree } from "../prover/block/accummulators/BlockHashMerkleTree";
|
|
20
|
+
import { RuntimeTransaction } from "../model/transaction/RuntimeTransaction";
|
|
21
|
+
import { Path } from "../model/Path";
|
|
22
|
+
import { MinaActions, MinaEvents } from "../utils/MinaPrefixedProvableHashList";
|
|
23
|
+
class LazyBlockProof extends Proof {
|
|
24
|
+
}
|
|
25
|
+
LazyBlockProof.publicInputType = BlockProverPublicInput;
|
|
26
|
+
LazyBlockProof.publicOutputType = BlockProverPublicOutput;
|
|
27
|
+
LazyBlockProof.tag = () => {
|
|
28
|
+
throw new Error("Tag not initialized yet");
|
|
29
|
+
};
|
|
30
|
+
export class Deposit extends Struct({
|
|
31
|
+
address: PublicKey,
|
|
32
|
+
amount: UInt64,
|
|
33
|
+
}) {
|
|
34
|
+
}
|
|
35
|
+
export class Withdrawal extends Struct({
|
|
36
|
+
address: PublicKey,
|
|
37
|
+
amount: UInt64,
|
|
38
|
+
}) {
|
|
39
|
+
static dummy() {
|
|
40
|
+
return new Withdrawal({
|
|
41
|
+
address: EMPTY_PUBLICKEY,
|
|
42
|
+
amount: UInt64.from(0),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
47
|
+
export class OutgoingMessageArgument extends Struct({
|
|
48
|
+
witness: RollupMerkleTreeWitness,
|
|
49
|
+
value: Withdrawal,
|
|
50
|
+
}) {
|
|
51
|
+
static dummy() {
|
|
52
|
+
return new OutgoingMessageArgument({
|
|
53
|
+
witness: RollupMerkleTreeWitness.dummy(),
|
|
54
|
+
value: Withdrawal.dummy(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class OutgoingMessageArgumentBatch extends Struct({
|
|
59
|
+
arguments: Provable.Array(OutgoingMessageArgument, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
60
|
+
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
61
|
+
}) {
|
|
62
|
+
static fromMessages(providedArguments) {
|
|
63
|
+
const batch = providedArguments.slice();
|
|
64
|
+
const isDummys = batch.map(() => Bool(false));
|
|
65
|
+
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
66
|
+
batch.push(OutgoingMessageArgument.dummy());
|
|
67
|
+
isDummys.push(Bool(true));
|
|
68
|
+
}
|
|
69
|
+
return new OutgoingMessageArgumentBatch({
|
|
70
|
+
arguments: batch,
|
|
71
|
+
isDummys,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Some random prefix for the sequencer signature
|
|
76
|
+
export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
|
|
77
|
+
export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
|
|
78
|
+
export class SettlementContract extends SmartContract {
|
|
79
|
+
constructor(address, methodIdMappings, hooks, withdrawalStatePath, incomingMessagesPaths,
|
|
80
|
+
// 24 hours
|
|
81
|
+
escapeHatchSlotsInterval = (60 / 3) * 24) {
|
|
82
|
+
super(address);
|
|
83
|
+
this.methodIdMappings = methodIdMappings;
|
|
84
|
+
this.hooks = hooks;
|
|
85
|
+
this.withdrawalStatePath = withdrawalStatePath;
|
|
86
|
+
this.incomingMessagesPaths = incomingMessagesPaths;
|
|
87
|
+
this.escapeHatchSlotsInterval = escapeHatchSlotsInterval;
|
|
88
|
+
this.sequencerKey = State();
|
|
89
|
+
this.lastSettlementL1Block = State();
|
|
90
|
+
this.stateRoot = State();
|
|
91
|
+
this.networkStateHash = State();
|
|
92
|
+
this.blockHashRoot = State();
|
|
93
|
+
this.promisedMessagesHash = State();
|
|
94
|
+
this.honoredMessagesHash = State();
|
|
95
|
+
this.outgoingMessageCursor = State();
|
|
96
|
+
}
|
|
97
|
+
initialize(sequencer) {
|
|
98
|
+
this.sequencerKey.getAndAssertEquals().assertEquals(Field(0));
|
|
99
|
+
this.stateRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
100
|
+
this.blockHashRoot.getAndAssertEquals().assertEquals(Field(0));
|
|
101
|
+
this.networkStateHash.getAndAssertEquals().assertEquals(Field(0));
|
|
102
|
+
this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
103
|
+
this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
104
|
+
this.sequencerKey.set(sequencer.x);
|
|
105
|
+
this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
|
|
106
|
+
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
|
|
107
|
+
this.networkStateHash.set(NetworkState.empty().hash());
|
|
108
|
+
this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
109
|
+
this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
110
|
+
}
|
|
111
|
+
settle(blockProof, signature, publicKey, inputNetworkState, outputNetworkState, newPromisedMessagesHash) {
|
|
112
|
+
// Verify the blockproof
|
|
113
|
+
blockProof.verify();
|
|
114
|
+
// Get and assert on-chain values
|
|
115
|
+
const stateRoot = this.stateRoot.getAndAssertEquals();
|
|
116
|
+
const networkStateHash = this.networkStateHash.getAndAssertEquals();
|
|
117
|
+
const blockHashRoot = this.blockHashRoot.getAndAssertEquals();
|
|
118
|
+
const sequencerKey = this.sequencerKey.getAndAssertEquals();
|
|
119
|
+
const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
|
|
120
|
+
const honoredMessagesHash = this.honoredMessagesHash.getAndAssertEquals();
|
|
121
|
+
const lastSettlementL1Block = this.lastSettlementL1Block.getAndAssertEquals();
|
|
122
|
+
// Get block height and use the lower bound for all ops
|
|
123
|
+
const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
|
|
124
|
+
this.network.globalSlotSinceGenesis.assertBetween(minBlockIncluded, minBlockIncluded.add(20));
|
|
125
|
+
// Check signature/escape catch
|
|
126
|
+
publicKey.x.assertEquals(sequencerKey, "Sequencer public key witness not matching");
|
|
127
|
+
const signatureValid = signature.verify(publicKey, [
|
|
128
|
+
BATCH_SIGNATURE_PREFIX,
|
|
129
|
+
lastSettlementL1Block.value,
|
|
130
|
+
]);
|
|
131
|
+
const escapeHatchActivated = lastSettlementL1Block
|
|
132
|
+
.add(UInt32.from(this.escapeHatchSlotsInterval))
|
|
133
|
+
.lessThan(minBlockIncluded);
|
|
134
|
+
signatureValid
|
|
135
|
+
.or(escapeHatchActivated)
|
|
136
|
+
.assertTrue("Sequencer signature not valid and escape hatch not activated");
|
|
137
|
+
// Assert correctness of networkState witness
|
|
138
|
+
inputNetworkState
|
|
139
|
+
.hash()
|
|
140
|
+
.assertEquals(networkStateHash, "InputNetworkState witness not valid");
|
|
141
|
+
outputNetworkState
|
|
142
|
+
.hash()
|
|
143
|
+
.assertEquals(blockProof.publicOutput.networkStateHash, "OutputNetworkState witness not valid");
|
|
144
|
+
blockProof.publicOutput.closed.assertEquals(Bool(true), "Supplied proof is not a closed BlockProof");
|
|
145
|
+
// Execute onSettlementHooks for additional checks
|
|
146
|
+
const stateRecord = {
|
|
147
|
+
blockHashRoot,
|
|
148
|
+
stateRoot,
|
|
149
|
+
networkStateHash,
|
|
150
|
+
honoredMessagesHash,
|
|
151
|
+
lastSettlementL1Block,
|
|
152
|
+
promisedMessagesHash,
|
|
153
|
+
sequencerKey,
|
|
154
|
+
};
|
|
155
|
+
const inputs = {
|
|
156
|
+
blockProof,
|
|
157
|
+
contractState: stateRecord,
|
|
158
|
+
newPromisedMessagesHash,
|
|
159
|
+
fromNetworkState: inputNetworkState,
|
|
160
|
+
toNetworkState: outputNetworkState,
|
|
161
|
+
currentL1Block: minBlockIncluded,
|
|
162
|
+
};
|
|
163
|
+
this.hooks.forEach((hook) => {
|
|
164
|
+
hook.beforeSettlement(this, inputs);
|
|
165
|
+
});
|
|
166
|
+
// Apply blockProof
|
|
167
|
+
stateRoot.assertEquals(blockProof.publicInput.stateRoot, "Input state root not matching");
|
|
168
|
+
networkStateHash.assertEquals(blockProof.publicInput.networkStateHash, "Input networkStateHash not matching");
|
|
169
|
+
blockHashRoot.assertEquals(blockProof.publicInput.blockHashRoot, "Input blockHashRoot not matching");
|
|
170
|
+
this.stateRoot.set(blockProof.publicOutput.stateRoot);
|
|
171
|
+
this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
|
|
172
|
+
this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
|
|
173
|
+
// Assert and apply deposit commitments
|
|
174
|
+
promisedMessagesHash.assertEquals(blockProof.publicOutput.incomingMessagesHash, "Promised messages not honored");
|
|
175
|
+
this.honoredMessagesHash.set(promisedMessagesHash);
|
|
176
|
+
// Assert and apply new promisedMessagesHash
|
|
177
|
+
this.self.account.actionState.assertEquals(newPromisedMessagesHash);
|
|
178
|
+
this.promisedMessagesHash.set(newPromisedMessagesHash);
|
|
179
|
+
this.lastSettlementL1Block.set(minBlockIncluded);
|
|
180
|
+
}
|
|
181
|
+
dispatchMessage(methodId, value, valueType) {
|
|
182
|
+
const args = valueType.toFields(value);
|
|
183
|
+
// Should be the same as RuntimeTransaction.hash
|
|
184
|
+
const argsHash = Poseidon.hash(args);
|
|
185
|
+
const runtimeTransaction = RuntimeTransaction.fromMessage({
|
|
186
|
+
methodId,
|
|
187
|
+
argsHash,
|
|
188
|
+
});
|
|
189
|
+
// Append tx to incomingMessagesHash
|
|
190
|
+
const actionData = runtimeTransaction.hashData();
|
|
191
|
+
const actionHash = MinaActions.actionHash(actionData);
|
|
192
|
+
this.self.body.actions = {
|
|
193
|
+
hash: actionHash,
|
|
194
|
+
data: [actionData],
|
|
195
|
+
};
|
|
196
|
+
const eventHash = MinaEvents.eventHash(args);
|
|
197
|
+
this.self.body.events = {
|
|
198
|
+
hash: eventHash,
|
|
199
|
+
data: [args],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
deposit(amount) {
|
|
203
|
+
// Save this, since otherwise it would be a second witness later,
|
|
204
|
+
// which could be a different values than the first
|
|
205
|
+
const sender = this.sender;
|
|
206
|
+
// Credit the amount to the bridge contract
|
|
207
|
+
this.self.balance.addInPlace(amount);
|
|
208
|
+
const action = new Deposit({
|
|
209
|
+
address: sender,
|
|
210
|
+
amount,
|
|
211
|
+
});
|
|
212
|
+
const methodId = Field(this.methodIdMappings[this.incomingMessagesPaths["deposit"]]);
|
|
213
|
+
this.dispatchMessage(methodId.toConstant(), action, Deposit);
|
|
214
|
+
}
|
|
215
|
+
rollupOutgoingMessages(batch) {
|
|
216
|
+
let counter = this.outgoingMessageCursor.getAndAssertEquals();
|
|
217
|
+
const stateRoot = this.stateRoot.getAndAssertEquals();
|
|
218
|
+
const [withdrawalModule, withdrawalStateName] = this.withdrawalStatePath;
|
|
219
|
+
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
220
|
+
let accountCreationFeePaid = Field(0);
|
|
221
|
+
for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
|
|
222
|
+
const args = batch.arguments[i];
|
|
223
|
+
// Check witness
|
|
224
|
+
const path = Path.fromKey(mapPath, Field, counter);
|
|
225
|
+
args.witness
|
|
226
|
+
.checkMembership(stateRoot, path, Poseidon.hash(Withdrawal.toFields(args.value)))
|
|
227
|
+
.assertTrue("Provided Withdrawal witness not valid");
|
|
228
|
+
// Process message
|
|
229
|
+
const { address, amount } = args.value;
|
|
230
|
+
const isDummy = address.equals(this.address);
|
|
231
|
+
const tokenAu = this.token.mint({ address, amount });
|
|
232
|
+
const isNewAccount = tokenAu.account.isNew.getAndAssertEquals();
|
|
233
|
+
tokenAu.body.balanceChange.magnitude =
|
|
234
|
+
tokenAu.body.balanceChange.magnitude.sub(Provable.if(isNewAccount, Mina.accountCreationFee().toConstant(), UInt64.zero));
|
|
235
|
+
accountCreationFeePaid = accountCreationFeePaid.add(Provable.if(isNewAccount, Field(1e9), Field(0)));
|
|
236
|
+
counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
|
|
237
|
+
}
|
|
238
|
+
this.balance.subInPlace(UInt64.from(accountCreationFeePaid));
|
|
239
|
+
this.outgoingMessageCursor.set(counter);
|
|
240
|
+
}
|
|
241
|
+
redeem(additionUpdate) {
|
|
242
|
+
additionUpdate.body.tokenId.assertEquals(TokenId.default, "Tokenid not default token");
|
|
243
|
+
additionUpdate.body.balanceChange.sgn
|
|
244
|
+
.isPositive()
|
|
245
|
+
.assertTrue("Sign not correct");
|
|
246
|
+
const amount = additionUpdate.body.balanceChange.magnitude;
|
|
247
|
+
// Burn tokens
|
|
248
|
+
this.token.burn({
|
|
249
|
+
address: additionUpdate.publicKey,
|
|
250
|
+
amount,
|
|
251
|
+
});
|
|
252
|
+
// Send mina
|
|
253
|
+
this.approve(additionUpdate);
|
|
254
|
+
this.balance.subInPlace(amount);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
__decorate([
|
|
258
|
+
state(Field),
|
|
259
|
+
__metadata("design:type", Object)
|
|
260
|
+
], SettlementContract.prototype, "sequencerKey", void 0);
|
|
261
|
+
__decorate([
|
|
262
|
+
state(UInt32),
|
|
263
|
+
__metadata("design:type", Object)
|
|
264
|
+
], SettlementContract.prototype, "lastSettlementL1Block", void 0);
|
|
265
|
+
__decorate([
|
|
266
|
+
state(Field),
|
|
267
|
+
__metadata("design:type", Object)
|
|
268
|
+
], SettlementContract.prototype, "stateRoot", void 0);
|
|
269
|
+
__decorate([
|
|
270
|
+
state(Field),
|
|
271
|
+
__metadata("design:type", Object)
|
|
272
|
+
], SettlementContract.prototype, "networkStateHash", void 0);
|
|
273
|
+
__decorate([
|
|
274
|
+
state(Field),
|
|
275
|
+
__metadata("design:type", Object)
|
|
276
|
+
], SettlementContract.prototype, "blockHashRoot", void 0);
|
|
277
|
+
__decorate([
|
|
278
|
+
state(Field),
|
|
279
|
+
__metadata("design:type", Object)
|
|
280
|
+
], SettlementContract.prototype, "promisedMessagesHash", void 0);
|
|
281
|
+
__decorate([
|
|
282
|
+
state(Field),
|
|
283
|
+
__metadata("design:type", Object)
|
|
284
|
+
], SettlementContract.prototype, "honoredMessagesHash", void 0);
|
|
285
|
+
__decorate([
|
|
286
|
+
state(Field),
|
|
287
|
+
__metadata("design:type", Object)
|
|
288
|
+
], SettlementContract.prototype, "outgoingMessageCursor", void 0);
|
|
289
|
+
__decorate([
|
|
290
|
+
method,
|
|
291
|
+
__metadata("design:type", Function),
|
|
292
|
+
__metadata("design:paramtypes", [PublicKey]),
|
|
293
|
+
__metadata("design:returntype", void 0)
|
|
294
|
+
], SettlementContract.prototype, "initialize", null);
|
|
295
|
+
__decorate([
|
|
296
|
+
method,
|
|
297
|
+
__metadata("design:type", Function),
|
|
298
|
+
__metadata("design:paramtypes", [LazyBlockProof,
|
|
299
|
+
Signature,
|
|
300
|
+
PublicKey,
|
|
301
|
+
NetworkState,
|
|
302
|
+
NetworkState,
|
|
303
|
+
Field]),
|
|
304
|
+
__metadata("design:returntype", void 0)
|
|
305
|
+
], SettlementContract.prototype, "settle", null);
|
|
306
|
+
__decorate([
|
|
307
|
+
method,
|
|
308
|
+
__metadata("design:type", Function),
|
|
309
|
+
__metadata("design:paramtypes", [UInt64]),
|
|
310
|
+
__metadata("design:returntype", void 0)
|
|
311
|
+
], SettlementContract.prototype, "deposit", null);
|
|
312
|
+
__decorate([
|
|
313
|
+
method,
|
|
314
|
+
__metadata("design:type", Function),
|
|
315
|
+
__metadata("design:paramtypes", [OutgoingMessageArgumentBatch]),
|
|
316
|
+
__metadata("design:returntype", void 0)
|
|
317
|
+
], SettlementContract.prototype, "rollupOutgoingMessages", null);
|
|
318
|
+
__decorate([
|
|
319
|
+
method,
|
|
320
|
+
__metadata("design:type", Function),
|
|
321
|
+
__metadata("design:paramtypes", [AccountUpdate]),
|
|
322
|
+
__metadata("design:returntype", void 0)
|
|
323
|
+
], SettlementContract.prototype, "redeem", null);
|
|
324
|
+
let SettlementContractModule = class SettlementContractModule extends ProtocolModule {
|
|
325
|
+
constructor(hooks, blockProver) {
|
|
326
|
+
super();
|
|
327
|
+
this.hooks = hooks;
|
|
328
|
+
this.blockProver = blockProver;
|
|
329
|
+
LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
|
|
330
|
+
}
|
|
331
|
+
getContractClass() {
|
|
332
|
+
return SettlementContract;
|
|
333
|
+
}
|
|
334
|
+
createContract(address, methodIdMappings) {
|
|
335
|
+
// We know that this returns [string, string], but TS can't infer that
|
|
336
|
+
const withdrawalPath = this.config.withdrawalStatePath.split(".");
|
|
337
|
+
return new SettlementContract(address, methodIdMappings, this.hooks, [withdrawalPath[0], withdrawalPath[1]], this.config.incomingMessagesMethods);
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
SettlementContractModule = __decorate([
|
|
341
|
+
injectable(),
|
|
342
|
+
__param(0, injectAll("ProvableSettlementHook")),
|
|
343
|
+
__param(1, inject("BlockProver")),
|
|
344
|
+
__metadata("design:paramtypes", [Array, Object])
|
|
345
|
+
], SettlementContractModule);
|
|
346
|
+
export { SettlementContractModule };
|