@proto-kit/protocol 0.1.1-develop.456 → 0.1.1-develop.600
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/blockmodules/AccountStateModule.d.ts.map +1 -1
- package/dist/blockmodules/AccountStateModule.js +10 -3
- package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
- package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
- package/dist/blockmodules/BlockHeightHook.js +5 -6
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
- package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
- package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
- package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopBlockHook.js +4 -4
- package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
- package/dist/blockmodules/NoopSettlementHook.js +18 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +7 -2
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/model/MethodPublicOutput.d.ts +8 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/MethodPublicOutput.js +1 -0
- package/dist/model/network/NetworkState.d.ts +40 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +14 -2
- package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +68 -11
- package/dist/model/transaction/SignedTransaction.d.ts +71 -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 +119 -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 +7 -3
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +26 -16
- package/dist/protocol/ProvableBlockHook.d.ts +2 -10
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableBlockHook.js +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.js +3 -2
- package/dist/prover/block/BlockProvable.d.ts +106 -28
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +23 -5
- package/dist/prover/block/BlockProver.d.ts +29 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +241 -77
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/ProvableSettlementHook.js +3 -0
- package/dist/settlement/SettlementContract.d.ts +230 -0
- package/dist/settlement/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/SettlementContract.js +346 -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 +12 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +19 -1
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
- package/package.json +2 -2
- package/src/blockmodules/AccountStateModule.ts +17 -6
- package/src/blockmodules/BlockHeightHook.ts +5 -8
- package/src/blockmodules/LastStateRootBlockHook.ts +26 -0
- package/src/blockmodules/NoopBlockHook.ts +15 -11
- package/src/blockmodules/NoopSettlementHook.ts +21 -0
- package/src/blockmodules/SequenceStateTransactionModule.ts +25 -0
- package/src/index.ts +9 -3
- package/src/model/MethodPublicOutput.ts +3 -2
- package/src/model/network/NetworkState.ts +15 -3
- package/src/model/transaction/RuntimeTransaction.ts +90 -16
- package/src/model/transaction/SignedTransaction.ts +54 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +49 -31
- package/src/protocol/ProvableBlockHook.ts +10 -13
- package/src/protocol/ProvableTransactionHook.ts +2 -1
- package/src/protocol/TransitioningProtocolModule.ts +3 -2
- package/src/prover/block/BlockProvable.ts +39 -6
- package/src/prover/block/BlockProver.ts +473 -143
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/settlement/ProvableSettlementHook.ts +37 -0
- package/src/settlement/SettlementContract.ts +444 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +18 -1
- package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
- package/test/BlockProver.test.ts +2 -3
- package/src/model/transaction/ProtocolTransaction.ts +0 -25
- package/src/prover/block/BlockTransactionPosition.ts +0 -34
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { AccountUpdate, Field, Proof, PublicKey, Signature, SmartContract, State, UInt32, UInt64 } from "o1js";
|
|
2
|
+
import { RollupMerkleTreeWitness } from "@proto-kit/common";
|
|
3
|
+
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
4
|
+
import { BlockProvable, BlockProverPublicInput, BlockProverPublicOutput } from "../prover/block/BlockProvable";
|
|
5
|
+
import { NetworkState } from "../model/network/NetworkState";
|
|
6
|
+
import { ProvableSettlementHook } from "./ProvableSettlementHook";
|
|
7
|
+
declare class LazyBlockProof extends Proof<BlockProverPublicInput, BlockProverPublicOutput> {
|
|
8
|
+
static publicInputType: typeof BlockProverPublicInput;
|
|
9
|
+
static publicOutputType: typeof BlockProverPublicOutput;
|
|
10
|
+
static tag: () => {
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export type SettlementMethodIdMapping = Record<`${string}.${string}`, bigint>;
|
|
15
|
+
declare const Deposit_base: (new (value: {
|
|
16
|
+
address: PublicKey;
|
|
17
|
+
amount: UInt64;
|
|
18
|
+
}) => {
|
|
19
|
+
address: PublicKey;
|
|
20
|
+
amount: UInt64;
|
|
21
|
+
}) & {
|
|
22
|
+
_isStruct: true;
|
|
23
|
+
} & import("o1js/dist/node/snarky").ProvablePure<{
|
|
24
|
+
address: PublicKey;
|
|
25
|
+
amount: UInt64;
|
|
26
|
+
}> & {
|
|
27
|
+
toInput: (x: {
|
|
28
|
+
address: PublicKey;
|
|
29
|
+
amount: UInt64;
|
|
30
|
+
}) => {
|
|
31
|
+
fields?: import("o1js/dist/node/lib/field").Field[] | undefined;
|
|
32
|
+
packed?: [import("o1js/dist/node/lib/field").Field, number][] | undefined;
|
|
33
|
+
};
|
|
34
|
+
toJSON: (x: {
|
|
35
|
+
address: PublicKey;
|
|
36
|
+
amount: UInt64;
|
|
37
|
+
}) => {
|
|
38
|
+
address: string;
|
|
39
|
+
amount: string;
|
|
40
|
+
};
|
|
41
|
+
fromJSON: (x: {
|
|
42
|
+
address: string;
|
|
43
|
+
amount: string;
|
|
44
|
+
}) => {
|
|
45
|
+
address: PublicKey;
|
|
46
|
+
amount: UInt64;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export declare class Deposit extends Deposit_base {
|
|
50
|
+
}
|
|
51
|
+
declare const Withdrawal_base: (new (value: {
|
|
52
|
+
address: PublicKey;
|
|
53
|
+
amount: UInt64;
|
|
54
|
+
}) => {
|
|
55
|
+
address: PublicKey;
|
|
56
|
+
amount: UInt64;
|
|
57
|
+
}) & {
|
|
58
|
+
_isStruct: true;
|
|
59
|
+
} & import("o1js/dist/node/snarky").ProvablePure<{
|
|
60
|
+
address: PublicKey;
|
|
61
|
+
amount: UInt64;
|
|
62
|
+
}> & {
|
|
63
|
+
toInput: (x: {
|
|
64
|
+
address: PublicKey;
|
|
65
|
+
amount: UInt64;
|
|
66
|
+
}) => {
|
|
67
|
+
fields?: import("o1js/dist/node/lib/field").Field[] | undefined;
|
|
68
|
+
packed?: [import("o1js/dist/node/lib/field").Field, number][] | undefined;
|
|
69
|
+
};
|
|
70
|
+
toJSON: (x: {
|
|
71
|
+
address: PublicKey;
|
|
72
|
+
amount: UInt64;
|
|
73
|
+
}) => {
|
|
74
|
+
address: string;
|
|
75
|
+
amount: string;
|
|
76
|
+
};
|
|
77
|
+
fromJSON: (x: {
|
|
78
|
+
address: string;
|
|
79
|
+
amount: string;
|
|
80
|
+
}) => {
|
|
81
|
+
address: PublicKey;
|
|
82
|
+
amount: UInt64;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export declare class Withdrawal extends Withdrawal_base {
|
|
86
|
+
static dummy(): Withdrawal;
|
|
87
|
+
}
|
|
88
|
+
export declare const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
89
|
+
declare const OutgoingMessageArgument_base: (new (value: {
|
|
90
|
+
witness: RollupMerkleTreeWitness;
|
|
91
|
+
value: Withdrawal;
|
|
92
|
+
}) => {
|
|
93
|
+
witness: RollupMerkleTreeWitness;
|
|
94
|
+
value: Withdrawal;
|
|
95
|
+
}) & {
|
|
96
|
+
_isStruct: true;
|
|
97
|
+
} & import("o1js/dist/node/snarky").ProvablePure<{
|
|
98
|
+
witness: RollupMerkleTreeWitness;
|
|
99
|
+
value: Withdrawal;
|
|
100
|
+
}> & {
|
|
101
|
+
toInput: (x: {
|
|
102
|
+
witness: RollupMerkleTreeWitness;
|
|
103
|
+
value: Withdrawal;
|
|
104
|
+
}) => {
|
|
105
|
+
fields?: import("o1js/dist/node/lib/field").Field[] | undefined;
|
|
106
|
+
packed?: [import("o1js/dist/node/lib/field").Field, number][] | undefined;
|
|
107
|
+
};
|
|
108
|
+
toJSON: (x: {
|
|
109
|
+
witness: RollupMerkleTreeWitness;
|
|
110
|
+
value: Withdrawal;
|
|
111
|
+
}) => {
|
|
112
|
+
witness: {
|
|
113
|
+
path: string[];
|
|
114
|
+
isLeft: boolean[];
|
|
115
|
+
};
|
|
116
|
+
value: {
|
|
117
|
+
address: string;
|
|
118
|
+
amount: string;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
fromJSON: (x: {
|
|
122
|
+
witness: {
|
|
123
|
+
path: string[];
|
|
124
|
+
isLeft: boolean[];
|
|
125
|
+
};
|
|
126
|
+
value: {
|
|
127
|
+
address: string;
|
|
128
|
+
amount: string;
|
|
129
|
+
};
|
|
130
|
+
}) => {
|
|
131
|
+
witness: RollupMerkleTreeWitness;
|
|
132
|
+
value: Withdrawal;
|
|
133
|
+
};
|
|
134
|
+
};
|
|
135
|
+
export declare class OutgoingMessageArgument extends OutgoingMessageArgument_base {
|
|
136
|
+
static dummy(): OutgoingMessageArgument;
|
|
137
|
+
}
|
|
138
|
+
declare const OutgoingMessageArgumentBatch_base: (new (value: {
|
|
139
|
+
arguments: OutgoingMessageArgument[];
|
|
140
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
141
|
+
}) => {
|
|
142
|
+
arguments: OutgoingMessageArgument[];
|
|
143
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
144
|
+
}) & {
|
|
145
|
+
_isStruct: true;
|
|
146
|
+
} & import("o1js/dist/node/snarky").ProvablePure<{
|
|
147
|
+
arguments: OutgoingMessageArgument[];
|
|
148
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
149
|
+
}> & {
|
|
150
|
+
toInput: (x: {
|
|
151
|
+
arguments: OutgoingMessageArgument[];
|
|
152
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
153
|
+
}) => {
|
|
154
|
+
fields?: import("o1js/dist/node/lib/field").Field[] | undefined;
|
|
155
|
+
packed?: [import("o1js/dist/node/lib/field").Field, number][] | undefined;
|
|
156
|
+
};
|
|
157
|
+
toJSON: (x: {
|
|
158
|
+
arguments: OutgoingMessageArgument[];
|
|
159
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
160
|
+
}) => {
|
|
161
|
+
arguments: {
|
|
162
|
+
witness: {
|
|
163
|
+
path: string[];
|
|
164
|
+
isLeft: boolean[];
|
|
165
|
+
};
|
|
166
|
+
value: {
|
|
167
|
+
address: string;
|
|
168
|
+
amount: string;
|
|
169
|
+
};
|
|
170
|
+
}[];
|
|
171
|
+
isDummys: boolean[];
|
|
172
|
+
};
|
|
173
|
+
fromJSON: (x: {
|
|
174
|
+
arguments: {
|
|
175
|
+
witness: {
|
|
176
|
+
path: string[];
|
|
177
|
+
isLeft: boolean[];
|
|
178
|
+
};
|
|
179
|
+
value: {
|
|
180
|
+
address: string;
|
|
181
|
+
amount: string;
|
|
182
|
+
};
|
|
183
|
+
}[];
|
|
184
|
+
isDummys: boolean[];
|
|
185
|
+
}) => {
|
|
186
|
+
arguments: OutgoingMessageArgument[];
|
|
187
|
+
isDummys: import("o1js/dist/node/lib/bool").Bool[];
|
|
188
|
+
};
|
|
189
|
+
};
|
|
190
|
+
export declare class OutgoingMessageArgumentBatch extends OutgoingMessageArgumentBatch_base {
|
|
191
|
+
static fromMessages(providedArguments: OutgoingMessageArgument[]): OutgoingMessageArgumentBatch;
|
|
192
|
+
}
|
|
193
|
+
export declare const BATCH_SIGNATURE_PREFIX: import("o1js/dist/node/lib/field").Field;
|
|
194
|
+
export declare const ACTIONS_EMPTY_HASH: import("o1js/dist/node/lib/field").Field;
|
|
195
|
+
export declare class SettlementContract extends SmartContract {
|
|
196
|
+
private readonly methodIdMappings;
|
|
197
|
+
private readonly hooks;
|
|
198
|
+
private readonly withdrawalStatePath;
|
|
199
|
+
private readonly incomingMessagesPaths;
|
|
200
|
+
private readonly escapeHatchSlotsInterval;
|
|
201
|
+
sequencerKey: State<import("o1js/dist/node/lib/field").Field>;
|
|
202
|
+
lastSettlementL1Block: State<UInt32>;
|
|
203
|
+
stateRoot: State<import("o1js/dist/node/lib/field").Field>;
|
|
204
|
+
networkStateHash: State<import("o1js/dist/node/lib/field").Field>;
|
|
205
|
+
blockHashRoot: State<import("o1js/dist/node/lib/field").Field>;
|
|
206
|
+
promisedMessagesHash: State<import("o1js/dist/node/lib/field").Field>;
|
|
207
|
+
honoredMessagesHash: State<import("o1js/dist/node/lib/field").Field>;
|
|
208
|
+
outgoingMessageCursor: State<import("o1js/dist/node/lib/field").Field>;
|
|
209
|
+
constructor(address: PublicKey, methodIdMappings: Record<string, bigint>, hooks: ProvableSettlementHook<unknown>[], withdrawalStatePath: [string, string], incomingMessagesPaths: Record<string, `${string}.${string}`>, escapeHatchSlotsInterval?: number);
|
|
210
|
+
initialize(sequencer: PublicKey): void;
|
|
211
|
+
settle(blockProof: LazyBlockProof, signature: Signature, publicKey: PublicKey, inputNetworkState: NetworkState, outputNetworkState: NetworkState, newPromisedMessagesHash: Field): void;
|
|
212
|
+
private dispatchMessage;
|
|
213
|
+
deposit(amount: UInt64): void;
|
|
214
|
+
rollupOutgoingMessages(batch: OutgoingMessageArgumentBatch): void;
|
|
215
|
+
redeem(additionUpdate: AccountUpdate): void;
|
|
216
|
+
}
|
|
217
|
+
export interface SettlementContractModuleConfig {
|
|
218
|
+
withdrawalStatePath: `${string}.${string}`;
|
|
219
|
+
withdrawalMethodPath: `${string}.${string}`;
|
|
220
|
+
incomingMessagesMethods: Record<string, `${string}.${string}`>;
|
|
221
|
+
}
|
|
222
|
+
export declare class SettlementContractModule extends ProtocolModule<SettlementContractModuleConfig> {
|
|
223
|
+
private readonly hooks;
|
|
224
|
+
private readonly blockProver;
|
|
225
|
+
constructor(hooks: ProvableSettlementHook<unknown>[], blockProver: BlockProvable);
|
|
226
|
+
getContractClass(): typeof SettlementContract;
|
|
227
|
+
createContract(address: PublicKey, methodIdMappings: SettlementMethodIdMapping): SettlementContract;
|
|
228
|
+
}
|
|
229
|
+
export {};
|
|
230
|
+
//# sourceMappingURL=SettlementContract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettlementContract.d.ts","sourceRoot":"","sources":["../../src/settlement/SettlementContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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 };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { UInt64 } from "o1js";
|
|
2
|
+
import { ProvableSettlementHook, SettlementHookInputs } from "../ProvableSettlementHook";
|
|
3
|
+
import { SettlementContract } from "../SettlementContract";
|
|
4
|
+
type NetworkStateSettlementModuleConfig = {
|
|
5
|
+
blocksPerL1Block: UInt64;
|
|
6
|
+
};
|
|
7
|
+
export declare class NetworkStateSettlementModule extends ProvableSettlementHook<NetworkStateSettlementModuleConfig> {
|
|
8
|
+
beforeSettlement(smartContract: SettlementContract, { blockProof, fromNetworkState, toNetworkState, contractState, currentL1Block, }: SettlementHookInputs): void;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=NetworkStateSettlementModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkStateSettlementModule.d.ts","sourceRoot":"","sources":["../../../src/settlement/modules/NetworkStateSettlementModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,KAAK,kCAAkC,GAAG;IACxC,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,qBAAa,4BAA6B,SAAQ,sBAAsB,CAAC,kCAAkC,CAAC;IACnG,gBAAgB,CACrB,aAAa,EAAE,kBAAkB,EACjC,EACE,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,cAAc,GACf,EAAE,oBAAoB,GACtB,IAAI;CAgBR"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ProvableSettlementHook, } from "../ProvableSettlementHook";
|
|
2
|
+
export class NetworkStateSettlementModule extends ProvableSettlementHook {
|
|
3
|
+
beforeSettlement(smartContract, { blockProof, fromNetworkState, toNetworkState, contractState, currentL1Block, }) {
|
|
4
|
+
const { lastSettlementL1Block } = contractState;
|
|
5
|
+
const blocksPerL1Block = this.config.blocksPerL1Block.toConstant();
|
|
6
|
+
const numL1Blocks = currentL1Block.sub(lastSettlementL1Block);
|
|
7
|
+
const expectedHeightDiff = numL1Blocks.toUInt64().mul(blocksPerL1Block);
|
|
8
|
+
const actualHeightDiff = toNetworkState.block.height.sub(fromNetworkState.block.height);
|
|
9
|
+
const acceptableDerivation = numL1Blocks.mul(1).div(10);
|
|
10
|
+
// TODO Check within bounds efficiently
|
|
11
|
+
}
|
|
12
|
+
}
|