Skip to content

Commit 671ef84

Browse files
authored
[SmartWallet] Fix SwitchNetwork from zksync stack to non zksync (#106)
1 parent 777f232 commit 671ef84

File tree

2 files changed

+110
-48
lines changed

2 files changed

+110
-48
lines changed

Thirdweb.Tests/Thirdweb.Wallets/Thirdweb.SmartWallet.Tests.cs

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -314,41 +314,103 @@ public async Task ExecuteTransaction_07_WhenAll_Success()
314314
Assert.True(hashes[1].TransactionHash.Length == 66);
315315
}
316316

317-
// [Fact(Timeout = 120000)]
318-
// public async Task MultiChainTransaction_Success()
319-
// {
320-
// var chainId1 = 11155111;
321-
// var chainId2 = 421614;
322-
323-
// var smartWallet = await SmartWallet.Create(
324-
// personalWallet: await PrivateKeyWallet.Generate(this.Client),
325-
// chainId: chainId1,
326-
// gasless: true,
327-
// factoryAddress: Constants.DEFAULT_FACTORY_ADDRESS_V06,
328-
// entryPoint: Constants.ENTRYPOINT_ADDRESS_V06
329-
// );
330-
331-
// var address1 = await smartWallet.GetAddress();
332-
// var receipt1 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId1) { To = address1, });
333-
// var nonce1 = await smartWallet.GetTransactionCount(chainId: chainId1, blocktag: "latest");
334-
335-
// var address2 = await smartWallet.GetAddress();
336-
// var receipt2 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId2) { To = address2, });
337-
// var nonce2 = await smartWallet.GetTransactionCount(chainId: chainId2, blocktag: "latest");
338-
339-
// Assert.NotNull(address1);
340-
// Assert.NotNull(address2);
341-
// Assert.Equal(address1, address2);
342-
343-
// Assert.NotNull(receipt1);
344-
// Assert.NotNull(receipt2);
345-
346-
// Assert.True(receipt1.TransactionHash.Length == 66);
347-
// Assert.True(receipt2.TransactionHash.Length == 66);
348-
349-
// Assert.Equal(receipt1.To, receipt2.To);
350-
351-
// Assert.Equal(nonce1, 1);
352-
// Assert.Equal(nonce2, 1);
353-
// }
317+
[Fact(Timeout = 120000)]
318+
public async Task MultiChainTransaction_Success()
319+
{
320+
var chainId1 = 11155111;
321+
var chainId2 = 421614;
322+
323+
var smartWallet = await SmartWallet.Create(personalWallet: await PrivateKeyWallet.Generate(this.Client), chainId: chainId1, gasless: true);
324+
325+
var address1 = await smartWallet.GetAddress();
326+
var receipt1 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId1) { To = address1, });
327+
var nonce1 = await smartWallet.GetTransactionCount(chainId: chainId1, blocktag: "latest");
328+
329+
var address2 = await smartWallet.GetAddress();
330+
var receipt2 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId2) { To = address2, });
331+
var nonce2 = await smartWallet.GetTransactionCount(chainId: chainId2, blocktag: "latest");
332+
333+
Assert.NotNull(address1);
334+
Assert.NotNull(address2);
335+
Assert.Equal(address1, address2);
336+
337+
Assert.NotNull(receipt1);
338+
Assert.NotNull(receipt2);
339+
340+
Assert.True(receipt1.TransactionHash.Length == 66);
341+
Assert.True(receipt2.TransactionHash.Length == 66);
342+
343+
Assert.Equal(receipt1.To, receipt2.To);
344+
345+
Assert.Equal(nonce1, 1);
346+
Assert.Equal(nonce2, 1);
347+
}
348+
349+
[Fact(Timeout = 120000)]
350+
public async Task MultiChainTransaction_ZkToNonZk_Success()
351+
{
352+
var chainId1 = 300;
353+
var chainId2 = 421614;
354+
355+
var smartWallet = await SmartWallet.Create(personalWallet: await PrivateKeyWallet.Generate(this.Client), chainId: chainId1, gasless: true);
356+
357+
var randomAddy = await (await PrivateKeyWallet.Generate(this.Client)).GetAddress();
358+
359+
var receipt1 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId1) { To = randomAddy, });
360+
var nonce1 = await smartWallet.GetTransactionCount(chainId: chainId1, blocktag: "latest");
361+
var address1 = await smartWallet.GetAddress();
362+
363+
var receipt2 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId2) { To = randomAddy, });
364+
var nonce2 = await smartWallet.GetTransactionCount(chainId: chainId2, blocktag: "latest");
365+
var address2 = await smartWallet.GetAddress();
366+
367+
Assert.NotNull(address1);
368+
Assert.NotNull(address2);
369+
Assert.NotEqual(address1, address2);
370+
371+
Assert.NotNull(receipt1);
372+
Assert.NotNull(receipt2);
373+
374+
Assert.True(receipt1.TransactionHash.Length == 66);
375+
Assert.True(receipt2.TransactionHash.Length == 66);
376+
377+
Assert.NotEqual(receipt1.To, receipt2.To);
378+
379+
Assert.Equal(nonce1, 1);
380+
Assert.Equal(nonce2, 1);
381+
}
382+
383+
[Fact(Timeout = 120000)]
384+
public async Task MultiChainTransaction_NonZkToZk_Success()
385+
{
386+
var chainId1 = 421614;
387+
var chainId2 = 300;
388+
389+
var smartWallet = await SmartWallet.Create(personalWallet: await PrivateKeyWallet.Generate(this.Client), chainId: chainId1, gasless: true);
390+
391+
var randomAddy = await (await PrivateKeyWallet.Generate(this.Client)).GetAddress();
392+
393+
var receipt1 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId1) { To = randomAddy, });
394+
var nonce1 = await smartWallet.GetTransactionCount(chainId: chainId1, blocktag: "latest");
395+
var address1 = await smartWallet.GetAddress();
396+
397+
var receipt2 = await smartWallet.ExecuteTransaction(new ThirdwebTransactionInput(chainId2) { To = randomAddy, });
398+
var nonce2 = await smartWallet.GetTransactionCount(chainId: chainId2, blocktag: "latest");
399+
var address2 = await smartWallet.GetAddress();
400+
401+
Assert.NotNull(address1);
402+
Assert.NotNull(address2);
403+
Assert.NotEqual(address1, address2);
404+
405+
Assert.NotNull(receipt1);
406+
Assert.NotNull(receipt2);
407+
408+
Assert.True(receipt1.TransactionHash.Length == 66);
409+
Assert.True(receipt2.TransactionHash.Length == 66);
410+
411+
Assert.NotEqual(receipt1.To, receipt2.To);
412+
413+
Assert.Equal(nonce1, 1);
414+
Assert.Equal(nonce2, 1);
415+
}
354416
}

Thirdweb/Thirdweb.Wallets/SmartWallet/SmartWallet.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -185,19 +185,15 @@ public static async Task<SmartWallet> Create(
185185
paymasterUrl ??= $"https://{chainId}.bundler.thirdweb.com/v2";
186186
factoryAddress ??= entryPointVersion == 6 ? Constants.DEFAULT_FACTORY_ADDRESS_V06 : Constants.DEFAULT_FACTORY_ADDRESS_V07;
187187

188-
ThirdwebContract entryPointContract = null;
189-
ThirdwebContract factoryContract = null;
190-
ThirdwebContract accountContract = null;
188+
var entryPointAbi = entryPointVersion == 6 ? Constants.ENTRYPOINT_V06_ABI : Constants.ENTRYPOINT_V07_ABI;
189+
var factoryAbi = entryPointVersion == 6 ? Constants.FACTORY_V06_ABI : Constants.FACTORY_V07_ABI;
190+
var entryPointContract = await ThirdwebContract.Create(personalWallet.Client, entryPoint, chainId, entryPointAbi).ConfigureAwait(false);
191+
var factoryContract = await ThirdwebContract.Create(personalWallet.Client, factoryAddress, chainId, factoryAbi).ConfigureAwait(false);
191192

193+
ThirdwebContract accountContract = null;
192194
if (!await Utils.IsZkSync(personalWallet.Client, chainId).ConfigureAwait(false))
193195
{
194-
var entryPointAbi = entryPointVersion == 6 ? Constants.ENTRYPOINT_V06_ABI : Constants.ENTRYPOINT_V07_ABI;
195-
var factoryAbi = entryPointVersion == 6 ? Constants.FACTORY_V06_ABI : Constants.FACTORY_V07_ABI;
196196
var accountAbi = entryPointVersion == 6 ? Constants.ACCOUNT_V06_ABI : Constants.ACCOUNT_V07_ABI;
197-
198-
entryPointContract = await ThirdwebContract.Create(personalWallet.Client, entryPoint, chainId, entryPointAbi).ConfigureAwait(false);
199-
factoryContract = await ThirdwebContract.Create(personalWallet.Client, factoryAddress, chainId, factoryAbi).ConfigureAwait(false);
200-
201197
var personalAddress = await personalWallet.GetAddress().ConfigureAwait(false);
202198
var accountAddress = accountAddressOverride ?? await ThirdwebContract.Read<string>(factoryContract, "getAddress", personalAddress, Array.Empty<byte>()).ConfigureAwait(false);
203199

@@ -263,16 +259,20 @@ public async Task SwitchNetwork(BigInteger chainId)
263259
throw new InvalidOperationException("You cannot switch networks when using an ERC20 paymaster yet.");
264260
}
265261

266-
this._chainId = chainId;
267262
this._bundlerUrl = this._bundlerUrl.Contains(".thirdweb.com") ? $"https://{chainId}.bundler.thirdweb.com/v2" : this._bundlerUrl;
268263
this._paymasterUrl = this._paymasterUrl.Contains(".thirdweb.com") ? $"https://{chainId}.bundler.thirdweb.com/v2" : this._paymasterUrl;
269264

270265
if (!await Utils.IsZkSync(this.Client, chainId).ConfigureAwait(false))
271266
{
272267
this._entryPointContract = await ThirdwebContract.Create(this.Client, this._entryPointContract.Address, chainId, this._entryPointContract.Abi).ConfigureAwait(false);
273268
this._factoryContract = await ThirdwebContract.Create(this.Client, this._factoryContract.Address, chainId, this._factoryContract.Abi).ConfigureAwait(false);
274-
this._accountContract = await ThirdwebContract.Create(this.Client, this._accountContract.Address, chainId, this._accountContract.Abi).ConfigureAwait(false);
269+
270+
var personalAddress = await this._personalAccount.GetAddress().ConfigureAwait(false);
271+
var accountAddress = await ThirdwebContract.Read<string>(this._factoryContract, "getAddress", personalAddress, Array.Empty<byte>()).ConfigureAwait(false);
272+
this._accountContract = await ThirdwebContract.Create(this._personalAccount.Client, accountAddress, chainId, Constants.ACCOUNT_V06_ABI).ConfigureAwait(false);
275273
}
274+
275+
this._chainId = chainId;
276276
}
277277

278278
/// <summary>

0 commit comments

Comments
 (0)