diff --git a/headers/csps/chains/zcash.ts b/headers/csps/chains/zcash.ts index c5b309acb02..a8f44c47d06 100644 --- a/headers/csps/chains/zcash.ts +++ b/headers/csps/chains/zcash.ts @@ -6,5 +6,9 @@ const mode = process.env.MODE ?? process.env.NODE_ENV ?? 'development' const env = loadEnv(mode, process.cwd(), '') export const csp: Csp = { - 'connect-src': [env.VITE_UNCHAINED_ZCASH_HTTP_URL, env.VITE_UNCHAINED_ZCASH_WS_URL], + 'connect-src': [ + env.VITE_UNCHAINED_ZCASH_HTTP_URL, + env.VITE_UNCHAINED_ZCASH_WS_URL, + 'https://api.blockchair.com', + ], } diff --git a/packages/chain-adapters/src/utxo/UtxoBaseAdapter.ts b/packages/chain-adapters/src/utxo/UtxoBaseAdapter.ts index c8bbffdaf38..ed521142e87 100644 --- a/packages/chain-adapters/src/utxo/UtxoBaseAdapter.ts +++ b/packages/chain-adapters/src/utxo/UtxoBaseAdapter.ts @@ -340,7 +340,23 @@ export abstract class UtxoBaseAdapter implements IChainAd const signTxInputs: BTCSignTxInput[] = [] for (const input of inputs) { - const data = await this.providers.http.getTransaction({ txid: input.txid }) + const data = await (async () => { + try { + return await this.providers.http.getTransaction({ txid: input.txid }) + } catch (error) { + if (this.chainId === KnownChainIds.ZcashMainnet) { + const response = await fetch( + `https://api.blockchair.com/zcash/raw/transaction/${input.txid}`, + ) + const data = await response.json() + if (!response.ok || data.error) { + throw new Error(`Blockchair API error: ${data.error || response.statusText}`) + } + return { hex: data.data[input.txid].raw_transaction } + } + throw error + } + })() signTxInputs.push({ // UTXO inputs are not guaranteed to have paths. @@ -544,7 +560,25 @@ export abstract class UtxoBaseAdapter implements IChainAd async broadcastTransaction({ hex }: Pick): Promise { try { - const txHash = await this.providers.http.sendTx({ sendTxBody: { hex } }) + const txHash = await (async () => { + try { + return await this.providers.http.sendTx({ sendTxBody: { hex } }) + } catch (error) { + if (this.chainId === KnownChainIds.ZcashMainnet) { + const response = await fetch('https://api.blockchair.com/zcash/push/transaction', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ data: hex }), + }) + const data = await response.json() + if (!response.ok || data.error) { + throw new Error(`Blockchair API error: ${data.error || response.statusText}`) + } + return data.data.transaction_hash + } + throw error + } + })() return txHash } catch (err) {