Skip to content

Commit 70bbb33

Browse files
Fix wallet widget txn sending (#410)
* Decrease confirmation requirement * Fix wallet widget txn sending issue
1 parent 235418e commit 70bbb33

File tree

4 files changed

+199
-110
lines changed

4 files changed

+199
-110
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export const TRANSACTION_CONFIRMATIONS_DEFAULT = 4
1+
export const TRANSACTION_CONFIRMATIONS_DEFAULT = 1

packages/connect/src/styles.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ export const styles = String.raw`
307307
.my-4 {
308308
margin-block: calc(var(--spacing) * 4);
309309
}
310+
.mt-0 {
311+
margin-top: calc(var(--spacing) * 0);
312+
}
310313
.mt-0\.5 {
311314
margin-top: calc(var(--spacing) * 0.5);
312315
}
@@ -382,6 +385,9 @@ export const styles = String.raw`
382385
.inline-flex {
383386
display: inline-flex;
384387
}
388+
.table {
389+
display: table;
390+
}
385391
.aspect-square {
386392
aspect-ratio: 1 / 1;
387393
}
@@ -472,6 +478,9 @@ export const styles = String.raw`
472478
.min-h-full {
473479
min-height: 100%;
474480
}
481+
.w-1 {
482+
width: calc(var(--spacing) * 1);
483+
}
475484
.w-1\/2 {
476485
width: calc(1/2 * 100%);
477486
}
@@ -565,12 +574,21 @@ export const styles = String.raw`
565574
.min-w-full {
566575
min-width: 100%;
567576
}
577+
.flex-shrink {
578+
flex-shrink: 1;
579+
}
568580
.shrink-0 {
569581
flex-shrink: 0;
570582
}
583+
.flex-grow {
584+
flex-grow: 1;
585+
}
571586
.grow {
572587
flex-grow: 1;
573588
}
589+
.border-collapse {
590+
border-collapse: collapse;
591+
}
574592
.origin-top {
575593
transform-origin: top;
576594
}
@@ -939,6 +957,9 @@ export const styles = String.raw`
939957
.pt-0 {
940958
padding-top: calc(var(--spacing) * 0);
941959
}
960+
.pt-1 {
961+
padding-top: calc(var(--spacing) * 1);
962+
}
942963
.pt-1\.5 {
943964
padding-top: calc(var(--spacing) * 1.5);
944965
}
@@ -1221,6 +1242,9 @@ export const styles = String.raw`
12211242
.ring-border-normal {
12221243
--tw-ring-color: var(--seq-color-border-normal);
12231244
}
1245+
.ring-white {
1246+
--tw-ring-color: var(--color-white);
1247+
}
12241248
.ring-white\/10 {
12251249
--tw-ring-color: color-mix(in oklab, var(--color-white) 10%, transparent);
12261250
}
@@ -1256,6 +1280,10 @@ export const styles = String.raw`
12561280
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
12571281
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
12581282
}
1283+
.backdrop-filter {
1284+
-webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
1285+
backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);
1286+
}
12591287
.transition {
12601288
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
12611289
transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));

packages/wallet-widget/src/views/Send/SendCoin.tsx

Lines changed: 74 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
import { ContractVerificationStatus, TokenBalance } from '@0xsequence/indexer'
3434
import { useState, ChangeEvent, useRef, useEffect } from 'react'
3535
import { encodeFunctionData, formatUnits, parseUnits, toHex, zeroAddress, Hex } from 'viem'
36-
import { useAccount, useChainId, useSwitchChain, useConfig, useSendTransaction, usePublicClient } from 'wagmi'
36+
import { useAccount, useChainId, useSwitchChain, useConfig, usePublicClient, useWalletClient } from 'wagmi'
3737

3838
import { WalletSelect } from '../../components/Select/WalletSelect'
3939
import { SendItemInfo } from '../../components/SendItemInfo'
@@ -68,7 +68,7 @@ export const SendCoin = ({ chainId, contractAddress }: SendCoinProps) => {
6868
const { fiatCurrency } = useSettings()
6969
const [amount, setAmount] = useState<string>('0')
7070
const [toAddress, setToAddress] = useState<string>('')
71-
const { sendTransaction } = useSendTransaction()
71+
const { data: walletClient } = useWalletClient()
7272
const [isSendTxnPending, setIsSendTxnPending] = useState(false)
7373
const [showConfirmation, setShowConfirmation] = useState(false)
7474
const [feeOptions, setFeeOptions] = useState<
@@ -229,57 +229,90 @@ export const SendCoin = ({ chainId, contractAddress }: SendCoinProps) => {
229229
}
230230
})
231231

232+
if (!walletClient) {
233+
console.error('Wallet client not found')
234+
toast({
235+
title: 'Error',
236+
description: 'Wallet client not available. Please ensure your wallet is connected.',
237+
variant: 'error'
238+
})
239+
setIsSendTxnPending(false)
240+
return
241+
}
242+
232243
setIsSendTxnPending(true)
233244

234245
const sendAmount = parseUnits(amountToSendFormatted, decimals)
246+
let txHash: Hex | undefined
235247

236-
const txOptions = {
237-
onSettled: async (hash: `0x${string}` | undefined) => {
238-
setIsBackButtonEnabled(true)
248+
try {
249+
if (isNativeCoin) {
250+
console.log('Sending native coin via walletClient')
251+
txHash = await walletClient.sendTransaction({
252+
account: accountAddress as `0x${string}`,
253+
to: toAddress as `0x${string}`,
254+
value: BigInt(sendAmount.toString()),
255+
chain: chains.find(c => c.id === chainId)
256+
})
257+
} else {
258+
console.log('Sending ERC20 coin via walletClient')
259+
txHash = await walletClient.sendTransaction({
260+
account: accountAddress as `0x${string}`,
261+
to: tokenBalance?.contractAddress as `0x${string}`,
262+
data: encodeFunctionData({ abi: ERC_20_ABI, functionName: 'transfer', args: [toAddress, toHex(sendAmount)] }),
263+
chain: chains.find(c => c.id === chainId)
264+
})
265+
}
239266

240-
if (hash) {
241-
setNavigation({
242-
location: 'home'
243-
})
244-
setIsSendTxnPending(false)
245-
if (publicClient) {
246-
await waitForTransactionReceipt({
247-
indexerClient,
248-
txnHash: hash as Hex,
249-
publicClient,
250-
confirmations: TRANSACTION_CONFIRMATIONS_DEFAULT
251-
})
252-
clearCachedBalances()
253-
}
254-
}
255-
setIsSendTxnPending(false)
267+
// Handle successful transaction submission
268+
setIsBackButtonEnabled(true)
269+
if (txHash) {
270+
setNavigation({
271+
location: 'home'
272+
})
273+
setIsSendTxnPending(false) // Set pending to false immediately after getting hash
256274

257275
toast({
258276
title: 'Transaction sent',
259277
description: `Successfully sent ${amountToSendFormatted} ${symbol} to ${toAddress}`,
260278
variant: 'success'
261279
})
262-
}
263-
}
264280

265-
if (isNativeCoin) {
266-
sendTransaction(
267-
{
268-
to: toAddress as `0x${string}`,
269-
value: BigInt(sendAmount.toString()),
270-
gas: null
271-
},
272-
txOptions
273-
)
274-
} else {
275-
sendTransaction(
276-
{
277-
to: tokenBalance?.contractAddress as `0x${string}`,
278-
data: encodeFunctionData({ abi: ERC_20_ABI, functionName: 'transfer', args: [toAddress, toHex(sendAmount)] }),
279-
gas: null
280-
},
281-
txOptions
282-
)
281+
// Wait for receipt in the background
282+
if (publicClient) {
283+
waitForTransactionReceipt({
284+
indexerClient,
285+
txnHash: txHash,
286+
publicClient,
287+
confirmations: TRANSACTION_CONFIRMATIONS_DEFAULT
288+
})
289+
.then(() => {
290+
clearCachedBalances()
291+
console.log('Transaction confirmed and balances cleared:', txHash)
292+
})
293+
.catch(error => {
294+
console.error('Error waiting for transaction receipt:', error)
295+
// Optionally show another toast for confirmation failure
296+
})
297+
}
298+
} else {
299+
// Handle case where txHash is unexpectedly undefined
300+
setIsSendTxnPending(false)
301+
toast({
302+
title: 'Transaction Error',
303+
description: 'Transaction submitted but no hash received.',
304+
variant: 'error'
305+
})
306+
}
307+
} catch (error: any) {
308+
console.error('Transaction failed:', error)
309+
setIsSendTxnPending(false)
310+
setIsBackButtonEnabled(true)
311+
toast({
312+
title: 'Transaction Failed',
313+
description: error?.shortMessage || error?.message || 'An unknown error occurred.',
314+
variant: 'error'
315+
})
283316
}
284317
}
285318

0 commit comments

Comments
 (0)