diff options
| author | Adam Soltys <[email protected]> | 2026-02-15 22:26:43 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-02-15 22:26:43 -0800 |
| commit | eedf7695d64e4c00af3d178484900c7c57087ac0 (patch) | |
| tree | a35e0dcc44b4f753d392af3f6ae350254a8c6e6c /lib | |
| parent | ba2fbfe2901db35bb0cc688757f7e88dc52ff7b6 (diff) | |
| download | coinos-server-eedf7695d64e4c00af3d178484900c7c57087ac0.tar.gz coinos-server-eedf7695d64e4c00af3d178484900c7c57087ac0.zip | |
ark refresh
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ark.ts | 25 | ||||
| -rw-r--r-- | lib/zmq.ts | 3 |
2 files changed, 21 insertions, 7 deletions
@@ -24,6 +24,8 @@ const getWallet = async () => { }; let refreshing = false; +let lastRefresh = 0; +const REFRESH_COOLDOWN = 30_000; const failedBoardingOutpoints = new Set<string>(); const withTimeout = <T>(promise: Promise<T>, ms: number, label: string) => @@ -34,10 +36,12 @@ const withTimeout = <T>(promise: Promise<T>, ms: number, label: string) => ), ]); -export const refreshArkWallet = async () => { - if (refreshing) return; +export const refreshArkWallet = async (force = false) => { + const now = Date.now(); + if (refreshing || (!force && now - lastRefresh < REFRESH_COOLDOWN)) return; try { refreshing = true; + lastRefresh = now; const w = await getWallet(); const balance = await w.getBalance(); l( @@ -122,18 +126,25 @@ export const refreshArkWallet = async () => { } }; -// Check every 2 minutes -setInterval(refreshArkWallet, 2 * 60 * 1000); -// Initial check after 30s startup delay +// Initial check after 30s startup delay; ongoing checks triggered by ZMQ blocks setTimeout(refreshArkWallet, 30_000); export const sendArk = async (address: string, amount: number) => { const timeout = new Promise((_, reject) => - setTimeout(() => reject(new Error("Ark send timed out")), 45000), + setTimeout(() => reject(new Error("Ark send timed out")), 60000), ); const send = async () => { const w = await getWallet(); - return w.sendBitcoin({ address, amount }); + try { + return await w.sendBitcoin({ address, amount }); + } catch (e: any) { + if (/insufficient funds/i.test(e.message)) { + l("ark send got insufficient funds, refreshing wallet and retrying"); + await refreshArkWallet(true); + return w.sendBitcoin({ address, amount }); + } + throw e; + } }; return Promise.race([send(), timeout]); }; @@ -1,6 +1,7 @@ import net from "node:net"; import config from "$config"; import { btcNetwork } from "$lib/esplora"; +import { refreshArkWallet } from "$lib/ark"; import { err, l, warn } from "$lib/logging"; import { processWatchedTx } from "$lib/payments"; import { Transaction } from "@scure/btc-signer"; @@ -116,6 +117,8 @@ const handleRawBlock = async (raw: Uint8Array) => { warn("zmq block tx decode failed", i, e.message); } } + + refreshArkWallet().catch(() => {}); }; // ZMTP 3.0 NULL protocol |
