Skip to content

Commit cfd845a

Browse files
committed
refactor: new chain abstraction handling
1 parent 455f764 commit cfd845a

File tree

6 files changed

+123
-75
lines changed

6 files changed

+123
-75
lines changed

wallets/rn_cli_wallet/android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ android {
8989
applicationId "com.walletconnect.web3wallet.rnsample"
9090
minSdkVersion rootProject.ext.minSdkVersion
9191
targetSdkVersion rootProject.ext.targetSdkVersion
92-
versionCode 52
92+
versionCode 53
9393
versionName "1.0"
9494
resValue "string", "build_config_package", "com.walletconnect.web3wallet.rnsample"
9595
}

wallets/rn_cli_wallet/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
"@react-navigation/native-stack": "6.10.1",
3434
"@react-navigation/stack": "6.4.1",
3535
"@reown/appkit-ui-react-native": "1.0.1",
36-
"@reown/walletkit": "1.1.1-canary-ca-3",
36+
"@reown/walletkit": "1.1.1-canary-ca-10",
3737
"@sentry/react-native": "5.32.0",
3838
"@walletconnect/core": "2.17.2",
39-
"@walletconnect/react-native-compat": "2.17.2-canary-ca-5",
39+
"@walletconnect/react-native-compat": "2.17.2-canary-ca-6",
4040
"dayjs": "1.11.11",
4141
"ethers": "5.7.2",
4242
"patch-package": "8.0.0",

wallets/rn_cli_wallet/src/modals/SessionSendTransactionModal.tsx

Lines changed: 80 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import {useSnapshot} from 'valtio';
22
import {useCallback, useEffect, useMemo, useState} from 'react';
3-
import {View, StyleSheet, Image, Text, Alert} from 'react-native';
3+
import {
4+
View,
5+
StyleSheet,
6+
Image,
7+
Text,
8+
Alert,
9+
NativeModules,
10+
} from 'react-native';
411
import {SignClientTypes} from '@walletconnect/types';
512
import {ChainAbstractionTypes} from '@reown/walletkit';
613
import {
@@ -22,12 +29,13 @@ import {isVerified} from '@/utils/HelperUtil';
2229
import {VerifiedDomain} from '@/components/VerifiedDomain';
2330
import {Loader} from '@/components/Loader';
2431
import {ethers} from 'ethers';
32+
import {TransactionType} from '@/utils/TypesUtil';
2533

2634
export default function SessionSendTransactionModal() {
2735
const {data} = useSnapshot(ModalStore.state);
2836
const [payingAmount, setPayingAmount] = useState('');
2937
const [bridgingTransactions, setBridgingTransactions] =
30-
useState<ChainAbstractionTypes.Transaction[]>();
38+
useState<TransactionType[]>();
3139
const [fundingFrom, setFundingFrom] =
3240
useState<
3341
{symbol: string; chainId: string; amount: string; tokenContract: string}[]
@@ -49,7 +57,9 @@ export default function SessionSendTransactionModal() {
4957
const params = requestEvent?.params;
5058
const chainId = params?.chainId as string;
5159
const request = params?.request;
52-
const [transaction, setTransaction] = useState<any>(request?.params[0]);
60+
const [transaction, setTransaction] = useState<TransactionType>(
61+
request?.params[0],
62+
);
5363
const isLinkMode = session?.transportType === 'link_mode';
5464
const peerMetadata = session?.peer?.metadata as SignClientTypes.Metadata;
5565

@@ -70,7 +80,7 @@ export default function SessionSendTransactionModal() {
7080

7181
useEffect(() => {
7282
const value = transaction.value;
73-
if (value > 0) {
83+
if (value) {
7484
setPayingAmount(`${value} ETH`);
7585
return;
7686
}
@@ -104,6 +114,7 @@ export default function SessionSendTransactionModal() {
104114
from: transaction.from,
105115
to: transaction.to,
106116
data: transaction.data,
117+
chainId: chainId,
107118
nonce: await getNonce(transaction.from, chainId),
108119
value: transaction.value || '0',
109120
maxFeePerGas: fees.maxFeePerGas,
@@ -121,68 +132,78 @@ export default function SessionSendTransactionModal() {
121132
}
122133
setFetchingRoutes(true);
123134
setFetchingGas(true);
124-
console.log('fetching routes...');
125-
const result = await walletKit.canFulfil({
126-
transaction: {
127-
from: transaction.from,
128-
to: transaction.to,
129-
data: transaction.data,
130-
nonce: '1',
131-
gas: '0',
132-
gasPrice: '0',
133-
value: '0',
134-
maxFeePerGas: '0',
135-
maxPriorityFeePerGas: '0',
136-
chainId: chainId,
137-
},
138-
});
139-
console.log('routes done');
140-
if (result.status === 'error') {
141-
setRoutingStatus(`Error: ${result.reason}`);
142-
setHasError(true);
143-
} else if (result.status === 'available') {
144-
const data = result.data;
145-
const routes = data.routes;
135+
try {
136+
console.log('fetching routes...');
137+
const result = await walletKit.prepareFulfilment({
138+
transaction: {
139+
from: transaction.from,
140+
to: transaction.to,
141+
data: transaction.data,
142+
chainId: chainId,
143+
},
144+
});
145+
console.log('routes done');
146+
if (result.status === 'error') {
147+
setRoutingStatus(`Error: ${result.reason}`);
148+
setHasError(true);
149+
} else if (result.status === 'available') {
150+
console.log('checking details --------');
146151

147-
console.log('ui fields', JSON.stringify(data.routesDetails, null, 2));
148-
const uiFields = data.routesDetails;
152+
const details = await walletKit.getFulfilmentDetails({
153+
fulfilmentId: result.data.fulfilmentId,
154+
});
149155

150-
const transactions: any[] = [];
151-
for (const tx of routes.transactions) {
152-
const txData = {
153-
...tx,
154-
gasLimit: tx.gas,
155-
...(await calculateEip155Gas(tx, tx.chainId)),
156-
};
157-
delete txData.gas;
158-
delete txData.gasPrice;
159-
transactions.push(txData);
160-
}
156+
console.log('details --------', JSON.stringify(details, null, 2));
161157

162-
console.log('bridging txs', JSON.stringify(transactions, null, 2));
158+
const transactions: any[] = [];
163159

164-
setNetworkFee(
165-
`${uiFields.totalFees.formattedAlt} ${uiFields.totalFees.symbol}`,
166-
);
167-
const txData = {
168-
...transaction,
169-
...(await calculateEip155Gas(transaction, chainId)),
170-
};
171-
delete txData.gas;
172-
delete txData.gasPrice;
160+
const routes = result.data;
161+
for (const detail of details.routeDetails) {
162+
const tx: TransactionType = {
163+
data: detail.transaction.input,
164+
from: detail.transaction.from,
165+
to: detail.transaction.to,
166+
nonce: detail.transaction.nonce,
167+
value: detail.transaction.value,
168+
gasLimit: detail.transaction.gasLimit,
169+
maxFeePerGas: detail.transaction.maxFeePerGas,
170+
maxPriorityFeePerGas: detail.transaction.maxPriorityFeePerGas,
171+
chainId: detail.transaction.chainId,
172+
};
173+
transactions.push(tx);
174+
}
173175

174-
setTransaction({
175-
...txData,
176-
nonce: await getNonce(transaction.from, chainId),
177-
});
176+
setNetworkFee(
177+
`${details.totalFee.formattedAlt} ${details.totalFee.symbol}`,
178+
);
178179

179-
setBridgingTransactions(transactions);
180-
setFundingFrom(routes.funding);
181-
} else {
182-
setRoutingStatus(result.status);
183-
await calculateInitialTxFees();
184-
}
180+
const initialTransaction: TransactionType = {
181+
data: details.initialTransactionDetails.transaction.input,
182+
from: details.initialTransactionDetails.transaction.from,
183+
to: details.initialTransactionDetails.transaction.to,
184+
nonce: details.initialTransactionDetails.transaction.nonce,
185+
value: details.initialTransactionDetails.transaction.value,
186+
gasLimit: details.initialTransactionDetails.transaction.gasLimit,
187+
maxFeePerGas:
188+
details.initialTransactionDetails.transaction.maxFeePerGas,
189+
maxPriorityFeePerGas:
190+
details.initialTransactionDetails.transaction.maxPriorityFeePerGas,
191+
chainId: details.initialTransactionDetails.transaction.chainId,
192+
};
185193

194+
setTransaction(initialTransaction);
195+
setBridgingTransactions(transactions);
196+
setFundingFrom(routes.funding);
197+
} else {
198+
setRoutingStatus(result.status);
199+
await calculateInitialTxFees();
200+
}
201+
} catch (e) {
202+
console.log('error', e);
203+
const error = e as Error;
204+
setRoutingStatus(error.message);
205+
setHasError(true);
206+
}
186207
setFetchingRoutes(false);
187208
setFetchingGas(false);
188209
// eslint-disable-next-line react-hooks/exhaustive-deps

wallets/rn_cli_wallet/src/utils/EIP155WalletUtil.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import EIP155Lib from '../lib/EIP155Lib';
33
import {ethers} from 'ethers';
44
import {PresetsUtil} from '../utils/PresetsUtil';
55
import {getAbiByPrefix, parseChainId} from './HelperUtil';
6+
import {TransactionType} from './TypesUtil';
67

78
export let wallet1: EIP155Lib;
89
export let wallet2: EIP155Lib;
@@ -58,7 +59,10 @@ export async function replaceMnemonic(mnemonicOrPrivateKey: string) {
5859
}
5960
}
6061

61-
export async function calculateEip155Gas(transaction: any, chainId: string) {
62+
export async function calculateEip155Gas(
63+
transaction: TransactionType,
64+
chainId: string,
65+
) {
6266
console.log('calculateEip155Gas:', chainId);
6367
const chainData = PresetsUtil.getChainData(parseChainId(chainId));
6468
let provider = new ethers.providers.JsonRpcProvider(chainData.rpcUrl);
@@ -77,7 +81,18 @@ export async function calculateEip155Gas(transaction: any, chainId: string) {
7781
// Calculate the max fee per gas (base fee + priority fee)
7882
const maxFeePerGas = baseFee!.add(maxPriorityFeePerGas);
7983

80-
const gasLimit = ethers.BigNumber.from(0x05b6a8);
84+
let gasLimit;
85+
try {
86+
gasLimit = await provider.estimateGas({
87+
...transaction,
88+
chainId: chainData.id,
89+
});
90+
console.log('Gas Limit estimated:', gasLimit.toString());
91+
} catch (error) {
92+
console.error('Error estimating gas:', error);
93+
gasLimit = ethers.BigNumber.from(0x05b6a8);
94+
}
95+
8196
// Log the details of the gas fees
8297
console.log('Base Fee:', ethers.utils.formatUnits(baseFee!, 'gwei'), 'Gwei');
8398
console.log(
@@ -124,7 +139,7 @@ export async function getNonce(address: string, chainId: string) {
124139

125140
const nonce = await provider.getTransactionCount(address);
126141
console.log('getNonce:', nonce);
127-
return nonce;
142+
return nonce.toString();
128143
}
129144

130145
export async function getTransferDetails(

wallets/rn_cli_wallet/src/utils/TypesUtil.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,15 @@ export type Chain = {
112112
rpcUrl: string;
113113
blockExplorer: string;
114114
};
115+
116+
export type TransactionType = {
117+
chainId: string;
118+
from: string;
119+
to: string;
120+
value: string;
121+
data: string;
122+
gasLimit: string;
123+
nonce: string;
124+
maxFeePerGas: string;
125+
maxPriorityFeePerGas: string;
126+
};

wallets/rn_cli_wallet/yarn.lock

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,9 +3392,9 @@ __metadata:
33923392
languageName: node
33933393
linkType: hard
33943394

3395-
"@reown/walletkit@npm:1.1.1-canary-ca-3":
3396-
version: 1.1.1-canary-ca-3
3397-
resolution: "@reown/walletkit@npm:1.1.1-canary-ca-3"
3395+
"@reown/walletkit@npm:1.1.1-canary-ca-10":
3396+
version: 1.1.1-canary-ca-10
3397+
resolution: "@reown/walletkit@npm:1.1.1-canary-ca-10"
33983398
dependencies:
33993399
"@walletconnect/core": 2.17.3
34003400
"@walletconnect/jsonrpc-provider": 1.0.14
@@ -3403,7 +3403,7 @@ __metadata:
34033403
"@walletconnect/sign-client": 2.17.3
34043404
"@walletconnect/types": 2.17.3
34053405
"@walletconnect/utils": 2.17.3
3406-
checksum: 50fb9e7d25ccee2fdff89d6ac771d4d2b92fce96f62f436a6e4a040d4427959bb569bfbdaf1c4d29eff8ee4ca3ebfb902ec6c26d16567bfb57f7345e53e58b3c
3406+
checksum: 23b98816a192a72385d3fbdffa5b6f739d336885d60be03792173e41b368dfecece1d4dbb968b96d9fc4aec7a6e48a7a65be3138e4f6b99801e9ecff3bc2da87
34073407
languageName: node
34083408
linkType: hard
34093409

@@ -4431,9 +4431,9 @@ __metadata:
44314431
languageName: node
44324432
linkType: hard
44334433

4434-
"@walletconnect/react-native-compat@npm:2.17.2-canary-ca-5":
4435-
version: 2.17.2-canary-ca-5
4436-
resolution: "@walletconnect/react-native-compat@npm:2.17.2-canary-ca-5"
4434+
"@walletconnect/react-native-compat@npm:2.17.2-canary-ca-6":
4435+
version: 2.17.2-canary-ca-6
4436+
resolution: "@walletconnect/react-native-compat@npm:2.17.2-canary-ca-6"
44374437
dependencies:
44384438
events: 3.3.0
44394439
fast-text-encoding: 1.0.6
@@ -4447,7 +4447,7 @@ __metadata:
44474447
peerDependenciesMeta:
44484448
expo-application:
44494449
optional: true
4450-
checksum: 9ea0b26165ca94062577de8aafe4c93a69d1703878d68480792020c1ea4ce43c10e87ce75f6f0cb5ed647fabaae6ffb3204899efef590787b905539c0d26b7f6
4450+
checksum: 4a9c4c7b5f07429f5439f254fa519371f10436119ecf6af5e56e7fb0dfd2472c79a612ef3d97a345cacc1897c9ae9a0cdfd5d0ff09c0859ad377a1d42c2d2cff
44514451
languageName: node
44524452
linkType: hard
44534453

@@ -13305,13 +13305,13 @@ __metadata:
1330513305
"@react-navigation/native-stack": 6.10.1
1330613306
"@react-navigation/stack": 6.4.1
1330713307
"@reown/appkit-ui-react-native": 1.0.1
13308-
"@reown/walletkit": 1.1.1-canary-ca-3
13308+
"@reown/walletkit": 1.1.1-canary-ca-10
1330913309
"@sentry/react-native": 5.32.0
1331013310
"@types/lodash.clonedeep": ^4.5.9
1331113311
"@types/react": ^18.2.6
1331213312
"@types/react-test-renderer": ^18.0.0
1331313313
"@walletconnect/core": 2.17.2
13314-
"@walletconnect/react-native-compat": 2.17.2-canary-ca-5
13314+
"@walletconnect/react-native-compat": 2.17.2-canary-ca-6
1331513315
babel-jest: ^29.6.3
1331613316
babel-plugin-module-resolver: ^5.0.0
1331713317
dayjs: 1.11.11

0 commit comments

Comments
 (0)