Skip to content

Commit 5f12c8f

Browse files
authored
Merge pull request #366 from proto-kit/fix/remove-intialize-call
Removed need to initialize contracts separately
2 parents e3ebbe3 + cada88d commit 5f12c8f

File tree

3 files changed

+65
-71
lines changed

3 files changed

+65
-71
lines changed

packages/protocol/src/settlement/contracts/DispatchSmartContract.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
AccountUpdate,
33
Bool,
4+
DeployArgs,
45
Field,
56
method,
67
Poseidon,
@@ -13,6 +14,7 @@ import {
1314
state,
1415
TokenId,
1516
UInt64,
17+
Permissions,
1618
} from "o1js";
1719
import { InMemoryMerkleTreeStorage, TypedClass } from "@proto-kit/common";
1820

@@ -42,14 +44,19 @@ export interface DispatchContractType {
4244
executedMessagesHash: Field,
4345
newPromisedMessagesHash: Field
4446
) => Promise<void>;
45-
initialize: (settlementContract: PublicKey) => Promise<void>;
4647
enableTokenDeposits: (
4748
tokenId: Field,
4849
bridgeContractAddress: PublicKey,
4950
settlementContractAddress: PublicKey
5051
) => Promise<void>;
5152

5253
promisedMessagesHash: State<Field>;
54+
55+
deployAndInitialize: (
56+
args: DeployArgs | undefined,
57+
permissions: Permissions,
58+
settlementContract: PublicKey
59+
) => Promise<void>;
5360
}
5461

5562
const tokenBridgeRoot = new TokenBridgeTree(
@@ -116,12 +123,6 @@ export abstract class DispatchSmartContractBase extends SmartContract {
116123
}
117124

118125
protected initializeBase(settlementContract: PublicKey) {
119-
this.promisedMessagesHash.getAndRequireEquals().assertEquals(Field(0));
120-
this.honoredMessagesHash.getAndRequireEquals().assertEquals(Field(0));
121-
this.settlementContract
122-
.getAndRequireEquals()
123-
.assertEquals(PublicKey.empty<typeof PublicKey>());
124-
125126
this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
126127
this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
127128
this.settlementContract.set(settlementContract);
@@ -239,6 +240,18 @@ export class DispatchSmartContract
239240

240241
@state(Field) public tokenBridgeCount = State<Field>();
241242

243+
public async deployAndInitialize(
244+
args: DeployArgs | undefined,
245+
permissions: Permissions,
246+
settlementContract: PublicKey
247+
): Promise<void> {
248+
await super.deploy(args);
249+
250+
this.self.account.permissions.set(permissions);
251+
252+
this.initializeBase(settlementContract);
253+
}
254+
242255
@method
243256
public async enableTokenDeposits(
244257
tokenId: Field,
@@ -263,11 +276,6 @@ export class DispatchSmartContract
263276
);
264277
}
265278

266-
@method
267-
public async initialize(settlementContract: PublicKey) {
268-
return this.initializeBase(settlementContract);
269-
}
270-
271279
@method
272280
public async deposit(
273281
amount: UInt64,

packages/protocol/src/settlement/contracts/SettlementSmartContract.ts

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ import {
1818
UInt32,
1919
AccountUpdateForest,
2020
TokenContract,
21-
PrivateKey,
2221
VerificationKey,
2322
Permissions,
2423
Struct,
2524
Provable,
2625
TokenId,
2726
DynamicProof,
27+
DeployArgs,
2828
} from "o1js";
2929

3030
import { NetworkState } from "../../model/network/NetworkState";
@@ -65,12 +65,13 @@ export class TokenMapping extends Struct({
6565
export interface SettlementContractType {
6666
authorizationField: State<Field>;
6767

68-
initialize: (
68+
deployAndInitialize: (
69+
args: DeployArgs | undefined,
70+
permissions: Permissions,
6971
sequencer: PublicKey,
70-
dispatchContract: PublicKey,
71-
bridgeContract: PublicKey,
72-
contractKey: PrivateKey
72+
dispatchContract: PublicKey
7373
) => Promise<void>;
74+
7475
assertStateRoot: (root: Field) => AccountUpdate;
7576
settle: (
7677
blockProof: DynamicBlockProof,
@@ -245,35 +246,13 @@ export abstract class SettlementSmartContractBase extends TokenContract {
245246

246247
protected async initializeBase(
247248
sequencer: PublicKey,
248-
dispatchContract: PublicKey,
249-
bridgeContract: PublicKey,
250-
contractKey: PrivateKey
249+
dispatchContract: PublicKey
251250
) {
252-
this.sequencerKey.getAndRequireEquals().assertEquals(Field(0));
253-
this.stateRoot.getAndRequireEquals().assertEquals(Field(0));
254-
this.blockHashRoot.getAndRequireEquals().assertEquals(Field(0));
255-
this.networkStateHash.getAndRequireEquals().assertEquals(Field(0));
256-
this.dispatchContractAddressX.getAndRequireEquals().assertEquals(Field(0));
257-
258251
this.sequencerKey.set(sequencer.x);
259252
this.stateRoot.set(LinkedMerkleTree.EMPTY_ROOT);
260253
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
261254
this.networkStateHash.set(NetworkState.empty().hash());
262255
this.dispatchContractAddressX.set(dispatchContract.x);
263-
264-
const { DispatchContract } = SettlementSmartContractBase.args;
265-
const contractInstance = new DispatchContract(dispatchContract);
266-
await contractInstance.initialize(this.address);
267-
268-
// Deploy bridge contract for $Mina
269-
await this.deployTokenBridge(
270-
this.tokenId,
271-
bridgeContract,
272-
dispatchContract,
273-
true
274-
);
275-
276-
contractKey.toPublicKey().assertEquals(this.address);
277256
}
278257

279258
protected async settleBase(
@@ -449,23 +428,21 @@ export class SettlementSmartContract
449428

450429
@state(Field) public authorizationField = State<Field>();
451430

452-
@method async approveBase(forest: AccountUpdateForest) {
453-
this.checkZeroBalanceChange(forest);
431+
public async deployAndInitialize(
432+
args: DeployArgs | undefined,
433+
permissions: Permissions,
434+
sequencer: PublicKey,
435+
dispatchContract: PublicKey
436+
): Promise<void> {
437+
await super.deploy(args);
438+
439+
this.self.account.permissions.set(permissions);
440+
441+
await this.initializeBase(sequencer, dispatchContract);
454442
}
455443

456-
@method
457-
public async initialize(
458-
sequencer: PublicKey,
459-
dispatchContract: PublicKey,
460-
bridgeContract: PublicKey,
461-
contractKey: PrivateKey
462-
) {
463-
await this.initializeBase(
464-
sequencer,
465-
dispatchContract,
466-
bridgeContract,
467-
contractKey
468-
);
444+
@method async approveBase(forest: AccountUpdateForest) {
445+
this.checkZeroBalanceChange(forest);
469446
}
470447

471448
@method

packages/sequencer/src/settlement/SettlementModule.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
PublicKey,
1717
Signature,
1818
TokenContract,
19+
TokenId,
1920
Transaction,
2021
} from "o1js";
2122
import { inject } from "tsyringe";
@@ -283,17 +284,25 @@ export class SettlementModule
283284
},
284285
async () => {
285286
AccountUpdate.fundNewAccount(feepayer, 2);
286-
await settlement.deploy({
287-
verificationKey:
288-
verificationsKeys.SettlementSmartContract.verificationKey,
289-
});
290-
settlement.account.permissions.set(permissions.settlementContract());
291-
292-
await dispatch.deploy({
293-
verificationKey:
294-
verificationsKeys.DispatchSmartContract.verificationKey,
295-
});
296-
dispatch.account.permissions.set(permissions.dispatchContract());
287+
288+
await dispatch.deployAndInitialize(
289+
{
290+
verificationKey:
291+
verificationsKeys.DispatchSmartContract.verificationKey,
292+
},
293+
permissions.dispatchContract(),
294+
settlement.address
295+
);
296+
297+
await settlement.deployAndInitialize(
298+
{
299+
verificationKey:
300+
verificationsKeys.SettlementSmartContract.verificationKey,
301+
},
302+
permissions.settlementContract(),
303+
feepayerKey.toPublicKey(),
304+
dispatchKey.toPublicKey()
305+
);
297306
}
298307
).sign([feepayerKey, settlementKey, dispatchKey]);
299308
// Note: We can't use this.signTransaction on the above tx
@@ -315,15 +324,15 @@ export class SettlementModule
315324
sender: feepayer,
316325
nonce: nonce + 1,
317326
fee: this.feeStrategy.getFee(),
318-
memo: "Protokit settlement init",
327+
memo: "Deploy MINA bridge",
319328
},
320329
async () => {
321330
AccountUpdate.fundNewAccount(feepayer, 1);
322-
await settlement.initialize(
323-
feepayerKey.toPublicKey(),
324-
dispatchKey.toPublicKey(),
331+
// Deploy bridge contract for $Mina
332+
await settlement.addTokenBridge(
333+
TokenId.default,
325334
minaBridgeKey.toPublicKey(),
326-
settlementKey
335+
dispatchKey.toPublicKey()
327336
);
328337
}
329338
);

0 commit comments

Comments
 (0)