@n1xyz/wallet-widget 0.0.35-alpha.32 → 0.0.35-alpha.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/network.d.ts +6 -0
- package/dist/config/network.js +6 -0
- package/dist/config/network.js.map +1 -1
- package/dist/features/onboarding-flow/cctp/bridgeKitClient.js +1 -2
- package/dist/features/onboarding-flow/cctp/bridgeKitClient.js.map +1 -1
- package/dist/features/onboarding-flow/components/TransactionTable.js +3 -8
- package/dist/features/onboarding-flow/components/TransactionTable.js.map +1 -1
- package/dist/features/onboarding-flow/constants/withdrawal.d.ts +4 -4
- package/dist/features/onboarding-flow/constants/withdrawal.js +13 -4
- package/dist/features/onboarding-flow/constants/withdrawal.js.map +1 -1
- package/dist/features/onboarding-flow/hooks/useNordBalance.js +3 -3
- package/dist/features/onboarding-flow/hooks/useNordBalance.js.map +1 -1
- package/dist/features/onboarding-flow/hooks/useTurnkeySolanaBalance.js +10 -9
- package/dist/features/onboarding-flow/hooks/useTurnkeySolanaBalance.js.map +1 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.d.ts +27 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js +27 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js +3 -7
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js +19 -12
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/WithdrawalFlowProvider.js +1 -0
- package/dist/features/onboarding-flow/providers/WithdrawalFlowProvider.js.map +1 -1
- package/dist/features/onboarding-flow/screens/00-EntrySelectionScreen.js +5 -1
- package/dist/features/onboarding-flow/screens/00-EntrySelectionScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/05-AmountInputScreen.d.ts +1 -2
- package/dist/features/onboarding-flow/screens/05-AmountInputScreen.js +35 -341
- package/dist/features/onboarding-flow/screens/05-AmountInputScreen.js.map +1 -1
- package/dist/features/onboarding-flow/utils/deposit/solanaDepositTransaction.d.ts +3 -5
- package/dist/features/onboarding-flow/utils/deposit/solanaDepositTransaction.js +4 -11
- package/dist/features/onboarding-flow/utils/deposit/solanaDepositTransaction.js.map +1 -1
- package/dist/features/onboarding-flow/utils/deposit/storage.js +0 -16
- package/dist/features/onboarding-flow/utils/deposit/storage.js.map +1 -1
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.d.ts +1 -0
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.js +153 -15
- package/dist/features/onboarding-flow/utils/withdrawal/bridgeFlowPhases.js.map +1 -1
- package/dist/main.css +1 -1
- package/dist/providers/LazyWalletProvider.js +9 -5
- package/dist/providers/LazyWalletProvider.js.map +1 -1
- package/dist/providers/N1WalletProvider/ContextBridge.js +0 -51
- package/dist/providers/N1WalletProvider/ContextBridge.js.map +1 -1
- package/dist/providers/N1WalletProvider/ModalProvider.js +4 -10
- package/dist/providers/N1WalletProvider/ModalProvider.js.map +1 -1
- package/dist/providers/N1WalletProvider/NetworkProvider.d.ts +6 -0
- package/dist/providers/N1WalletProvider/NetworkProvider.js +6 -0
- package/dist/providers/N1WalletProvider/NetworkProvider.js.map +1 -1
- package/dist/providers/N1WalletProvider.js +1 -2
- package/dist/providers/N1WalletProvider.js.map +1 -1
- package/dist/services/bootstrap/TurnkeyBootstrapService.d.ts +2 -4
- package/dist/services/bootstrap/TurnkeyBootstrapService.js +3 -40
- package/dist/services/bootstrap/TurnkeyBootstrapService.js.map +1 -1
- package/dist/styles/embedded-main-css.d.ts +1 -1
- package/dist/styles/embedded-main-css.js +1 -1
- package/dist/styles/embedded-main-css.js.map +1 -1
- package/dist/turnkey/TurnkeyProvider.js +264 -87
- package/dist/turnkey/TurnkeyProvider.js.map +1 -1
- package/dist/types/wallet.d.ts +0 -1
- package/dist/types/wallet.js.map +1 -1
- package/dist/utils/errors.d.ts +16 -0
- package/dist/utils/errors.js +21 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/nordApi.js +3 -3
- package/dist/utils/nordApi.js.map +1 -1
- package/package.json +1 -1
package/dist/config/network.d.ts
CHANGED
|
@@ -3,3 +3,9 @@
|
|
|
3
3
|
* NEXT_PUBLIC_TESTNET defaults to testnet when unset or any value other than 'false'.
|
|
4
4
|
*/
|
|
5
5
|
export declare const IS_TESTNET: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Whether EVM deposit/withdrawal entry is enabled.
|
|
8
|
+
* Set NEXT_PUBLIC_EVM_ENABLED=true in the consumer's .env to unlock EVM.
|
|
9
|
+
* Defaults to false (shows "Coming Soon").
|
|
10
|
+
*/
|
|
11
|
+
export declare const EVM_ENABLED: boolean;
|
package/dist/config/network.js
CHANGED
|
@@ -3,4 +3,10 @@
|
|
|
3
3
|
* NEXT_PUBLIC_TESTNET defaults to testnet when unset or any value other than 'false'.
|
|
4
4
|
*/
|
|
5
5
|
export var IS_TESTNET = process.env.NEXT_PUBLIC_TESTNET !== 'false';
|
|
6
|
+
/**
|
|
7
|
+
* Whether EVM deposit/withdrawal entry is enabled.
|
|
8
|
+
* Set NEXT_PUBLIC_EVM_ENABLED=true in the consumer's .env to unlock EVM.
|
|
9
|
+
* Defaults to false (shows "Coming Soon").
|
|
10
|
+
*/
|
|
11
|
+
export var EVM_ENABLED = process.env.NEXT_PUBLIC_EVM_ENABLED === 'true';
|
|
6
12
|
//# sourceMappingURL=network.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/config/network.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,IAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,OAAO,CAAC","sourcesContent":["/**\n * Central network configuration.\n * NEXT_PUBLIC_TESTNET defaults to testnet when unset or any value other than 'false'.\n */\nexport const IS_TESTNET = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n"]}
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/config/network.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,IAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,OAAO,CAAC;AAEtE;;;;GAIG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM,CAAC","sourcesContent":["/**\n * Central network configuration.\n * NEXT_PUBLIC_TESTNET defaults to testnet when unset or any value other than 'false'.\n */\nexport const IS_TESTNET = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n\n/**\n * Whether EVM deposit/withdrawal entry is enabled.\n * Set NEXT_PUBLIC_EVM_ENABLED=true in the consumer's .env to unlock EVM.\n * Defaults to false (shows \"Coming Soon\").\n */\nexport const EVM_ENABLED = process.env.NEXT_PUBLIC_EVM_ENABLED === 'true';\n"]}
|
|
@@ -40,8 +40,7 @@ import { explorerBaseForChain } from '../utils/explorerUrl';
|
|
|
40
40
|
import { BridgeKit } from '@circle-fin/bridge-kit';
|
|
41
41
|
import { createAdapterFromProvider } from '@circle-fin/adapter-viem-v2';
|
|
42
42
|
import { SolanaDevnet, ArbitrumSepolia, BaseSepolia, EthereumSepolia, Solana, Arbitrum, Base, Ethereum, } from '@circle-fin/bridge-kit/chains';
|
|
43
|
-
|
|
44
|
-
var isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';
|
|
43
|
+
import { IS_TESTNET as isTestnet } from '../../../config/network';
|
|
45
44
|
var findExplorerUrl = function (steps) {
|
|
46
45
|
var _a;
|
|
47
46
|
var withUrl = steps.find(function (s) { return s.explorerUrl; });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeKitClient.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/cctp/bridgeKitClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CctpBridgeParams,\n CctpBridgeResult,\n CctpClient,\n CctpConfirmationResult,\n} from './types';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createDepositEvent } from '../../../utils/events';\nimport { createDepositError, createNetworkError } from '../../../utils/errors';\nimport { explorerBaseForChain } from '../utils/explorerUrl';\nimport { BridgeKit } from '@circle-fin/bridge-kit';\nimport { createAdapterFromProvider } from '@circle-fin/adapter-viem-v2';\nimport {\n SolanaDevnet,\n ArbitrumSepolia,\n BaseSepolia,\n EthereumSepolia,\n Solana,\n Arbitrum,\n Base,\n Ethereum,\n} from '@circle-fin/bridge-kit/chains';\n\n// Network selection based on NEXT_PUBLIC_TESTNET env var (default: true for testnet)\nconst isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n\ninterface BridgeStep {\n name?: string;\n state?: string;\n txHash?: string;\n explorerUrl?: string;\n data?: {\n attestationId?: string;\n txHash?: string;\n status?: string;\n txIndex?: number;\n attestation?: string;\n message?: string;\n };\n}\n\ninterface BridgeResponse {\n steps?: BridgeStep[];\n}\n\nconst findExplorerUrl = (steps: BridgeStep[]): string | null => {\n const withUrl = steps.find((s) => s.explorerUrl);\n return withUrl?.explorerUrl ?? null;\n};\n\n/**\n * Maps normalized chain names to BridgeKit's chain definition objects.\n * Returns mainnet or testnet chains based on NEXT_PUBLIC_TESTNET env var.\n */\nexport const mapChainToBridgeKit = (chain: string): any => {\n if (!chain || typeof chain !== 'string') {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Invalid chain identifier: ${chain}`, {\n context: { chain },\n }));\n throw new Error(`Invalid chain identifier: ${chain}. Expected a valid chain name string.`);\n }\n\n const lower = chain.toLowerCase().trim();\n if (!lower) {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', 'Empty chain string provided'));\n throw new Error('Chain identifier cannot be empty.');\n }\n\n if (lower === 'arbitrum' || lower === 'arb') {\n return isTestnet ? ArbitrumSepolia : Arbitrum;\n }\n if (lower === 'solana') {\n return isTestnet ? SolanaDevnet : Solana;\n }\n if (lower === 'base') {\n return isTestnet ? BaseSepolia : Base;\n }\n if (lower === 'ethereum' || lower === 'evm') {\n return isTestnet ? EthereumSepolia : Ethereum;\n }\n\n // For other chains, log a warning and throw an error instead of returning as-is\n // This helps catch configuration issues early\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Unsupported chain \"${chain}\"`, {\n context: { chain, lower },\n }));\n throw new Error(`Unsupported chain \"${chain}\". Supported chains: arbitrum, base, ethereum, solana`);\n};\n\nexport const getDomain = (chain: any): number | undefined => {\n return chain?.cctp?.domain;\n}\n\n/**\n * Bridge Kit client wrapper. Keeps network interactions isolated for auditability.\n */\nexport class BridgeKitClient implements CctpClient {\n /**\n * Parses Bridge Kit response to extract transaction hashes and attestation ID.\n * Handles variations in step naming and falls back to timestamp-based deposit ID if needed.\n */\n private parseSubmitResponse(response: BridgeResponse): CctpBridgeResult {\n const steps = response.steps ?? [];\n const approve = steps.find((s) => s.name === 'approve' || s.name === 'APPROVE');\n const burn = steps.find((s) => s.name === 'burn' || s.name === 'BURN' || s.name === 'bridge');\n // FIX: Do NOT fall back to approve.txHash. We need the burn/bridge tx for attestation.\n // If burn is missing, we shouldn't consider this a successful bridge submission.\n const bridgeTxId = burn?.txHash ?? burn?.data?.txHash ?? '';\n const attestationId = burn?.data?.attestationId ?? null;\n const explorerUrl =\n burn?.explorerUrl ??\n approve?.explorerUrl ??\n findExplorerUrl(steps) ??\n (bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null);\n\n // If we have no bridge transaction hash, we can't proceed with CCTP flow.\n // This happens if the user approved but rejected the burn, or if bridge-kit failed to capture it.\n if (!bridgeTxId) {\n const stepNames = steps.map((s) => s.name).join(', ');\n logger.logError(createDepositError('BRIDGE_FAILED', 'Missing bridge (burn) tx hash in Bridge Kit response', {\n context: { stepNames },\n }));\n // Throwing here triggers the cleanup in useBridgeDeposit\n throw new Error('Bridge transaction failed: No burn transaction found. Please try again.');\n }\n\n const depositId = bridgeTxId;\n\n return {\n bridgeTxId,\n depositId,\n attestationId,\n explorerUrl,\n };\n }\n\n async submitBridge(params: CctpBridgeParams): Promise<CctpBridgeResult> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n if (!params.wallet) {\n throw new Error('Wallet client is required for CCTP bridge submission');\n }\n\n // Validate amount before submitting to the bridge\n const amountNum = Number(params.amount);\n if (!params.amount || !Number.isFinite(amountNum) || amountNum <= 0) {\n throw new Error('Invalid bridge amount: must be a positive number');\n }\n\n try {\n // Initialize SDK\n const kit = new BridgeKit();\n\n // Map chains to BridgeKit's expected format\n const mappedFromChain = mapChainToBridgeKit(params.fromChain);\n const mappedToChain = mapChainToBridgeKit(params.toChain);\n\n // Ensure we are on the correct source chain (for EVM)\n if (mappedFromChain && typeof mappedFromChain === 'object' && mappedFromChain.type === 'evm' && 'chainId' in mappedFromChain) {\n const targetChainId = mappedFromChain.chainId;\n if (params.wallet && typeof params.wallet.request === 'function') {\n try {\n const currentChainIdHex = await params.wallet.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n // Only check, but don't try to switch here since Dynamic should have handled it.\n // If we are still on the wrong chain, log a warning and let it fail (or maybe Dynamic is still updating).\n if (currentChainId !== targetChainId) {\n logger.warn(`[CCTP] Chain mismatch detected in BridgeKitClient. Expected ${targetChainId}, got ${currentChainId}. Dynamic switch might have failed or is pending.`);\n\n // Optional: We could wait a bit more here if we think it's just a race condition\n // await new Promise(resolve => setTimeout(resolve, 2000));\n } else {\n logger.info('[CCTP] Chain check passed');\n }\n } catch (checkErr) {\n logger.warn('[CCTP] Failed to check chain ID', checkErr);\n }\n }\n }\n\n // Initialize Viem adapter\n // Expects params.wallet to be an EIP1193Provider\n // @ts-ignore - Viem adapter types might mismatch\n const sourceAdapter = await createAdapterFromProvider({ provider: params.wallet });\n\n // Create a minimal *read-only* destination adapter to satisfy BridgeKit validation.\n //\n // Bridge Kit v1.5+ will call `prepareAction(\"native.balanceOf\")` on the destination\n // adapter as part of preflight checks. Previously we threw here, which causes the\n // bridge to fail before \"burn\" is submitted.\n //\n // This adapter intentionally does NOT sign or send Solana transactions. If Bridge Kit\n // attempts to execute the destination-side \"mint\" step, that step should fail in a\n // recoverable way (BridgeResult.state === \"error\") while still returning the successful\n // \"approve\"/\"burn\" step tx hashes.\n const dummyDestAdapter = {\n chainType: 'solana' as const,\n getAddress: async () => params.destinationAddress,\n getChain: async () => mappedToChain,\n capabilities: {\n // We control the destination address here; Bridge Kit may include it in contexts.\n addressContext: 'developer-controlled' as const,\n supportedChains: [mappedToChain],\n },\n actionRegistry: {} as any,\n prepareAction: async (...args: any[]) => {\n // Expected usage in Bridge Kit v1.5+: prepareAction(\"native.balanceOf\", { walletAddress }, ctx)\n logger.debug('[CCTP] prepareAction', { args });\n\n const action = args?.[0];\n if (action === 'native.balanceOf') {\n // Return a large synthetic balance (lamports) so preflight passes.\n // We do not rely on destination native balance for our flow since we claim via Bridge Assist.\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt('10000000000'),\n };\n }\n\n if (action === 'usdc.balanceOf') {\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt(0),\n };\n }\n\n // Unknown action: surface a recoverable error via the execute path\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error(`Destination adapter does not support action \"${String(action)}\"`);\n },\n };\n },\n prepare: async (...args: any[]) => {\n logger.debug('[CCTP] prepare', { args });\n // Do not throw here; return a prepared request so Bridge Kit can\n // mark the destination step as failed during execute (recoverable).\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error('Destination adapter is read-only (mint not supported)');\n },\n };\n },\n waitForTransaction: async (...args: any[]) => {\n logger.debug('[CCTP] waitForTransaction', { args });\n throw new Error('Destination adapter is read-only (waitForTransaction not supported)');\n },\n validateChainSupport: (...args: any[]) => {\n logger.debug('[CCTP] validateChainSupport', { args });\n return;\n },\n switchToChain: async (...args: any[]) => {\n logger.debug('[CCTP] switchToChain', { args });\n return;\n },\n calculateTransactionFee: async () => BigInt(0),\n } as any;\n\n // Listen to all events to debug/find the right one\n kit.on('*', (payload: any) => {\n logger.debug('[CCTP] Bridge event', payload);\n });\n\n // We wrap the bridge call to allow capturing state changes\n const bridgePromise = await kit.bridge({\n amount: params.amount,\n from: {\n adapter: sourceAdapter,\n chain: mappedFromChain,\n },\n to: {\n adapter: dummyDestAdapter,\n chain: mappedToChain,\n recipientAddress: params.destinationAddress,\n // Bridge Kit requires `address` when the adapter is developer-controlled.\n // Without it, preflight throws:\n // \"Address is required in context for developer-controlled adapters...\"\n address: params.destinationAddress,\n },\n });\n\n // We await the result, assuming BridgeKit handles the flow. \n // If it fails at minting (due to dummy adapter), we should catch it but checking if we have burn tx.\n let result: any;\n try {\n result = await bridgePromise;\n logger.info('[CCTP] Bridge result:', JSON.stringify(result, (key, value) =>\n typeof value === 'bigint'\n ? value.toString()\n : value // return everything else unchanged\n , 2));\n } catch (bridgeError) {\n // If we crashed, check if we at least got the burn tx\n // But we can't easily inspect intermediate state from here unless we captured it via events\n // For now, rethrow if we don't have a partial result mechanism\n logger.warn('[CCTP] Bridge call failed, possibly at mint stage', bridgeError);\n throw bridgeError;\n }\n\n return this.parseSubmitResponse(result);\n } catch (error) {\n const message =\n (error as { message?: string })?.message ?? 'CCTP bridge submission failed';\n logger.logError(createDepositError('BRIDGE_FAILED', message, {\n cause: error instanceof Error ? error : undefined,\n context: {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n },\n }));\n throw new Error(message);\n }\n }\n\n async waitForConfirmation(\n bridgeTxId: string,\n attestationId?: string | null\n ): Promise<CctpConfirmationResult> {\n // Fallback implementation since getAttestation is not directly exposed.\n // We assume if bridge returned successfully (in submitBridge), we might have mint info.\n // But if we are polling after page reload, we don't have the kit instance.\n\n // TODO: Implement direct Circle API check for attestation status if needed.\n // https://iris-api.circle.com/v1/attestations/{txHash}\n\n // Return partial result to allow UI to show \"Bridge Submitted\"\n return {\n mintTxId: attestationId ?? bridgeTxId,\n explorerUrl: bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null\n };\n }\n\n async getAttestation(txHash: string, fromChain: string): Promise<{\n attestation: string;\n message: string;\n decodedMessage?: {\n sourceDomain: string;\n destinationDomain: string;\n nonce: string;\n sender: string;\n recipient: string;\n decodedMessageBody?: {\n mintRecipient?: string;\n amount?: string;\n burnToken?: string;\n messageSender?: string;\n };\n };\n } | null> {\n try {\n const mappedChain = mapChainToBridgeKit(fromChain);\n const domain = getDomain(mappedChain);\n\n if (domain === undefined) {\n throw new Error(`Domain not found for chain ${fromChain}`);\n }\n\n // Circle Iris API - mainnet vs testnet\n // Using Iris API v2 endpoint: https://iris-api.circle.com/v2/messages/{domain}?transactionHash={txHash}\n // sourceDomainId mapping: 0 for Ethereum, 3 for Arbitrum, 6 for Base\n const defaultIrisUrl = isTestnet ? 'https://iris-api-sandbox.circle.com' : 'https://iris-api.circle.com';\n const baseUrl = process.env.NEXT_PUBLIC_CIRCLE_IRIS_API_URL || defaultIrisUrl;\n\n logger.info('[CCTP] Fetching from Iris API', {\n url: `${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`,\n domain,\n txHash,\n fromChain,\n });\n\n const response = await fetch(`${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`);\n if (!response.ok) {\n logger.warn('[CCTP] Iris API response not ok', {\n status: response.status,\n statusText: response.statusText,\n });\n return null;\n }\n const data = await response.json();\n const messageData = data.messages?.[0];\n\n if (messageData && messageData.attestation && messageData.message && messageData.status === 'complete') {\n logger.info('[CCTP] Iris API data retrieved', {\n hasAttestation: !!messageData.attestation,\n hasMessage: !!messageData.message,\n hasDecodedMessage: !!messageData.decodedMessage,\n decodedMessageBody: messageData.decodedMessage?.decodedMessageBody,\n });\n\n return {\n attestation: messageData.attestation,\n message: messageData.message,\n decodedMessage: messageData.decodedMessage ? {\n sourceDomain: messageData.decodedMessage.sourceDomain,\n destinationDomain: messageData.decodedMessage.destinationDomain,\n nonce: messageData.decodedMessage.nonce,\n sender: messageData.decodedMessage.sender,\n recipient: messageData.decodedMessage.recipient,\n decodedMessageBody: messageData.decodedMessage.decodedMessageBody,\n } : undefined,\n };\n }\n\n logger.warn('[CCTP] Message data incomplete or not ready', {\n hasMessageData: !!messageData,\n status: messageData?.status,\n hasAttestation: !!messageData?.attestation,\n hasMessage: !!messageData?.message,\n });\n return null;\n } catch (error) {\n logger.logError(createNetworkError('RPC_FAILED', 'Failed to fetch attestation from Iris API', {\n cause: error instanceof Error ? error : undefined,\n context: { txHash, fromChain },\n }));\n return null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bridgeKitClient.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/cctp/bridgeKitClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CctpBridgeParams,\n CctpBridgeResult,\n CctpClient,\n CctpConfirmationResult,\n} from './types';\nimport { logger } from '../../../utils/logger';\nimport { EVENTS, createDepositEvent } from '../../../utils/events';\nimport { createDepositError, createNetworkError } from '../../../utils/errors';\nimport { explorerBaseForChain } from '../utils/explorerUrl';\nimport { BridgeKit } from '@circle-fin/bridge-kit';\nimport { createAdapterFromProvider } from '@circle-fin/adapter-viem-v2';\nimport {\n SolanaDevnet,\n ArbitrumSepolia,\n BaseSepolia,\n EthereumSepolia,\n Solana,\n Arbitrum,\n Base,\n Ethereum,\n} from '@circle-fin/bridge-kit/chains';\n\nimport { IS_TESTNET as isTestnet } from '../../../config/network';\n\ninterface BridgeStep {\n name?: string;\n state?: string;\n txHash?: string;\n explorerUrl?: string;\n data?: {\n attestationId?: string;\n txHash?: string;\n status?: string;\n txIndex?: number;\n attestation?: string;\n message?: string;\n };\n}\n\ninterface BridgeResponse {\n steps?: BridgeStep[];\n}\n\nconst findExplorerUrl = (steps: BridgeStep[]): string | null => {\n const withUrl = steps.find((s) => s.explorerUrl);\n return withUrl?.explorerUrl ?? null;\n};\n\n/**\n * Maps normalized chain names to BridgeKit's chain definition objects.\n * Returns mainnet or testnet chains based on NEXT_PUBLIC_TESTNET env var.\n */\nexport const mapChainToBridgeKit = (chain: string): any => {\n if (!chain || typeof chain !== 'string') {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Invalid chain identifier: ${chain}`, {\n context: { chain },\n }));\n throw new Error(`Invalid chain identifier: ${chain}. Expected a valid chain name string.`);\n }\n\n const lower = chain.toLowerCase().trim();\n if (!lower) {\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', 'Empty chain string provided'));\n throw new Error('Chain identifier cannot be empty.');\n }\n\n if (lower === 'arbitrum' || lower === 'arb') {\n return isTestnet ? ArbitrumSepolia : Arbitrum;\n }\n if (lower === 'solana') {\n return isTestnet ? SolanaDevnet : Solana;\n }\n if (lower === 'base') {\n return isTestnet ? BaseSepolia : Base;\n }\n if (lower === 'ethereum' || lower === 'evm') {\n return isTestnet ? EthereumSepolia : Ethereum;\n }\n\n // For other chains, log a warning and throw an error instead of returning as-is\n // This helps catch configuration issues early\n logger.logError(createNetworkError('CHAIN_UNSUPPORTED', `Unsupported chain \"${chain}\"`, {\n context: { chain, lower },\n }));\n throw new Error(`Unsupported chain \"${chain}\". Supported chains: arbitrum, base, ethereum, solana`);\n};\n\nexport const getDomain = (chain: any): number | undefined => {\n return chain?.cctp?.domain;\n}\n\n/**\n * Bridge Kit client wrapper. Keeps network interactions isolated for auditability.\n */\nexport class BridgeKitClient implements CctpClient {\n /**\n * Parses Bridge Kit response to extract transaction hashes and attestation ID.\n * Handles variations in step naming and falls back to timestamp-based deposit ID if needed.\n */\n private parseSubmitResponse(response: BridgeResponse): CctpBridgeResult {\n const steps = response.steps ?? [];\n const approve = steps.find((s) => s.name === 'approve' || s.name === 'APPROVE');\n const burn = steps.find((s) => s.name === 'burn' || s.name === 'BURN' || s.name === 'bridge');\n // FIX: Do NOT fall back to approve.txHash. We need the burn/bridge tx for attestation.\n // If burn is missing, we shouldn't consider this a successful bridge submission.\n const bridgeTxId = burn?.txHash ?? burn?.data?.txHash ?? '';\n const attestationId = burn?.data?.attestationId ?? null;\n const explorerUrl =\n burn?.explorerUrl ??\n approve?.explorerUrl ??\n findExplorerUrl(steps) ??\n (bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null);\n\n // If we have no bridge transaction hash, we can't proceed with CCTP flow.\n // This happens if the user approved but rejected the burn, or if bridge-kit failed to capture it.\n if (!bridgeTxId) {\n const stepNames = steps.map((s) => s.name).join(', ');\n logger.logError(createDepositError('BRIDGE_FAILED', 'Missing bridge (burn) tx hash in Bridge Kit response', {\n context: { stepNames },\n }));\n // Throwing here triggers the cleanup in useBridgeDeposit\n throw new Error('Bridge transaction failed: No burn transaction found. Please try again.');\n }\n\n const depositId = bridgeTxId;\n\n return {\n bridgeTxId,\n depositId,\n attestationId,\n explorerUrl,\n };\n }\n\n async submitBridge(params: CctpBridgeParams): Promise<CctpBridgeResult> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n\n if (!params.wallet) {\n throw new Error('Wallet client is required for CCTP bridge submission');\n }\n\n // Validate amount before submitting to the bridge\n const amountNum = Number(params.amount);\n if (!params.amount || !Number.isFinite(amountNum) || amountNum <= 0) {\n throw new Error('Invalid bridge amount: must be a positive number');\n }\n\n try {\n // Initialize SDK\n const kit = new BridgeKit();\n\n // Map chains to BridgeKit's expected format\n const mappedFromChain = mapChainToBridgeKit(params.fromChain);\n const mappedToChain = mapChainToBridgeKit(params.toChain);\n\n // Ensure we are on the correct source chain (for EVM)\n if (mappedFromChain && typeof mappedFromChain === 'object' && mappedFromChain.type === 'evm' && 'chainId' in mappedFromChain) {\n const targetChainId = mappedFromChain.chainId;\n if (params.wallet && typeof params.wallet.request === 'function') {\n try {\n const currentChainIdHex = await params.wallet.request({ method: 'eth_chainId' });\n const currentChainId = parseInt(currentChainIdHex, 16);\n\n // Only check, but don't try to switch here since Dynamic should have handled it.\n // If we are still on the wrong chain, log a warning and let it fail (or maybe Dynamic is still updating).\n if (currentChainId !== targetChainId) {\n logger.warn(`[CCTP] Chain mismatch detected in BridgeKitClient. Expected ${targetChainId}, got ${currentChainId}. Dynamic switch might have failed or is pending.`);\n\n // Optional: We could wait a bit more here if we think it's just a race condition\n // await new Promise(resolve => setTimeout(resolve, 2000));\n } else {\n logger.info('[CCTP] Chain check passed');\n }\n } catch (checkErr) {\n logger.warn('[CCTP] Failed to check chain ID', checkErr);\n }\n }\n }\n\n // Initialize Viem adapter\n // Expects params.wallet to be an EIP1193Provider\n // @ts-ignore - Viem adapter types might mismatch\n const sourceAdapter = await createAdapterFromProvider({ provider: params.wallet });\n\n // Create a minimal *read-only* destination adapter to satisfy BridgeKit validation.\n //\n // Bridge Kit v1.5+ will call `prepareAction(\"native.balanceOf\")` on the destination\n // adapter as part of preflight checks. Previously we threw here, which causes the\n // bridge to fail before \"burn\" is submitted.\n //\n // This adapter intentionally does NOT sign or send Solana transactions. If Bridge Kit\n // attempts to execute the destination-side \"mint\" step, that step should fail in a\n // recoverable way (BridgeResult.state === \"error\") while still returning the successful\n // \"approve\"/\"burn\" step tx hashes.\n const dummyDestAdapter = {\n chainType: 'solana' as const,\n getAddress: async () => params.destinationAddress,\n getChain: async () => mappedToChain,\n capabilities: {\n // We control the destination address here; Bridge Kit may include it in contexts.\n addressContext: 'developer-controlled' as const,\n supportedChains: [mappedToChain],\n },\n actionRegistry: {} as any,\n prepareAction: async (...args: any[]) => {\n // Expected usage in Bridge Kit v1.5+: prepareAction(\"native.balanceOf\", { walletAddress }, ctx)\n logger.debug('[CCTP] prepareAction', { args });\n\n const action = args?.[0];\n if (action === 'native.balanceOf') {\n // Return a large synthetic balance (lamports) so preflight passes.\n // We do not rely on destination native balance for our flow since we claim via Bridge Assist.\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt('10000000000'),\n };\n }\n\n if (action === 'usdc.balanceOf') {\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => BigInt(0),\n };\n }\n\n // Unknown action: surface a recoverable error via the execute path\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error(`Destination adapter does not support action \"${String(action)}\"`);\n },\n };\n },\n prepare: async (...args: any[]) => {\n logger.debug('[CCTP] prepare', { args });\n // Do not throw here; return a prepared request so Bridge Kit can\n // mark the destination step as failed during execute (recoverable).\n return {\n estimate: async () => ({ gas: BigInt(0), gasPrice: BigInt(0), fee: '0' }),\n execute: async () => {\n throw new Error('Destination adapter is read-only (mint not supported)');\n },\n };\n },\n waitForTransaction: async (...args: any[]) => {\n logger.debug('[CCTP] waitForTransaction', { args });\n throw new Error('Destination adapter is read-only (waitForTransaction not supported)');\n },\n validateChainSupport: (...args: any[]) => {\n logger.debug('[CCTP] validateChainSupport', { args });\n return;\n },\n switchToChain: async (...args: any[]) => {\n logger.debug('[CCTP] switchToChain', { args });\n return;\n },\n calculateTransactionFee: async () => BigInt(0),\n } as any;\n\n // Listen to all events to debug/find the right one\n kit.on('*', (payload: any) => {\n logger.debug('[CCTP] Bridge event', payload);\n });\n\n // We wrap the bridge call to allow capturing state changes\n const bridgePromise = await kit.bridge({\n amount: params.amount,\n from: {\n adapter: sourceAdapter,\n chain: mappedFromChain,\n },\n to: {\n adapter: dummyDestAdapter,\n chain: mappedToChain,\n recipientAddress: params.destinationAddress,\n // Bridge Kit requires `address` when the adapter is developer-controlled.\n // Without it, preflight throws:\n // \"Address is required in context for developer-controlled adapters...\"\n address: params.destinationAddress,\n },\n });\n\n // We await the result, assuming BridgeKit handles the flow. \n // If it fails at minting (due to dummy adapter), we should catch it but checking if we have burn tx.\n let result: any;\n try {\n result = await bridgePromise;\n logger.info('[CCTP] Bridge result:', JSON.stringify(result, (key, value) =>\n typeof value === 'bigint'\n ? value.toString()\n : value // return everything else unchanged\n , 2));\n } catch (bridgeError) {\n // If we crashed, check if we at least got the burn tx\n // But we can't easily inspect intermediate state from here unless we captured it via events\n // For now, rethrow if we don't have a partial result mechanism\n logger.warn('[CCTP] Bridge call failed, possibly at mint stage', bridgeError);\n throw bridgeError;\n }\n\n return this.parseSubmitResponse(result);\n } catch (error) {\n const message =\n (error as { message?: string })?.message ?? 'CCTP bridge submission failed';\n logger.logError(createDepositError('BRIDGE_FAILED', message, {\n cause: error instanceof Error ? error : undefined,\n context: {\n fromChain: params.fromChain,\n toChain: params.toChain,\n amount: params.amount,\n },\n }));\n throw new Error(message);\n }\n }\n\n async waitForConfirmation(\n bridgeTxId: string,\n attestationId?: string | null\n ): Promise<CctpConfirmationResult> {\n // Fallback implementation since getAttestation is not directly exposed.\n // We assume if bridge returned successfully (in submitBridge), we might have mint info.\n // But if we are polling after page reload, we don't have the kit instance.\n\n // TODO: Implement direct Circle API check for attestation status if needed.\n // https://iris-api.circle.com/v1/attestations/{txHash}\n\n // Return partial result to allow UI to show \"Bridge Submitted\"\n return {\n mintTxId: attestationId ?? bridgeTxId,\n explorerUrl: bridgeTxId ? `${explorerBaseForChain('ethereum') ?? ''}/${bridgeTxId}` : null\n };\n }\n\n async getAttestation(txHash: string, fromChain: string): Promise<{\n attestation: string;\n message: string;\n decodedMessage?: {\n sourceDomain: string;\n destinationDomain: string;\n nonce: string;\n sender: string;\n recipient: string;\n decodedMessageBody?: {\n mintRecipient?: string;\n amount?: string;\n burnToken?: string;\n messageSender?: string;\n };\n };\n } | null> {\n try {\n const mappedChain = mapChainToBridgeKit(fromChain);\n const domain = getDomain(mappedChain);\n\n if (domain === undefined) {\n throw new Error(`Domain not found for chain ${fromChain}`);\n }\n\n // Circle Iris API - mainnet vs testnet\n // Using Iris API v2 endpoint: https://iris-api.circle.com/v2/messages/{domain}?transactionHash={txHash}\n // sourceDomainId mapping: 0 for Ethereum, 3 for Arbitrum, 6 for Base\n const defaultIrisUrl = isTestnet ? 'https://iris-api-sandbox.circle.com' : 'https://iris-api.circle.com';\n const baseUrl = process.env.NEXT_PUBLIC_CIRCLE_IRIS_API_URL || defaultIrisUrl;\n\n logger.info('[CCTP] Fetching from Iris API', {\n url: `${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`,\n domain,\n txHash,\n fromChain,\n });\n\n const response = await fetch(`${baseUrl}/v2/messages/${domain}?transactionHash=${txHash}`);\n if (!response.ok) {\n logger.warn('[CCTP] Iris API response not ok', {\n status: response.status,\n statusText: response.statusText,\n });\n return null;\n }\n const data = await response.json();\n const messageData = data.messages?.[0];\n\n if (messageData && messageData.attestation && messageData.message && messageData.status === 'complete') {\n logger.info('[CCTP] Iris API data retrieved', {\n hasAttestation: !!messageData.attestation,\n hasMessage: !!messageData.message,\n hasDecodedMessage: !!messageData.decodedMessage,\n decodedMessageBody: messageData.decodedMessage?.decodedMessageBody,\n });\n\n return {\n attestation: messageData.attestation,\n message: messageData.message,\n decodedMessage: messageData.decodedMessage ? {\n sourceDomain: messageData.decodedMessage.sourceDomain,\n destinationDomain: messageData.decodedMessage.destinationDomain,\n nonce: messageData.decodedMessage.nonce,\n sender: messageData.decodedMessage.sender,\n recipient: messageData.decodedMessage.recipient,\n decodedMessageBody: messageData.decodedMessage.decodedMessageBody,\n } : undefined,\n };\n }\n\n logger.warn('[CCTP] Message data incomplete or not ready', {\n hasMessageData: !!messageData,\n status: messageData?.status,\n hasAttestation: !!messageData?.attestation,\n hasMessage: !!messageData?.message,\n });\n return null;\n } catch (error) {\n logger.logError(createNetworkError('RPC_FAILED', 'Failed to fetch attestation from Iris API', {\n cause: error instanceof Error ? error : undefined,\n context: { txHash, fromChain },\n }));\n return null;\n }\n }\n}\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { shortenAddress } from '../../../utils/shortenString';
|
|
3
|
-
import {
|
|
4
|
-
// Network selection based on NEXT_PUBLIC_TESTNET env var (default: true for testnet)
|
|
5
|
-
var isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';
|
|
3
|
+
import { getSolanaExplorerTxUrl, getSolanaExplorerAddressUrl } from '../constants/withdrawal';
|
|
6
4
|
/**
|
|
7
5
|
* Displays transaction details in a formatted table.
|
|
8
6
|
* Shows amount, status, network, addresses, and transaction IDs with explorer links.
|
|
@@ -64,13 +62,10 @@ export function TransactionTable(_a) {
|
|
|
64
62
|
// Get explorer URL for transaction ID or address
|
|
65
63
|
var getExplorerLink = function (key, value) {
|
|
66
64
|
if (key === 'tx') {
|
|
67
|
-
return
|
|
65
|
+
return getSolanaExplorerTxUrl(value);
|
|
68
66
|
}
|
|
69
67
|
if (key === 'from') {
|
|
70
|
-
|
|
71
|
-
return isTestnet
|
|
72
|
-
? "https://explorer.solana.com/address/".concat(value, "?cluster=devnet")
|
|
73
|
-
: "https://explorer.solana.com/address/".concat(value);
|
|
68
|
+
return getSolanaExplorerAddressUrl(value);
|
|
74
69
|
}
|
|
75
70
|
return '';
|
|
76
71
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionTable.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/TransactionTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import { TableValues } from '../types';\nimport { shortenAddress } from '../../../utils/shortenString';\nimport { getSolanaExplorerUrl } from '../utils/deposit/solanaDepositTransaction';\n\n// Network selection based on NEXT_PUBLIC_TESTNET env var (default: true for testnet)\nconst isTestnet = process.env.NEXT_PUBLIC_TESTNET !== 'false';\n\ninterface TransactionTableProps {\n tableValues: TableValues & {\n amount?: { text: string; visible: boolean; typing: boolean };\n };\n onClose?: () => void;\n}\n\n/**\n * Displays transaction details in a formatted table.\n * Shows amount, status, network, addresses, and transaction IDs with explorer links.\n * Formats addresses with ellipsis and applies color coding based on status.\n */\nexport function TransactionTable({\n tableValues,\n onClose,\n}: TransactionTableProps) {\n // Friendly labels for the keys\n const getLabel = (key: string) => {\n const labels: Record<string, string> = {\n amount: 'Amount',\n tx: 'Transaction ID',\n from: 'From',\n to: 'To',\n network: 'Network',\n status: 'Status',\n };\n\n return labels[key] || key;\n };\n\n // Get appropriate color for values based on key\n const getValueStyles = (key: string, value: string) => {\n if (key === 'status') {\n if (\n value.toLowerCase().includes('success') ||\n value.toLowerCase().includes('confirmed')\n ) {\n return 'text-emerald-500 font-medium';\n }\n if (value.toLowerCase().includes('pending')) {\n return 'text-amber-400 font-medium';\n }\n if (\n value.toLowerCase().includes('fail') ||\n value.toLowerCase().includes('error')\n ) {\n return 'text-red-400 font-medium';\n }\n }\n\n if (key === 'tx') {\n return 'text-n1-ww-gray-200 text-xs font-medium hover:text-n1-ww-main-400 transition-colors duration-200';\n }\n\n if (key === 'network') {\n return 'text-purple-400 font-medium';\n }\n\n if (key === 'from' || key === 'to') {\n return 'text-n1-ww-gray-200 text-xs font-medium hover:text-n1-ww-main-400 transition-colors duration-200';\n }\n\n if (key === 'amount') {\n return 'text-emerald-500 font-semibold';\n }\n\n return 'text-n1-ww-gray-50 font-medium';\n };\n\n // Format display value with ellipsis for long text\n const getDisplayValue = (key: string, value: string) => {\n if (key === 'tx') {\n return shortenAddress(value, 5, 4);\n }\n\n if (key === 'from' || key === 'to') {\n return shortenAddress(value, 5, 4);\n }\n\n return value;\n };\n\n // Get explorer URL for transaction ID or address\n const getExplorerLink = (key: string, value: string) => {\n\n if (key === 'tx') {\n return getSolanaExplorerUrl(value);\n }\n\n if (key === 'from') {\n // Mainnet doesn't need cluster param, devnet needs ?cluster=devnet\n return isTestnet\n ? `https://explorer.solana.com/address/${value}?cluster=devnet`\n : `https://explorer.solana.com/address/${value}`;\n }\n\n return '';\n };\n\n // Order of fields to display\n const fieldOrder = ['amount', 'status', 'network', 'from', 'to', 'tx'];\n\n // Sort entries based on fieldOrder\n const sortedEntries = Object.entries(tableValues).sort(([keyA], [keyB]) => {\n const indexA = fieldOrder.indexOf(keyA);\n const indexB = fieldOrder.indexOf(keyB);\n return (indexA === -1 ? 999 : indexA) - (indexB === -1 ? 999 : indexB);\n });\n\n return (\n <div className=\"relative w-full h-full bg-n1-ww-gray-950 border border-n1-ww-border p-5 rounded-sm flex flex-col justify-center\">\n {onClose && (\n <button\n onClick={onClose}\n className=\"absolute top-3 right-2 text-n1-ww-gray-600 hover:text-n1-ww-gray-300 transition-colors duration-200 focus:outline-none\"\n aria-label=\"Close details\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n <div className=\"space-y-3 text-sm pt-5\">\n {sortedEntries.map(([key, value]) => (\n <div key={key} className=\"flex items-center justify-between py-2 \">\n <span className=\"text-n1-ww-gray-400 font-medium min-w-[120px]\">\n {getLabel(key)}\n </span>\n <div\n className={`relative transition-all duration-300 ${value.visible ? 'opacity-100' : 'opacity-0'} max-w-[65%] text-right flex-1`}\n >\n {(key === 'tx' || key === 'from') &&\n getExplorerLink(key, value.text) ? (\n <a\n href={getExplorerLink(key, value.text)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${getValueStyles(key, value.text)} break-all inline-block group`}\n title={value.text}\n >\n <span className=\"underline hover:font-bold\">\n {getDisplayValue(key, value.text)}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-3 w-3 ml-1 inline-block opacity-50 group-hover:opacity-100 transition-opacity duration-200\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n </a>\n ) : (\n <span\n className={`${getValueStyles(key, value.text)} break-all inline-block`}\n title={value.text}\n >\n {value.text}\n </span>\n )}\n {value.typing && (\n <span className=\"inline-block ml-1 w-[2px] h-[14px] bg-n1-ww-main-400 n1-ww-animate-pulse\"></span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TransactionTable.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/TransactionTable.tsx"],"names":[],"mappings":"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","sourcesContent":["import { TableValues } from '../types';\nimport { shortenAddress } from '../../../utils/shortenString';\nimport { getSolanaExplorerTxUrl, getSolanaExplorerAddressUrl } from '../constants/withdrawal';\n\ninterface TransactionTableProps {\n tableValues: TableValues & {\n amount?: { text: string; visible: boolean; typing: boolean };\n };\n onClose?: () => void;\n}\n\n/**\n * Displays transaction details in a formatted table.\n * Shows amount, status, network, addresses, and transaction IDs with explorer links.\n * Formats addresses with ellipsis and applies color coding based on status.\n */\nexport function TransactionTable({\n tableValues,\n onClose,\n}: TransactionTableProps) {\n // Friendly labels for the keys\n const getLabel = (key: string) => {\n const labels: Record<string, string> = {\n amount: 'Amount',\n tx: 'Transaction ID',\n from: 'From',\n to: 'To',\n network: 'Network',\n status: 'Status',\n };\n\n return labels[key] || key;\n };\n\n // Get appropriate color for values based on key\n const getValueStyles = (key: string, value: string) => {\n if (key === 'status') {\n if (\n value.toLowerCase().includes('success') ||\n value.toLowerCase().includes('confirmed')\n ) {\n return 'text-emerald-500 font-medium';\n }\n if (value.toLowerCase().includes('pending')) {\n return 'text-amber-400 font-medium';\n }\n if (\n value.toLowerCase().includes('fail') ||\n value.toLowerCase().includes('error')\n ) {\n return 'text-red-400 font-medium';\n }\n }\n\n if (key === 'tx') {\n return 'text-n1-ww-gray-200 text-xs font-medium hover:text-n1-ww-main-400 transition-colors duration-200';\n }\n\n if (key === 'network') {\n return 'text-purple-400 font-medium';\n }\n\n if (key === 'from' || key === 'to') {\n return 'text-n1-ww-gray-200 text-xs font-medium hover:text-n1-ww-main-400 transition-colors duration-200';\n }\n\n if (key === 'amount') {\n return 'text-emerald-500 font-semibold';\n }\n\n return 'text-n1-ww-gray-50 font-medium';\n };\n\n // Format display value with ellipsis for long text\n const getDisplayValue = (key: string, value: string) => {\n if (key === 'tx') {\n return shortenAddress(value, 5, 4);\n }\n\n if (key === 'from' || key === 'to') {\n return shortenAddress(value, 5, 4);\n }\n\n return value;\n };\n\n // Get explorer URL for transaction ID or address\n const getExplorerLink = (key: string, value: string) => {\n if (key === 'tx') {\n return getSolanaExplorerTxUrl(value);\n }\n\n if (key === 'from') {\n return getSolanaExplorerAddressUrl(value);\n }\n\n return '';\n };\n\n // Order of fields to display\n const fieldOrder = ['amount', 'status', 'network', 'from', 'to', 'tx'];\n\n // Sort entries based on fieldOrder\n const sortedEntries = Object.entries(tableValues).sort(([keyA], [keyB]) => {\n const indexA = fieldOrder.indexOf(keyA);\n const indexB = fieldOrder.indexOf(keyB);\n return (indexA === -1 ? 999 : indexA) - (indexB === -1 ? 999 : indexB);\n });\n\n return (\n <div className=\"relative w-full h-full bg-n1-ww-gray-950 border border-n1-ww-border p-5 rounded-sm flex flex-col justify-center\">\n {onClose && (\n <button\n onClick={onClose}\n className=\"absolute top-3 right-2 text-n1-ww-gray-600 hover:text-n1-ww-gray-300 transition-colors duration-200 focus:outline-none\"\n aria-label=\"Close details\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )}\n <div className=\"space-y-3 text-sm pt-5\">\n {sortedEntries.map(([key, value]) => (\n <div key={key} className=\"flex items-center justify-between py-2 \">\n <span className=\"text-n1-ww-gray-400 font-medium min-w-[120px]\">\n {getLabel(key)}\n </span>\n <div\n className={`relative transition-all duration-300 ${value.visible ? 'opacity-100' : 'opacity-0'} max-w-[65%] text-right flex-1`}\n >\n {(key === 'tx' || key === 'from') &&\n getExplorerLink(key, value.text) ? (\n <a\n href={getExplorerLink(key, value.text)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={`${getValueStyles(key, value.text)} break-all inline-block group`}\n title={value.text}\n >\n <span className=\"underline hover:font-bold\">\n {getDisplayValue(key, value.text)}\n </span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-3 w-3 ml-1 inline-block opacity-50 group-hover:opacity-100 transition-opacity duration-200\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n </a>\n ) : (\n <span\n className={`${getValueStyles(key, value.text)} break-all inline-block`}\n title={value.text}\n >\n {value.text}\n </span>\n )}\n {value.typing && (\n <span className=\"inline-block ml-1 w-[2px] h-[14px] bg-n1-ww-main-400 n1-ww-animate-pulse\"></span>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Centralized constants for the withdrawal / bridge flow.
|
|
3
|
-
*
|
|
4
|
-
* IS_TESTNET uses the same convention as the rest of the codebase:
|
|
5
|
-
* missing env var → testnet (safe default).
|
|
6
3
|
*/
|
|
7
|
-
|
|
4
|
+
import { IS_TESTNET } from '../../../config/network';
|
|
5
|
+
export { IS_TESTNET };
|
|
8
6
|
export declare const MINIMUM_WITHDRAWAL_AMOUNTS: {
|
|
9
7
|
readonly mainnet: 1;
|
|
10
8
|
readonly testnet: 1;
|
|
@@ -21,3 +19,5 @@ export declare const SOLANA_ATTESTATION_RETRY_BACKOFF_MS = 5000;
|
|
|
21
19
|
export declare const EVM_CLAIM_RECEIPT_TIMEOUT_MS = 120000;
|
|
22
20
|
export declare const EVM_CLAIM_RECEIPT_POLL_INTERVAL_MS = 3000;
|
|
23
21
|
export declare function getEvmExplorerTxUrl(chain: string, txHash: string): string;
|
|
22
|
+
export declare function getSolanaExplorerTxUrl(signature: string): string;
|
|
23
|
+
export declare function getSolanaExplorerAddressUrl(address: string): string;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Centralized constants for the withdrawal / bridge flow.
|
|
3
|
-
*
|
|
4
|
-
* IS_TESTNET uses the same convention as the rest of the codebase:
|
|
5
|
-
* missing env var → testnet (safe default).
|
|
6
3
|
*/
|
|
7
4
|
// ---------------------------------------------------------------------------
|
|
8
5
|
// Network detection
|
|
9
6
|
// ---------------------------------------------------------------------------
|
|
10
|
-
|
|
7
|
+
import { IS_TESTNET } from '../../../config/network';
|
|
8
|
+
export { IS_TESTNET };
|
|
11
9
|
// ---------------------------------------------------------------------------
|
|
12
10
|
// Withdrawal amounts
|
|
13
11
|
// ---------------------------------------------------------------------------
|
|
@@ -64,4 +62,15 @@ export function getEvmExplorerTxUrl(chain, txHash) {
|
|
|
64
62
|
var baseUrl = IS_TESTNET ? explorer.testnet : explorer.mainnet;
|
|
65
63
|
return "".concat(baseUrl, "/tx/").concat(txHash);
|
|
66
64
|
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Solana explorer helpers
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
var SOLANA_EXPLORER_BASE = 'https://explorer.solana.com';
|
|
69
|
+
var SOLANA_CLUSTER_PARAM = IS_TESTNET ? '?cluster=devnet' : '';
|
|
70
|
+
export function getSolanaExplorerTxUrl(signature) {
|
|
71
|
+
return "".concat(SOLANA_EXPLORER_BASE, "/tx/").concat(signature).concat(SOLANA_CLUSTER_PARAM);
|
|
72
|
+
}
|
|
73
|
+
export function getSolanaExplorerAddressUrl(address) {
|
|
74
|
+
return "".concat(SOLANA_EXPLORER_BASE, "/address/").concat(address).concat(SOLANA_CLUSTER_PARAM);
|
|
75
|
+
}
|
|
67
76
|
//# sourceMappingURL=withdrawal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withdrawal.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/constants/withdrawal.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"withdrawal.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/constants/withdrawal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAC9E,MAAM,CAAC,IAAM,0BAA0B,GAAG;IACxC,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;CACF,CAAC;AAEX,gDAAgD;AAChD,MAAM,CAAC,IAAM,cAAc,GAAG,UAAU;IACtC,CAAC,CAAC,0BAA0B,CAAC,OAAO;IACpC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC;AAEvC,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAC9E,+FAA+F;AAC/F,MAAM,CAAC,IAAM,kBAAkB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAErD,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,CAAC,IAAM,kBAAkB,GAAG;IAChC,kBAAkB;IAClB,qBAAqB;IACrB,UAAU;IACV,UAAU;CACF,CAAC;AAEX,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAC9E,MAAM,CAAC,IAAM,8BAA8B,GAAG,IAAK,CAAC;AACpD,MAAM,CAAC,IAAM,+BAA+B,GAAG,EAAE,CAAC,CAAC,mBAAmB;AAEtE,MAAM,CAAC,IAAM,6BAA6B,GAAG,MAAO,CAAC;AACrD,MAAM,CAAC,IAAM,mCAAmC,GAAG,IAAK,CAAC;AAEzD,MAAM,CAAC,IAAM,4BAA4B,GAAG,MAAO,CAAC;AACpD,MAAM,CAAC,IAAM,kCAAkC,GAAG,IAAK,CAAC;AAExD,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAC9E,IAAM,aAAa,GAAyD;IAC1E,QAAQ,EAAE;QACR,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,8BAA8B;KACxC;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,6BAA6B;KACvC;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,sBAAsB;QAC/B,OAAO,EAAE,8BAA8B;KACxC;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,MAAc;IAC/D,IAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC;IAChE,IAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjE,OAAO,UAAG,OAAO,iBAAO,MAAM,CAAE,CAAC;AACnC,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAC9E,IAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAC3D,IAAM,oBAAoB,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,UAAG,oBAAoB,iBAAO,SAAS,SAAG,oBAAoB,CAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,OAAO,UAAG,oBAAoB,sBAAY,OAAO,SAAG,oBAAoB,CAAE,CAAC;AAC7E,CAAC","sourcesContent":["/**\n * Centralized constants for the withdrawal / bridge flow.\n */\n\n// ---------------------------------------------------------------------------\n// Network detection\n// ---------------------------------------------------------------------------\nimport { IS_TESTNET } from '../../../config/network';\nexport { IS_TESTNET };\n\n// ---------------------------------------------------------------------------\n// Withdrawal amounts\n// ---------------------------------------------------------------------------\nexport const MINIMUM_WITHDRAWAL_AMOUNTS = {\n mainnet: 1,\n testnet: 1,\n} as const;\n\n/** Resolved minimum for the current network. */\nexport const MIN_WITHDRAWAL = IS_TESTNET\n ? MINIMUM_WITHDRAWAL_AMOUNTS.testnet\n : MINIMUM_WITHDRAWAL_AMOUNTS.mainnet;\n\n// ---------------------------------------------------------------------------\n// Nord token IDs\n// ---------------------------------------------------------------------------\n/** Testnet uses tokenId=1 (USDC_2, Token-2022), mainnet uses tokenId=0 (standard SPL USDC). */\nexport const NORD_USDC_TOKEN_ID = IS_TESTNET ? 1 : 0;\n\n// ---------------------------------------------------------------------------\n// Resumable statuses (burn completed — safe to resume from bridging/claiming)\n// ---------------------------------------------------------------------------\nexport const RESUMABLE_STATUSES = [\n 'burned_on_solana',\n 'submitted_to_bridge',\n 'attested',\n 'claiming',\n] as const;\n\n// ---------------------------------------------------------------------------\n// Polling / timeout defaults\n// ---------------------------------------------------------------------------\nexport const BRIDGE_ASSIST_POLL_INTERVAL_MS = 5_000;\nexport const BRIDGE_ASSIST_MAX_POLL_ATTEMPTS = 60; // 60 × 5 s = 5 min\n\nexport const SOLANA_ATTESTATION_TIMEOUT_MS = 120_000;\nexport const SOLANA_ATTESTATION_RETRY_BACKOFF_MS = 5_000;\n\nexport const EVM_CLAIM_RECEIPT_TIMEOUT_MS = 120_000;\nexport const EVM_CLAIM_RECEIPT_POLL_INTERVAL_MS = 3_000;\n\n// ---------------------------------------------------------------------------\n// EVM explorer helpers\n// ---------------------------------------------------------------------------\nconst EVM_EXPLORERS: Record<string, { mainnet: string; testnet: string }> = {\n ethereum: {\n mainnet: 'https://etherscan.io',\n testnet: 'https://sepolia.etherscan.io',\n },\n arbitrum: {\n mainnet: 'https://arbiscan.io',\n testnet: 'https://sepolia.arbiscan.io',\n },\n base: {\n mainnet: 'https://basescan.org',\n testnet: 'https://sepolia.basescan.org',\n },\n};\n\nexport function getEvmExplorerTxUrl(chain: string, txHash: string): string {\n const explorer = EVM_EXPLORERS[chain] || EVM_EXPLORERS.ethereum;\n const baseUrl = IS_TESTNET ? explorer.testnet : explorer.mainnet;\n return `${baseUrl}/tx/${txHash}`;\n}\n\n// ---------------------------------------------------------------------------\n// Solana explorer helpers\n// ---------------------------------------------------------------------------\nconst SOLANA_EXPLORER_BASE = 'https://explorer.solana.com';\nconst SOLANA_CLUSTER_PARAM = IS_TESTNET ? '?cluster=devnet' : '';\n\nexport function getSolanaExplorerTxUrl(signature: string): string {\n return `${SOLANA_EXPLORER_BASE}/tx/${signature}${SOLANA_CLUSTER_PARAM}`;\n}\n\nexport function getSolanaExplorerAddressUrl(address: string): string {\n return `${SOLANA_EXPLORER_BASE}/address/${address}${SOLANA_CLUSTER_PARAM}`;\n}\n"]}
|
|
@@ -134,7 +134,7 @@ export function useNordBalance(tokenId) {
|
|
|
134
134
|
case 3: return [4 /*yield*/, fetchAccountBalances(baseUrl, accountIdRef.current)];
|
|
135
135
|
case 4:
|
|
136
136
|
balances = _a.sent();
|
|
137
|
-
logger.
|
|
137
|
+
logger.debug('[useNordBalance] Balances fetched', { balances: balances, requestedTokenId: tokenId });
|
|
138
138
|
tokenBalance = balances.find(function (b) { return b.tokenId === tokenId; });
|
|
139
139
|
if (tokenBalance) {
|
|
140
140
|
setBalance(tokenBalance.amount.toString());
|
|
@@ -203,12 +203,12 @@ export function useNordBalanceWithPolling(tokenId, options) {
|
|
|
203
203
|
return [2 /*return*/];
|
|
204
204
|
}
|
|
205
205
|
accountIdRef.current = accountId;
|
|
206
|
-
logger.
|
|
206
|
+
logger.debug('[useNordBalanceWithPolling] Resolved accountId', { accountId: accountId, solanaAddress: solanaAddress });
|
|
207
207
|
_a.label = 3;
|
|
208
208
|
case 3: return [4 /*yield*/, fetchAccountBalances(baseUrl, accountIdRef.current)];
|
|
209
209
|
case 4:
|
|
210
210
|
balances = _a.sent();
|
|
211
|
-
logger.
|
|
211
|
+
logger.debug('[useNordBalanceWithPolling] Balances fetched', { balances: balances, requestedTokenId: tokenId });
|
|
212
212
|
tokenBalance = balances.find(function (b) { return b.tokenId === tokenId; });
|
|
213
213
|
if (tokenBalance) {
|
|
214
214
|
setBalance(tokenBalance.amount.toString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNordBalance.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/hooks/useNordBalance.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useN1WalletContext } from '../../../hooks';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { logger } from '../../../utils/logger';\n\nexport interface NordBalanceState {\n balance: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetches the Nord account ID for a given Solana pubkey via the REST API.\n * GET {baseUrl}/user/{pubkey} → { accountIds: [number], sessions: {} }\n */\nasync function fetchAccountId(baseUrl: string, pubkey: string): Promise<number | null> {\n const res = await fetch(`${baseUrl}/user/${pubkey}`);\n if (!res.ok) {\n if (res.status === 404) return null;\n throw new Error(`Failed to fetch user: ${res.status}`);\n }\n const data = await res.json();\n if (data.accountIds && data.accountIds.length > 0) {\n return data.accountIds[0];\n }\n return null;\n}\n\n/**\n * Fetches the account balances via the REST API.\n * GET {baseUrl}/account/{accountId} → { balances: [{ tokenId, token, amount }], ... }\n */\nasync function fetchAccountBalances(baseUrl: string, accountId: number): Promise<any[]> {\n const res = await fetch(`${baseUrl}/account/${accountId}`);\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`Failed to fetch account: ${res.status}`);\n }\n const data = await res.json();\n return data.balances || [];\n}\n\n/**\n * Hook to fetch and manage Nord account balances for a specific token\n * Uses direct REST API calls instead of nordUser.fetchInfo()\n */\nexport function useNordBalance(tokenId: number): NordBalanceState {\n const { nord } = useN1WalletContext();\n const { solanaAddress } = useNetwork();\n const [balance, setBalance] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const accountIdRef = useRef<number | null>(null);\n\n const fetchBalance = useCallback(async () => {\n const baseUrl = (nord as any)?.webServerUrl;\n if (!baseUrl || !solanaAddress) {\n setBalance(null);\n setError(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Resolve account ID if we don't have it cached\n if (accountIdRef.current === null) {\n const accountId = await fetchAccountId(baseUrl, solanaAddress);\n if (accountId === null) {\n logger.warn('[useNordBalance] No Nord account found for wallet', { solanaAddress });\n setBalance('0');\n setError('No Nord account found. Please make a deposit first.');\n return;\n }\n accountIdRef.current = accountId;\n }\n\n // Fetch balances\n const balances = await fetchAccountBalances(baseUrl, accountIdRef.current);\n\n logger.info('[useNordBalance] Balances fetched', { balances, requestedTokenId: tokenId });\n\n const tokenBalance = balances.find((b: any) => b.tokenId === tokenId);\n\n if (tokenBalance) {\n setBalance(tokenBalance.amount.toString());\n } else {\n setBalance('0');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch balance';\n logger.error('[useNordBalance] Failed to fetch balance', { error: err, tokenId });\n setError(errorMessage);\n setBalance(null);\n } finally {\n setLoading(false);\n }\n }, [nord, solanaAddress, tokenId]);\n\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n return { balance, loading, error, refetch: fetchBalance };\n}\n\n/**\n * Hook to fetch and manage Nord account balances with automatic polling.\n * Uses direct REST API calls instead of nordUser.fetchInfo()\n */\nexport function useNordBalanceWithPolling(\n tokenId: number,\n options: {\n enabled?: boolean;\n pollInterval?: number;\n } = {}\n): NordBalanceState {\n const { enabled = true, pollInterval = 30_000 } = options;\n const { nord } = useN1WalletContext();\n const { solanaAddress } = useNetwork();\n const [balance, setBalance] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const accountIdRef = useRef<number | null>(null);\n\n const fetchBalance = useCallback(async () => {\n const baseUrl = (nord as any)?.webServerUrl;\n if (!baseUrl || !solanaAddress) {\n setBalance(null);\n setError(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Resolve account ID if we don't have it cached\n if (accountIdRef.current === null) {\n const accountId = await fetchAccountId(baseUrl, solanaAddress);\n if (accountId === null) {\n logger.warn('[useNordBalanceWithPolling] No Nord account found for wallet', { solanaAddress });\n setBalance('0');\n setLoading(false);\n return;\n }\n accountIdRef.current = accountId;\n logger.info('[useNordBalanceWithPolling] Resolved accountId', { accountId, solanaAddress });\n }\n\n // Fetch balances\n const balances = await fetchAccountBalances(baseUrl, accountIdRef.current);\n\n logger.info('[useNordBalanceWithPolling] Balances fetched', { balances, requestedTokenId: tokenId });\n\n const tokenBalance = balances.find((b: any) => b.tokenId === tokenId);\n\n if (tokenBalance) {\n setBalance(tokenBalance.amount.toString());\n } else {\n setBalance('0');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch balance';\n logger.error('[useNordBalanceWithPolling] Failed to fetch balance', { error: err, tokenId });\n setError(errorMessage);\n setBalance(null);\n } finally {\n setLoading(false);\n }\n }, [nord, solanaAddress, tokenId]);\n\n // Initial fetch\n useEffect(() => {\n if (enabled) {\n fetchBalance();\n }\n }, [enabled, fetchBalance]);\n\n // Polling\n useEffect(() => {\n if (!enabled || pollInterval <= 0) {\n return;\n }\n\n const intervalId = setInterval(() => {\n fetchBalance();\n }, pollInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [enabled, fetchBalance, pollInterval]);\n\n return { balance, loading, error, refetch: fetchBalance };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useNordBalance.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/hooks/useNordBalance.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useN1WalletContext } from '../../../hooks';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { logger } from '../../../utils/logger';\n\nexport interface NordBalanceState {\n balance: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Fetches the Nord account ID for a given Solana pubkey via the REST API.\n * GET {baseUrl}/user/{pubkey} → { accountIds: [number], sessions: {} }\n */\nasync function fetchAccountId(baseUrl: string, pubkey: string): Promise<number | null> {\n const res = await fetch(`${baseUrl}/user/${pubkey}`);\n if (!res.ok) {\n if (res.status === 404) return null;\n throw new Error(`Failed to fetch user: ${res.status}`);\n }\n const data = await res.json();\n if (data.accountIds && data.accountIds.length > 0) {\n return data.accountIds[0];\n }\n return null;\n}\n\n/**\n * Fetches the account balances via the REST API.\n * GET {baseUrl}/account/{accountId} → { balances: [{ tokenId, token, amount }], ... }\n */\nasync function fetchAccountBalances(baseUrl: string, accountId: number): Promise<any[]> {\n const res = await fetch(`${baseUrl}/account/${accountId}`);\n if (!res.ok) {\n if (res.status === 404) return [];\n throw new Error(`Failed to fetch account: ${res.status}`);\n }\n const data = await res.json();\n return data.balances || [];\n}\n\n/**\n * Hook to fetch and manage Nord account balances for a specific token\n * Uses direct REST API calls instead of nordUser.fetchInfo()\n */\nexport function useNordBalance(tokenId: number): NordBalanceState {\n const { nord } = useN1WalletContext();\n const { solanaAddress } = useNetwork();\n const [balance, setBalance] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const accountIdRef = useRef<number | null>(null);\n\n const fetchBalance = useCallback(async () => {\n const baseUrl = (nord as any)?.webServerUrl;\n if (!baseUrl || !solanaAddress) {\n setBalance(null);\n setError(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Resolve account ID if we don't have it cached\n if (accountIdRef.current === null) {\n const accountId = await fetchAccountId(baseUrl, solanaAddress);\n if (accountId === null) {\n logger.warn('[useNordBalance] No Nord account found for wallet', { solanaAddress });\n setBalance('0');\n setError('No Nord account found. Please make a deposit first.');\n return;\n }\n accountIdRef.current = accountId;\n }\n\n // Fetch balances\n const balances = await fetchAccountBalances(baseUrl, accountIdRef.current);\n\n logger.debug('[useNordBalance] Balances fetched', { balances, requestedTokenId: tokenId });\n\n const tokenBalance = balances.find((b: any) => b.tokenId === tokenId);\n\n if (tokenBalance) {\n setBalance(tokenBalance.amount.toString());\n } else {\n setBalance('0');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch balance';\n logger.error('[useNordBalance] Failed to fetch balance', { error: err, tokenId });\n setError(errorMessage);\n setBalance(null);\n } finally {\n setLoading(false);\n }\n }, [nord, solanaAddress, tokenId]);\n\n useEffect(() => {\n fetchBalance();\n }, [fetchBalance]);\n\n return { balance, loading, error, refetch: fetchBalance };\n}\n\n/**\n * Hook to fetch and manage Nord account balances with automatic polling.\n * Uses direct REST API calls instead of nordUser.fetchInfo()\n */\nexport function useNordBalanceWithPolling(\n tokenId: number,\n options: {\n enabled?: boolean;\n pollInterval?: number;\n } = {}\n): NordBalanceState {\n const { enabled = true, pollInterval = 30_000 } = options;\n const { nord } = useN1WalletContext();\n const { solanaAddress } = useNetwork();\n const [balance, setBalance] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const accountIdRef = useRef<number | null>(null);\n\n const fetchBalance = useCallback(async () => {\n const baseUrl = (nord as any)?.webServerUrl;\n if (!baseUrl || !solanaAddress) {\n setBalance(null);\n setError(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Resolve account ID if we don't have it cached\n if (accountIdRef.current === null) {\n const accountId = await fetchAccountId(baseUrl, solanaAddress);\n if (accountId === null) {\n logger.warn('[useNordBalanceWithPolling] No Nord account found for wallet', { solanaAddress });\n setBalance('0');\n setLoading(false);\n return;\n }\n accountIdRef.current = accountId;\n logger.debug('[useNordBalanceWithPolling] Resolved accountId', { accountId, solanaAddress });\n }\n\n // Fetch balances\n const balances = await fetchAccountBalances(baseUrl, accountIdRef.current);\n\n logger.debug('[useNordBalanceWithPolling] Balances fetched', { balances, requestedTokenId: tokenId });\n\n const tokenBalance = balances.find((b: any) => b.tokenId === tokenId);\n\n if (tokenBalance) {\n setBalance(tokenBalance.amount.toString());\n } else {\n setBalance('0');\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch balance';\n logger.error('[useNordBalanceWithPolling] Failed to fetch balance', { error: err, tokenId });\n setError(errorMessage);\n setBalance(null);\n } finally {\n setLoading(false);\n }\n }, [nord, solanaAddress, tokenId]);\n\n // Initial fetch\n useEffect(() => {\n if (enabled) {\n fetchBalance();\n }\n }, [enabled, fetchBalance]);\n\n // Polling\n useEffect(() => {\n if (!enabled || pollInterval <= 0) {\n return;\n }\n\n const intervalId = setInterval(() => {\n fetchBalance();\n }, pollInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [enabled, fetchBalance, pollInterval]);\n\n return { balance, loading, error, refetch: fetchBalance };\n}\n"]}
|
|
@@ -38,6 +38,8 @@ import { useCallback, useEffect, useState } from 'react';
|
|
|
38
38
|
import { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';
|
|
39
39
|
import { logger } from '../../../utils/logger';
|
|
40
40
|
import { Connection, PublicKey } from '@solana/web3.js';
|
|
41
|
+
import { getSolanaRpcUrl } from '../../../config/solana';
|
|
42
|
+
import { IS_TESTNET } from '../../../config/network';
|
|
41
43
|
/**
|
|
42
44
|
* Hook to fetch USDC balance from Turnkey Solana wallet
|
|
43
45
|
*/
|
|
@@ -50,7 +52,7 @@ export function useTurnkeySolanaBalance(options) {
|
|
|
50
52
|
var _d = useState(false), loading = _d[0], setLoading = _d[1];
|
|
51
53
|
var _e = useState(null), error = _e[0], setError = _e[1];
|
|
52
54
|
var fetchBalance = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
53
|
-
var rpcUrl, connection, ownerPubkey,
|
|
55
|
+
var rpcUrl, connection, ownerPubkey, circleUsdcMint, mintPubkey, tokenAccounts, accountInfo, rawBalance, err_1, errorMessage;
|
|
54
56
|
return __generator(this, function (_a) {
|
|
55
57
|
switch (_a.label) {
|
|
56
58
|
case 0:
|
|
@@ -64,20 +66,19 @@ export function useTurnkeySolanaBalance(options) {
|
|
|
64
66
|
_a.label = 1;
|
|
65
67
|
case 1:
|
|
66
68
|
_a.trys.push([1, 3, 4, 5]);
|
|
67
|
-
logger.
|
|
69
|
+
logger.debug('[useTurnkeySolanaBalance] Fetching USDC balance', {
|
|
68
70
|
address: solanaAddress.slice(0, 8) + '...',
|
|
69
71
|
});
|
|
70
|
-
rpcUrl =
|
|
72
|
+
rpcUrl = getSolanaRpcUrl();
|
|
71
73
|
connection = new Connection(rpcUrl);
|
|
72
74
|
ownerPubkey = new PublicKey(solanaAddress);
|
|
73
|
-
|
|
74
|
-
circleUsdcMint = isTestnet
|
|
75
|
+
circleUsdcMint = IS_TESTNET
|
|
75
76
|
? '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU' // Circle USDC on Solana Devnet
|
|
76
77
|
: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
77
78
|
mintPubkey = new PublicKey(circleUsdcMint);
|
|
78
|
-
logger.
|
|
79
|
+
logger.debug('[useTurnkeySolanaBalance] Using Circle USDC mint', {
|
|
79
80
|
mint: circleUsdcMint,
|
|
80
|
-
isTestnet:
|
|
81
|
+
isTestnet: IS_TESTNET,
|
|
81
82
|
});
|
|
82
83
|
logger.debug('[useTurnkeySolanaBalance] Fetching token accounts', {
|
|
83
84
|
owner: ownerPubkey.toBase58().slice(0, 8) + '...',
|
|
@@ -92,14 +93,14 @@ export function useTurnkeySolanaBalance(options) {
|
|
|
92
93
|
count: tokenAccounts.value.length,
|
|
93
94
|
});
|
|
94
95
|
if (tokenAccounts.value.length === 0) {
|
|
95
|
-
logger.
|
|
96
|
+
logger.debug('[useTurnkeySolanaBalance] No USDC token account found');
|
|
96
97
|
setBalance('0');
|
|
97
98
|
setLoading(false);
|
|
98
99
|
return [2 /*return*/];
|
|
99
100
|
}
|
|
100
101
|
accountInfo = tokenAccounts.value[0].account.data.parsed.info;
|
|
101
102
|
rawBalance = accountInfo.tokenAmount.uiAmount;
|
|
102
|
-
logger.
|
|
103
|
+
logger.debug('[useTurnkeySolanaBalance] Balance fetched', {
|
|
103
104
|
balance: rawBalance,
|
|
104
105
|
decimals: accountInfo.tokenAmount.decimals,
|
|
105
106
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTurnkeySolanaBalance.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/hooks/useTurnkeySolanaBalance.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qDAAqD,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"useTurnkeySolanaBalance.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/hooks/useTurnkeySolanaBalance.ts"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useNetwork } from '../../../providers/N1WalletProvider/NetworkProvider';\nimport { logger } from '../../../utils/logger';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport { getSolanaRpcUrl } from '../../../config/solana';\nimport { IS_TESTNET } from '../../../config/network';\n\nexport interface TurnkeyBalanceState {\n balance: string | null;\n loading: boolean;\n error: string | null;\n refetch: () => Promise<void>;\n}\n\n/**\n * Hook to fetch USDC balance from Turnkey Solana wallet\n */\nexport function useTurnkeySolanaBalance(options: {\n enabled?: boolean;\n pollInterval?: number;\n} = {}): TurnkeyBalanceState {\n const { enabled = true, pollInterval = 30_000 } = options;\n const { solanaAddress } = useNetwork();\n const [balance, setBalance] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const fetchBalance = useCallback(async () => {\n if (!solanaAddress) {\n setBalance(null);\n setError(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n logger.debug('[useTurnkeySolanaBalance] Fetching USDC balance', {\n address: solanaAddress.slice(0, 8) + '...',\n });\n\n // Create our own Solana connection (don't depend on Nord)\n const rpcUrl = getSolanaRpcUrl();\n const connection = new Connection(rpcUrl);\n const ownerPubkey = new PublicKey(solanaAddress);\n\n // For bridge mode, use Circle's official USDC mint (required for CCTP)\n // For Nord deposits, use Nord's USDC mint\n const circleUsdcMint = IS_TESTNET\n ? '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU' // Circle USDC on Solana Devnet\n : 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'; // Circle USDC on Solana Mainnet\n\n // Always use Circle's USDC for Turnkey balance since that's what CCTP uses\n const mintPubkey = new PublicKey(circleUsdcMint);\n\n logger.debug('[useTurnkeySolanaBalance] Using Circle USDC mint', {\n mint: circleUsdcMint,\n isTestnet: IS_TESTNET,\n });\n\n logger.debug('[useTurnkeySolanaBalance] Fetching token accounts', {\n owner: ownerPubkey.toBase58().slice(0, 8) + '...',\n mint: mintPubkey.toBase58().slice(0, 8) + '...',\n });\n\n // Get token accounts for this owner and mint\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(ownerPubkey, {\n mint: mintPubkey,\n });\n\n logger.debug('[useTurnkeySolanaBalance] Token accounts response', {\n count: tokenAccounts.value.length,\n });\n\n if (tokenAccounts.value.length === 0) {\n logger.debug('[useTurnkeySolanaBalance] No USDC token account found');\n setBalance('0');\n setLoading(false);\n return;\n }\n\n // Get the first account's balance\n const accountInfo = tokenAccounts.value[0].account.data.parsed.info;\n const rawBalance = accountInfo.tokenAmount.uiAmount;\n\n logger.debug('[useTurnkeySolanaBalance] Balance fetched', {\n balance: rawBalance,\n decimals: accountInfo.tokenAmount.decimals,\n });\n\n setBalance(rawBalance !== null ? rawBalance.toString() : '0');\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch balance';\n logger.error('[useTurnkeySolanaBalance] Failed to fetch balance', {\n error: err,\n });\n setError(errorMessage);\n setBalance(null);\n } finally {\n setLoading(false);\n }\n }, [solanaAddress]);\n\n // Initial fetch\n useEffect(() => {\n if (enabled) {\n fetchBalance();\n }\n }, [enabled, fetchBalance]);\n\n // Polling\n useEffect(() => {\n if (!enabled || pollInterval <= 0) {\n return;\n }\n\n const intervalId = setInterval(() => {\n fetchBalance();\n }, pollInterval);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [enabled, fetchBalance, pollInterval]);\n\n return {\n balance,\n loading,\n error,\n refetch: fetchBalance,\n };\n}\n"]}
|
|
@@ -26,7 +26,33 @@ interface DepositFlowProviderProps {
|
|
|
26
26
|
children: React.ReactNode;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* Provider component for the deposit flow state
|
|
29
|
+
* Provider component for the deposit flow state.
|
|
30
|
+
*
|
|
31
|
+
* ARCHITECTURE NOTE — Flow state pattern
|
|
32
|
+
* The main onboarding flow uses useReducer (OnboardingStateProvider), which is
|
|
33
|
+
* well-suited for its synchronous, deterministic transitions. This provider uses
|
|
34
|
+
* useState for pragmatic reasons: the deposit flow involves complex async
|
|
35
|
+
* operations (wallet signing → RPC confirmation → bridge attestation → EVM claim)
|
|
36
|
+
* that interleave with localStorage persistence and error recovery. A useReducer
|
|
37
|
+
* here would require dispatching dozens of intermediate actions with complex
|
|
38
|
+
* side-effect middleware. The current useState approach is battle-tested across
|
|
39
|
+
* both Solana-native and CCTP bridge deposit paths.
|
|
40
|
+
*
|
|
41
|
+
* RESPONSIBILITY MAP (10 areas, ~860 lines):
|
|
42
|
+
* 1. Context setup & type definitions (lines 30-58)
|
|
43
|
+
* 2. Local state initialization (lines 63-120)
|
|
44
|
+
* 3. Error handling & normalization (lines 124-142)
|
|
45
|
+
* 4. Auth delegation (useDepositAuth) (lines 144-149)
|
|
46
|
+
* 5. Pending deposit management (lines 151-154)
|
|
47
|
+
* 6. Bridge success finalization (lines 156-230)
|
|
48
|
+
* 7. Solana & CCTP bridge hook wiring (lines 232-271)
|
|
49
|
+
* 8. Resume pending deposit logic (lines 287-476)
|
|
50
|
+
* 9. New deposit flow (lines 508-704)
|
|
51
|
+
* 10. Main entry point (startDeposit) (lines 709-749)
|
|
52
|
+
*
|
|
53
|
+
* TODO (future split): Extract #6 (finalizeBridgeSuccess) and #8/#9 (resume vs
|
|
54
|
+
* new deposit) into separate hooks. Risk: high — these share mutable refs and
|
|
55
|
+
* interleaved state that must update atomically. Test coverage needed first.
|
|
30
56
|
*/
|
|
31
57
|
export declare const DepositFlowProvider: React.FC<DepositFlowProviderProps>;
|
|
32
58
|
/**
|