Skip to content

Commit 6c8bb84

Browse files
Migrate ether to viem
1 parent bc1446e commit 6c8bb84

17 files changed

+212
-106
lines changed

scripts/biconomy/complete-deployment-cfa-success.json

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
{
2-
"timestamp": "2025-09-30T23:11:33.217Z",
2+
"timestamp": "2025-10-01T01:09:55.814Z",
33
"status": "COMPLETE_SUCCESS_WITH_CFA_AND_SDK",
44
"network": "localhost",
55
"deployer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
66
"infrastructure": {
7-
"passportMultiCallDeploy": "0x172076E0166D1F9Cc711C77Adf8488051744980C",
8-
"passportFactory": "0x4EE6eCAD1c2Dae9f525404De8555724e3c35d07B",
9-
"latestWalletImplLocator": "0xBEc49fA140aCaA83533fB00A2BB19bDdd0290f25",
10-
"startupWalletImpl": "0xD84379CEae14AA33C123Af12424A37803F885889",
11-
"nexusK1Validator": "0x2B0d36FACD61B71CC05ab8F3D2355ec3631C0dd5",
12-
"nexusImplementation": "0xfbC22278A96299D91d41C453234d97b4F5Eb9B2d",
13-
"immutableSigner": "0x46b142DD1E924FAb83eCc3c08e4D46E82f005e0E",
7+
"passportMultiCallDeploy": "0x1f10F3Ba7ACB61b2F50B9d6DdCf91a6f787C0E82",
8+
"passportFactory": "0x457cCf29090fe5A24c19c1bc95F492168C0EaFdb",
9+
"latestWalletImplLocator": "0x525C7063E7C20997BaaE9bDa922159152D0e8417",
10+
"startupWalletImpl": "0x38a024C0b412B9d1db8BC398140D00F5Af3093D4",
11+
"nexusK1Validator": "0x5fc748f1FEb28d7b76fa1c6B07D8ba2d5535177c",
12+
"nexusImplementation": "0xB82008565FdC7e44609fA118A4a681E92581e680",
13+
"immutableSigner": "0x2a810409872AfC346F9B5b26571Fd6eC42EA4849",
1414
"locatorToNexusConfigured": true,
15-
"configurationTxHash": "0xaf6de818cd1c54e2fc012bb0fcdf03a7f54dd595020bb294b1306ab15b5fa782",
16-
"nexusBootstrap": "0x1c85638e118b37167e9298c2268758e058DdfDA0",
17-
"k1ValidatorFactory": "0x367761085BF3C12e5DA2Df99AC6E1a824612b8fb",
18-
"entryPoint": "0x4C2F7092C2aE51D986bEFEe378e50BD4dB99C901",
15+
"configurationTxHash": "0x215f65194b0ae70c29f8ffb38c0a4c9f3de017b010b6af2993ea7093f997aaab",
16+
"nexusBootstrap": "0x8A93d247134d91e0de6f96547cB0204e5BE8e5D8",
17+
"k1ValidatorFactory": "0x40918Ba7f132E0aCba2CE4de4c4baF9BD2D7D849",
18+
"entryPoint": "0xF32D39ff9f6Aa7a7A64d7a4F00a54826Ef791a55",
1919
"entryPointSource": "deployed_real",
20-
"passportCompatibleNexusFactory": "0x7A9Ec1d04904907De0ED7b6839CcdD59c3716AC9",
20+
"passportCompatibleNexusFactory": "0xd6e1afe5cA8D00A2EFC01B89997abE2De47fdfAf",
2121
"cfaCompatibilityEnabled": true,
2222
"entryPointArtifact": {
2323
"address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789",
@@ -1339,14 +1339,14 @@
13391339
}
13401340
},
13411341
"wallet": {
1342-
"address": "0x02b835368996B680b85297C603a216C05dA38DC3",
1342+
"address": "0x6f5353D9DaD006AAa4D1A91DA675Fd6A75DcdDa7",
13431343
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
1344-
"nexusImplementation": "0xfbC22278A96299D91d41C453234d97b4F5Eb9B2d",
1344+
"nexusImplementation": "0xB82008565FdC7e44609fA118A4a681E92581e680",
13451345
"cfaCompatible": true
13461346
},
13471347
"cfaCompatibility": {
1348-
"oldFactoryAddress": "0x4EE6eCAD1c2Dae9f525404De8555724e3c35d07B",
1349-
"newFactoryAddress": "0x7A9Ec1d04904907De0ED7b6839CcdD59c3716AC9",
1348+
"oldFactoryAddress": "0x457cCf29090fe5A24c19c1bc95F492168C0EaFdb",
1349+
"newFactoryAddress": "0xd6e1afe5cA8D00A2EFC01B89997abE2De47fdfAf",
13501350
"cfaPreserved": true
13511351
},
13521352
"sdkTesting": {

scripts/biconomy/deploy-infrastructure-and-wallet.js

Lines changed: 44 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,32 @@ const { newWalletOptions } = require('../wallet-options');
44
const { loadEnvironmentInfo } = require('../environment');
55
const fs = require('fs');
66

7-
// Import viem for signature (following Biconomy SDK pattern)
7+
// Import viem for signature and utilities (following Biconomy SDK pattern)
88
const { privateKeyToAccount } = require('viem/accounts');
9+
const {
10+
createPublicClient,
11+
http,
12+
parseEther,
13+
formatEther,
14+
zeroAddress,
15+
encodeAbiParameters,
16+
parseAbiParameters,
17+
concat
18+
} = require('viem');
919

1020
// Import Biconomy SDK for production testing
1121
const { createSmartAccountClient } = require('@biconomy/abstractjs');
1222
const { toNexusAccount } = require('@biconomy/abstractjs');
1323
const { getMEEVersion, DEFAULT_MEE_VERSION } = require('@biconomy/abstractjs');
14-
const { http } = require('viem');
24+
25+
// Create viem public client helper
26+
function createViemPublicClient(network) {
27+
const networkConfig = hre.network.config;
28+
const rpcUrl = networkConfig.url || 'http://localhost:8545';
29+
return createPublicClient({
30+
transport: http(rpcUrl)
31+
});
32+
}
1533

1634
// Generate working initData for Nexus deployment
1735
async function generateWorkingInitData(signerAddress, bootstrapAddress, k1ValidatorAddress) {
@@ -36,15 +54,15 @@ async function generateWorkingInitData(signerAddress, bootstrapAddress, k1Valida
3654
signerAddress, // defaultValidatorInitData (signer address for K1Validator)
3755
[], // validators - EMPTY because K1Validator is already the DEFAULT_VALIDATOR
3856
[], // executors (empty array for 1.2.x)
39-
{ module: hre.ethers.constants.AddressZero, data: '0x' }, // hook (empty)
57+
{ module: zeroAddress, data: '0x' }, // hook (empty)
4058
[], // fallbacks (empty array for 1.2.x)
4159
[] // prevalidationHooks (empty array for 1.2.x)
4260
]
4361
);
4462

4563
// Create the complete initData structure: [bootstrap_address, bootstrap_call_data]
46-
const initData = hre.ethers.utils.defaultAbiCoder.encode(
47-
['address', 'bytes'],
64+
const initData = encodeAbiParameters(
65+
parseAbiParameters('address, bytes'),
4866
[bootstrapAddress, bootstrapCallData]
4967
);
5068

@@ -116,10 +134,10 @@ async function testWalletWithOfficialSDK(deployer, network) {
116134

117135
try {
118136
const targetAddress = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8';
119-
const transferAmount = hre.ethers.utils.parseEther('0.001');
137+
const transferAmount = parseEther('0.001');
120138

121139
console.log(`[${network}] 🎯 Target: ${targetAddress}`);
122-
console.log(`[${network}] 💰 Amount: ${hre.ethers.utils.formatEther(transferAmount)} ETH`);
140+
console.log(`[${network}] 💰 Amount: ${formatEther(transferAmount)} ETH`);
123141

124142
const userOp = await smartAccountClient.prepareUserOperation({
125143
calls: [{
@@ -226,16 +244,19 @@ async function deployInfrastructureAndWalletWithCFA() {
226244

227245
console.log('Deployer:', await deployer.getAddress());
228246
console.log('Network:', network);
229-
console.log('Balance:', hre.ethers.utils.formatEther(await deployer.getBalance()), 'ETH');
247+
console.log('Balance:', formatEther(await deployer.getBalance()), 'ETH');
230248
console.log('🎯 Deployment Method:', deploymentMethod);
231249
console.log('🔄 CFA Compatibility: ENABLED');
232250
console.log('');
233251

252+
// Initialize viem public client for code verification
253+
const publicClient = createViemPublicClient(network);
254+
234255
// PHASE 1: Deploy Infrastructure
235256
console.log('🏗️ PHASE 1: DEPLOYING INFRASTRUCTURE WITH CFA COMPATIBILITY');
236257
console.log('===========================================================');
237258

238-
const infrastructure = await deployInfrastructureWithCFA(deployer, network);
259+
const infrastructure = await deployInfrastructureWithCFA(deployer, network, publicClient);
239260

240261
// PHASE 2: Deploy Wallet
241262
console.log('\n🎯 PHASE 2: DEPLOYING WALLET WITH CFA COMPATIBILITY');
@@ -314,7 +335,7 @@ async function deployInfrastructureAndWalletWithCFA() {
314335
console.log('📁 Complete results saved to complete-deployment-cfa-success.json');
315336
}
316337

317-
async function deployInfrastructureWithCFA(deployer, network) {
338+
async function deployInfrastructureWithCFA(deployer, network, publicClient) {
318339
console.log('📦 Deploying infrastructure components with CFA compatibility...\n');
319340

320341
// Load EntryPoint artifact once for reuse throughout the function
@@ -345,8 +366,8 @@ async function deployInfrastructureWithCFA(deployer, network) {
345366

346367
// Wait and verify
347368
await new Promise(resolve => setTimeout(resolve, 1000));
348-
const factoryCode = await hre.ethers.provider.getCode(factory.address);
349-
if (factoryCode === '0x') throw new Error('Factory deployment verification failed');
369+
const factoryCode = await publicClient.getCode({ address: factory.address });
370+
if (!factoryCode || factoryCode === '0x') throw new Error('Factory deployment verification failed');
350371
console.log('✅ Old Factory verified with', Math.floor(factoryCode.length / 2), 'bytes');
351372

352373
// 3. Deploy LatestWalletImplLocator (Step 2)
@@ -361,8 +382,8 @@ async function deployInfrastructureWithCFA(deployer, network) {
361382

362383
// Wait and verify
363384
await new Promise(resolve => setTimeout(resolve, 1000));
364-
const locatorCode = await hre.ethers.provider.getCode(latestWalletImplLocator.address);
365-
if (locatorCode === '0x') throw new Error('LatestWalletImplLocator deployment verification failed');
385+
const locatorCode = await publicClient.getCode({ address: latestWalletImplLocator.address });
386+
if (!locatorCode || locatorCode === '0x') throw new Error('LatestWalletImplLocator deployment verification failed');
366387
console.log('✅ LatestWalletImplLocator verified with', Math.floor(locatorCode.length / 2), 'bytes');
367388

368389
// 4. Deploy StartupWalletImpl (Step 3)
@@ -376,8 +397,8 @@ async function deployInfrastructureWithCFA(deployer, network) {
376397

377398
// Wait and verify
378399
await new Promise(resolve => setTimeout(resolve, 1000));
379-
const startupCode = await hre.ethers.provider.getCode(startupWalletImpl.address);
380-
if (startupCode === '0x') throw new Error('StartupWalletImpl deployment verification failed');
400+
const startupCode = await publicClient.getCode({ address: startupWalletImpl.address });
401+
if (!startupCode || startupCode === '0x') throw new Error('StartupWalletImpl deployment verification failed');
381402
console.log('✅ StartupWalletImpl verified with', Math.floor(startupCode.length / 2), 'bytes');
382403

383404
// 5. Deploy K1Validator (Nexus Core - Step 4)
@@ -389,15 +410,15 @@ async function deployInfrastructureWithCFA(deployer, network) {
389410

390411
// Wait and verify
391412
await new Promise(resolve => setTimeout(resolve, 1000));
392-
const validatorCode = await hre.ethers.provider.getCode(k1Validator.address);
393-
if (validatorCode === '0x') throw new Error('K1Validator deployment verification failed');
413+
const validatorCode = await publicClient.getCode({ address: k1Validator.address });
414+
if (!validatorCode || validatorCode === '0x') throw new Error('K1Validator deployment verification failed');
394415
console.log('✅ K1Validator verified with', Math.floor(validatorCode.length / 2), 'bytes');
395416

396417
// 6. Deploy Nexus Implementation (Step 4)
397418
console.log('\n6️⃣ Deploying Nexus Implementation (Step 4)...');
398419
const NexusFactory = await hre.ethers.getContractFactory('Nexus', deployer);
399420
const testEntryPoint = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'; // Test EntryPoint
400-
const initData = hre.ethers.utils.hexConcat([await deployer.getAddress()]);
421+
const initData = concat([await deployer.getAddress()]);
401422

402423
const nexus = await NexusFactory.deploy(
403424
testEntryPoint, // entryPoint
@@ -459,7 +480,7 @@ async function deployInfrastructureWithCFA(deployer, network) {
459480
await deployer.getAddress(), // factoryOwner
460481
k1Validator.address, // K1_VALIDATOR
461482
nexusBootstrap.address, // BOOTSTRAPPER
462-
hre.ethers.constants.AddressZero // REGISTRY (minimal for now)
483+
zeroAddress // REGISTRY (minimal for now)
463484
);
464485
await k1ValidatorFactory.deployed();
465486
console.log('✅ K1ValidatorFactory:', k1ValidatorFactory.address);
@@ -776,18 +797,18 @@ async function testWalletOperations(infrastructure, walletAddress, deployer, net
776797
console.log('1️⃣ Testing ETH reception...');
777798

778799
const initialBalance = await hre.ethers.provider.getBalance(walletAddress);
779-
console.log(` Initial wallet balance: ${hre.ethers.utils.formatEther(initialBalance)} ETH`);
800+
console.log(` Initial wallet balance: ${formatEther(initialBalance)} ETH`);
780801

781802
// Send some ETH to the wallet
782803
const sendTx = await deployer.sendTransaction({
783804
to: walletAddress,
784-
value: hre.ethers.utils.parseEther('0.1'),
805+
value: parseEther('0.1'),
785806
gasLimit: 100000
786807
});
787808
await sendTx.wait();
788809

789810
const newBalance = await hre.ethers.provider.getBalance(walletAddress);
790-
console.log(` ✅ ETH sent successfully! New balance: ${hre.ethers.utils.formatEther(newBalance)} ETH`);
811+
console.log(` ✅ ETH sent successfully! New balance: ${formatEther(newBalance)} ETH`);
791812

792813
// Test 2: Check wallet code and type
793814
console.log('\n2️⃣ Analyzing wallet structure...');

scripts/biconomy/steps/step0.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"create2DeployerAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
2+
"create2DeployerAddress": "0xF8e31cb472bc70500f08Cd84917E5A1912Ec8397",
33
"owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
44
"network": "localhost",
5-
"deployedAt": "2025-09-30T11:31:09.810Z",
5+
"deployedAt": "2025-10-01T00:59:54.768Z",
66
"codeSize": 3125
77
}

scripts/biconomy/steps/step0.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as fs from 'fs';
22
import * as hre from 'hardhat';
3+
import { createPublicClient, http } from 'viem';
34
import { EnvironmentInfo, loadEnvironmentInfo } from '../../environment';
45
import { newWalletOptions, WalletOptions } from '../../wallet-options';
56
import { deployContract } from '../../contract';
@@ -22,16 +23,26 @@ async function step0(): Promise<EnvironmentInfo> {
2223
// Setup wallet
2324
const wallets: WalletOptions = await newWalletOptions(env);
2425
const deployer = wallets.getWallet();
26+
const deployerAddress = await deployer.getAddress(); // Get address using ethers method
2527

2628
// Deploy OwnableCreate2Deployer
2729
console.log(`[${network}] Deploying OwnableCreate2Deployer...`);
2830
const create2Deployer = await deployContract(env, wallets, 'OwnableCreate2Deployer', [
29-
await deployer.getAddress() // Owner of the deployer (use deployer as owner)
31+
deployerAddress // Owner of the deployer (use deployer as owner)
3032
]);
3133

32-
// Verify deployment
33-
const deployedCode = await hre.ethers.provider.getCode(create2Deployer.address);
34-
if (deployedCode === '0x') {
34+
// Verify deployment using viem public client
35+
const networkConfig = hre.network.config as any;
36+
const rpcUrl = networkConfig.url || 'http://localhost:8545';
37+
const publicClient = createPublicClient({
38+
transport: http(rpcUrl)
39+
});
40+
41+
const deployedCode = await publicClient.getCode({
42+
address: create2Deployer.address as `0x${string}`
43+
});
44+
45+
if (!deployedCode || deployedCode === '0x') {
3546
throw new Error('OwnableCreate2Deployer deployment verification failed');
3647
}
3748

@@ -41,7 +52,7 @@ async function step0(): Promise<EnvironmentInfo> {
4152
// Save deployment information
4253
const deploymentData = {
4354
create2DeployerAddress: create2Deployer.address,
44-
owner: await deployer.getAddress(),
55+
owner: deployerAddress, // Use cached address
4556
network: network,
4657
deployedAt: new Date().toISOString(),
4758
codeSize: Math.floor(deployedCode.length / 2)
@@ -51,7 +62,7 @@ async function step0(): Promise<EnvironmentInfo> {
5162

5263
console.log(`[${network}] Step 0 deployment completed`);
5364
console.log(`[${network}] OwnableCreate2Deployer deployed at: ${create2Deployer.address}`);
54-
console.log(`[${network}] Owner: ${await deployer.getAddress()}`);
65+
console.log(`[${network}] Owner: ${deployerAddress}`); // Use cached address
5566
console.log(`[${network}] 📋 IMPORTANT: Update DEPLOYER_CONTRACT_ADDRESS in .env to: ${create2Deployer.address}`);
5667
console.log(`[${network}] 📋 This deployer will be used for deterministic CREATE2 deployments in subsequent steps`);
5768

scripts/biconomy/steps/step1.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"multiCallAdminPubKey": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
33
"factoryAdminPubKey": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
4-
"multiCallDeploy": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
5-
"factory": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
4+
"multiCallDeploy": "0xc0F115A19107322cFBf1cDBC7ea011C19EbDB4F8",
5+
"factory": "0xc96304e3c037f81dA488ed9dEa1D8F2a48278a75"
66
}

scripts/biconomy/steps/step10.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
2-
"timestamp": "2025-09-30T22:28:23.790Z",
2+
"timestamp": "2025-10-01T01:03:38.304Z",
33
"network": "localhost",
44
"deployer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
55
"step": 10,
66
"description": "K1ValidatorFactory (Complete Factory)",
7-
"k1ValidatorFactory": "0x7bc06c482DEAd17c0e297aFbC32f6e63d3846650",
8-
"accountImplementation": "0x24F5E63b0Faa059f11E5fC897215FE707bbC8ccF",
9-
"k1ValidatorModule": "0x057bA9624F8912122D9E2370Ec8d6197748644Ca",
10-
"bootstrapper": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318",
7+
"k1ValidatorFactory": "0x3347B4d90ebe72BeFb30444C9966B2B990aE9FcB",
8+
"accountImplementation": "0xD6Bbb18a1141ab3eC0fAf542272F486C1566b1Dc",
9+
"k1ValidatorModule": "0x7F1f0b249CB8e5d11E6c0fb8d9a4b7Bbf471614F",
10+
"bootstrapper": "0xfaAddC93baf78e89DCf37bA67943E1bE8F37Bb8c",
1111
"registry": "0x0000000000000000000000000000000000000000",
1212
"codeSize": 6677,
1313
"configurationVerified": true,

scripts/biconomy/steps/step10.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Step 10: Deploy K1ValidatorFactory (Complete Factory)
22
import * as hre from 'hardhat';
33
import * as fs from 'fs';
4+
import { createPublicClient, http, zeroAddress } from 'viem';
45
import { EnvironmentInfo, loadEnvironmentInfo } from '../../environment';
56
import { newWalletOptions } from '../../wallet-options';
67

@@ -18,6 +19,13 @@ async function deployK1ValidatorFactory() {
1819
const deployer = walletOptions.getWallet();
1920
const deployerAddress = await deployer.getAddress();
2021

22+
// Setup viem public client for code verification
23+
const networkConfig = hre.network.config as any;
24+
const rpcUrl = networkConfig.url || 'http://localhost:8545';
25+
const publicClient = createPublicClient({
26+
transport: http(rpcUrl)
27+
});
28+
2129
console.log(`[${network}] Deployer: ${deployerAddress}`);
2230

2331
try {
@@ -43,16 +51,19 @@ async function deployK1ValidatorFactory() {
4351
deployerAddress, // factoryOwner
4452
k1Validator, // K1_VALIDATOR
4553
nexusBootstrap, // BOOTSTRAPPER
46-
hre.ethers.constants.AddressZero // REGISTRY (minimal for now)
54+
zeroAddress // REGISTRY (minimal for now) - using viem zeroAddress
4755
);
4856
await k1ValidatorFactory.deployed();
4957

5058
console.log(`[${network}] ✅ K1ValidatorFactory deployed at: ${k1ValidatorFactory.address}`);
5159

52-
// Verify deployment
60+
// Verify deployment using viem
5361
await new Promise(resolve => setTimeout(resolve, 1000));
54-
const k1FactoryCode = await hre.ethers.provider.getCode(k1ValidatorFactory.address);
55-
if (k1FactoryCode === '0x') {
62+
const k1FactoryCode = await publicClient.getCode({
63+
address: k1ValidatorFactory.address as `0x${string}`
64+
});
65+
66+
if (!k1FactoryCode || k1FactoryCode === '0x') {
5667
throw new Error('K1ValidatorFactory deployment verification failed');
5768
}
5869
console.log(`[${network}] ✅ K1ValidatorFactory verified with ${Math.floor(k1FactoryCode.length / 2)} bytes`);
@@ -103,7 +114,7 @@ async function deployK1ValidatorFactory() {
103114
accountImplementation: nexusImplementation,
104115
k1ValidatorModule: k1Validator,
105116
bootstrapper: nexusBootstrap,
106-
registry: hre.ethers.constants.AddressZero,
117+
registry: zeroAddress, // Use viem zeroAddress
107118

108119
// Verification
109120
codeSize: Math.floor(k1FactoryCode.length / 2),

scripts/biconomy/steps/step2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"walletImplLocatorAdmin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
33
"walletImplChangerAdmin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
4-
"latestWalletImplLocator": "0xc5D329d715A933F141Bd57D26296F9F6e6d61BA6"
4+
"latestWalletImplLocator": "0x1B74C2020592f8B0cb5Eb66C089F3fEa9e5fB6fc"
55
}

0 commit comments

Comments
 (0)