diff --git a/packages/bridge/src/int3face/index.ts b/packages/bridge/src/int3face/index.ts index 79afc1684a..422bb4c82b 100644 --- a/packages/bridge/src/int3face/index.ts +++ b/packages/bridge/src/int3face/index.ts @@ -21,6 +21,7 @@ import { GetBridgeSupportedAssetsParams, } from "../interface"; import { getGasAsset } from "../utils/gas"; +import { checkCanTransfer } from "./queries"; import { Int3faceProviderId } from "./utils"; export class Int3faceBridgeProvider implements BridgeProvider { @@ -50,7 +51,7 @@ export class Int3faceBridgeProvider implements BridgeProvider { } async getQuote(params: GetBridgeQuoteParams): Promise { - const { fromAddress, toChain, toAddress, fromAsset, fromAmount } = params; + const { fromAddress, fromChain, toChain, toAddress, fromAsset, fromAmount } = params; if (toChain.chainId !== "dogecoin") { throw new BridgeQuoteError({ @@ -60,6 +61,22 @@ export class Int3faceBridgeProvider implements BridgeProvider { }); } + // Check if transfer is available on Int3face side + const canTransfer = await checkCanTransfer( + fromChain.chainId, + toChain.chainId, + fromAsset.denom, + this.ctx.env + ); + + if (!canTransfer?.can_transfer) { + throw new BridgeQuoteError({ + bridgeId: Int3faceProviderId, + errorType: "UnsupportedQuoteError", + message: canTransfer?.reason || "Transfer is not available at this time", + }); + } + const destMemo = `{"dest-address": "${toAddress}", "dest-chain-id": "dogecoin"}`; const int3Doge = this.ctx.assetLists diff --git a/packages/bridge/src/int3face/queries.ts b/packages/bridge/src/int3face/queries.ts index 61391f388a..9f7fa6eeb6 100644 --- a/packages/bridge/src/int3face/queries.ts +++ b/packages/bridge/src/int3face/queries.ts @@ -41,3 +41,35 @@ export async function getTransferStatus( return null; }); } + +interface CanTransferResponse { + can_transfer: boolean; + reason: string; +} + +const denomOfInt3face: Record = { + DOGE: 'dogecoin-doge' +} + +export async function checkCanTransfer( + srcChainId: string | number, + destChainId: string, + assetId: string, + env: "testnet" | "mainnet" +): Promise { + let srcChainIdConverted; + + if (typeof srcChainId === "string" && srcChainId.startsWith("osmosis")) { + srcChainIdConverted = "osmosis" + } else { + srcChainIdConverted = srcChainId.toString(); + } + + const origin = env === "mainnet" + ? "https://api.mainnet.int3face.zone/int3face" + : "https://api.testnet.int3face.zone/int3face"; + + const url = new URL(`/bridge/v1beta1/can-transfer/${srcChainIdConverted}/${destChainId}/${denomOfInt3face[assetId]}`, origin); + + return apiClient(url.toString()); +}