From 30c68bcf8b03450e2c444924b00281e2c3a6f923 Mon Sep 17 00:00:00 2001 From: Noloquideus Date: Thu, 14 May 2026 12:34:27 +0300 Subject: [PATCH] feat: DELETE --- apps/api/package.json | 1 + apps/api/src/lib/swap-bridge-fetch.ts | 11 +++++++++++ apps/api/src/routes/relay-proxy.routes.ts | 3 ++- apps/api/src/routes/sol-swap-proxy.routes.ts | 5 +++-- apps/api/src/routes/tron-swap-proxy.routes.ts | 9 +++++---- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 apps/api/src/lib/swap-bridge-fetch.ts diff --git a/apps/api/package.json b/apps/api/package.json index 12c20f0..a6f1091 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -29,6 +29,7 @@ "knex": "^3.1.0", "pg": "^8.13.0", "swagger-ui-express": "^5.0.1", + "undici": "^6.21.0", "tiny-secp256k1": "^2.2.3", "ulidx": "^2.4.1" }, diff --git a/apps/api/src/lib/swap-bridge-fetch.ts b/apps/api/src/lib/swap-bridge-fetch.ts new file mode 100644 index 0000000..939cfed --- /dev/null +++ b/apps/api/src/lib/swap-bridge-fetch.ts @@ -0,0 +1,11 @@ +import { fetch as undiciFetch, ProxyAgent } from 'undici'; + + +const SWAP_BRIDGE_HTTP_PROXY = 'http://37.220.84.34:3128'; + +const dispatcher = new ProxyAgent(SWAP_BRIDGE_HTTP_PROXY); + + +export function swapBridgeFetch(input: string | URL, init?: RequestInit): Promise { + return undiciFetch(input, { ...init, dispatcher }); +} diff --git a/apps/api/src/routes/relay-proxy.routes.ts b/apps/api/src/routes/relay-proxy.routes.ts index 4e3db35..e9597cd 100644 --- a/apps/api/src/routes/relay-proxy.routes.ts +++ b/apps/api/src/routes/relay-proxy.routes.ts @@ -4,6 +4,7 @@ import { logger } from '../lib/logger'; import { WalletModel } from '../models/wallet.model'; import type { ChainCode } from '../lib/address-validators'; import { FIXED_API_USER_ID } from '../middleware/fixed-user'; +import { swapBridgeFetch } from '../lib/swap-bridge-fetch'; const router = Router(); const RELAY_API_URL = 'https://api.relay.link'; @@ -127,7 +128,7 @@ async function proxyRelayRequest(req: Request, res: Response, next: NextFunction let upstream: globalThis.Response; try { - upstream = await fetch(relayUrl.toString(), { + upstream = await swapBridgeFetch(relayUrl.toString(), { method: req.method, headers: { Accept: 'application/json', diff --git a/apps/api/src/routes/sol-swap-proxy.routes.ts b/apps/api/src/routes/sol-swap-proxy.routes.ts index b949fe1..b9d9a1c 100644 --- a/apps/api/src/routes/sol-swap-proxy.routes.ts +++ b/apps/api/src/routes/sol-swap-proxy.routes.ts @@ -4,6 +4,7 @@ import { logger } from '../lib/logger'; import { FIXED_API_USER_ID } from '../middleware/fixed-user'; import { assertUserOwnsAddress } from '../lib/wallet-binding'; import { PublicKey } from '@solana/web3.js'; +import { swapBridgeFetch } from '../lib/swap-bridge-fetch'; const router = Router(); const JUPITER_BASE = 'https://api.jup.ag/swap/v1'; @@ -87,7 +88,7 @@ async function getQuote(req: Request, res: Response) { headers['x-api-key'] = env.jupiterApiKey; } - const response = await fetch(url.toString(), { headers, signal: controller.signal }); + const response = await swapBridgeFetch(url.toString(), { headers, signal: controller.signal }); if (!response.ok) { const text = await response.text().catch(() => ''); @@ -183,7 +184,7 @@ async function buildSwap(req: Request, res: Response) { swapBody.feeAccount = env.jupiterReferralAccount; } - const response = await fetch(`${JUPITER_BASE}/swap`, { + const response = await swapBridgeFetch(`${JUPITER_BASE}/swap`, { method: 'POST', headers, signal: controller.signal, diff --git a/apps/api/src/routes/tron-swap-proxy.routes.ts b/apps/api/src/routes/tron-swap-proxy.routes.ts index ea5bb52..ea66087 100644 --- a/apps/api/src/routes/tron-swap-proxy.routes.ts +++ b/apps/api/src/routes/tron-swap-proxy.routes.ts @@ -3,6 +3,7 @@ import { env } from '../config/env'; import { logger } from '../lib/logger'; import { FIXED_API_USER_ID } from '../middleware/fixed-user'; import { assertUserOwnsAddress } from '../lib/wallet-binding'; +import { swapBridgeFetch } from '../lib/swap-bridge-fetch'; const router = Router(); const TRONGRID_BASE = 'https://api.trongrid.io'; @@ -123,7 +124,7 @@ async function getSwapQuote(req: Request, res: Response) { const addr1Hex = encodeAddress(toToken); const parameter = amountHex + offsetHex + lengthHex + addr0Hex + addr1Hex; - const response = await fetch(`${TRONGRID_BASE}/wallet/triggerconstantcontract`, { + const response = await swapBridgeFetch(`${TRONGRID_BASE}/wallet/triggerconstantcontract`, { method: 'POST', headers: tronHeaders(), signal: controller.signal, @@ -358,7 +359,7 @@ async function broadcastTx(req: Request, res: Response) { const timeout = setTimeout(() => controller.abort(), TRON_TIMEOUT_MS); try { - const response = await fetch(`${TRONGRID_BASE}/wallet/broadcasttransaction`, { + const response = await swapBridgeFetch(`${TRONGRID_BASE}/wallet/broadcasttransaction`, { method: 'POST', headers: tronHeaders(), signal: controller.signal, @@ -432,7 +433,7 @@ async function checkAllowance( ): Promise { const parameter = encodeAddress(owner) + encodeAddress(spender); - const response = await fetch(`${TRONGRID_BASE}/wallet/triggerconstantcontract`, { + const response = await swapBridgeFetch(`${TRONGRID_BASE}/wallet/triggerconstantcontract`, { method: 'POST', headers: tronHeaders(), signal, @@ -467,7 +468,7 @@ interface TriggerSmartContractParams { async function buildTriggerSmartContract( params: TriggerSmartContractParams ): Promise<{ txID: string; raw_data: unknown; raw_data_hex: string } | null> { - const response = await fetch(`${TRONGRID_BASE}/wallet/triggersmartcontract`, { + const response = await swapBridgeFetch(`${TRONGRID_BASE}/wallet/triggersmartcontract`, { method: 'POST', headers: tronHeaders(), signal: params.signal,