From 6ccb7c7d35e06e4c8c73da7db16828d8dcfb2655 Mon Sep 17 00:00:00 2001 From: Jakub Zajac Date: Wed, 26 Nov 2025 12:11:31 +0000 Subject: [PATCH 1/3] Ensure only active liq add are returned --- .../src/handlers/getUserLiquidationAddress.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js b/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js index 3bf66184b5e..c3500d19bbe 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js +++ b/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js @@ -40,9 +40,12 @@ const getUserLiquidationAddressHandler = async (event) => { const liquidationAddresses = await getLiquidationAddresses(bridgeCustomerId); - const relevantLiquidationAddress = liquidationAddresses.find( - (address) => address.external_account_id === firstAccount.id, - )?.address; + const relevantLiquidationAddress = + liquidationAddresses.find( + (address) => + address.external_account_id === firstAccount.id && + address.state === 'active', + )?.address ?? null; return relevantLiquidationAddress; }; From eb89739fc632b6b4bab57b2e73a1c6a6edf1d35d Mon Sep 17 00:00:00 2001 From: Jakub Zajac Date: Wed, 26 Nov 2025 12:24:31 +0000 Subject: [PATCH 2/3] Check for liq add status elsewhere --- .../bridgeXYZMutation/src/api/rest/bridge.js | 16 ++++++++++++++++ .../src/handlers/checkKyc.js | 19 ++++++++----------- .../src/handlers/getUserLiquidationAddress.js | 16 ++++++---------- .../src/handlers/updateExternalAccount.js | 11 +++++++++-- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js b/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js index b0f6d2625ce..8ef305441c8 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js +++ b/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js @@ -177,6 +177,21 @@ const getLiquidationAddresses = async (bridgeCustomerId) => { return response.data.data; }; +const getLiquidationAddressForExternalAccount = async ( + bridgeCustomerId, + externalAccountId, +) => { + const liquidationAddresses = await getLiquidationAddresses(bridgeCustomerId); + + return ( + liquidationAddresses.find( + (address) => + address.external_account_id === externalAccountId && + address.state === 'active', + )?.address ?? null + ); +}; + const getExternalAccounts = async (bridgeCustomerId) => { const response = await handleGet( `${bridgeApiConfig.endpoints.routes.customers}/${bridgeCustomerId}/${bridgeApiConfig.endpoints.resources.externalAccounts}`, @@ -228,4 +243,5 @@ module.exports = { getLiquidationAddresses, getGatewayFee, getDrainsHistory, + getLiquidationAddressForExternalAccount, }; diff --git a/amplify/backend/function/bridgeXYZMutation/src/handlers/checkKyc.js b/amplify/backend/function/bridgeXYZMutation/src/handlers/checkKyc.js index c2bd5dd8b76..b111e00d064 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/handlers/checkKyc.js +++ b/amplify/backend/function/bridgeXYZMutation/src/handlers/checkKyc.js @@ -3,7 +3,7 @@ const { utils } = require('ethers'); const { graphqlRequest } = require('../api/graphql/utils'); const { getBridgeCustomer, - getLiquidationAddresses, + getLiquidationAddressForExternalAccount, getExternalAccounts, createKYCLinks, createLiquidationAddress, @@ -68,7 +68,7 @@ const checkKYCHandler = async (event) => { }; } - const liquidationAddress = await getLiquidationAddress( + const liquidationAddress = await getOrCreateLiquidationAddress( checksummedWalletAddress, bridgeCustomerId, bankAccount.id, @@ -140,20 +140,17 @@ const getBankAccountDetails = async (bridgeCustomerId) => { }; }; -const getLiquidationAddress = async ( +const getOrCreateLiquidationAddress = async ( userAddress, bridgeCustomerId, externalAccountId, externalAccountCurrency, ) => { - const liquidationAddresses = await getLiquidationAddresses( - bridgeCustomerId, - externalAccountId, - ); - - let externalAccountLiquidationAddress = liquidationAddresses.find( - (address) => address.external_account_id === externalAccountId, - )?.address; + let externalAccountLiquidationAddress = + await getLiquidationAddressForExternalAccount( + bridgeCustomerId, + externalAccountId, + ); if (externalAccountLiquidationAddress) { return externalAccountLiquidationAddress; diff --git a/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js b/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js index c3500d19bbe..ac0f17be07b 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js +++ b/amplify/backend/function/bridgeXYZMutation/src/handlers/getUserLiquidationAddress.js @@ -1,7 +1,7 @@ const { graphqlRequest } = require('../api/graphql/utils'); const { - getLiquidationAddresses, getExternalAccounts, + getLiquidationAddressForExternalAccount, } = require('../api/rest/bridge'); const EnvVarsConfig = require('../config/envVars.js'); @@ -38,16 +38,12 @@ const getUserLiquidationAddressHandler = async (event) => { return null; } - const liquidationAddresses = await getLiquidationAddresses(bridgeCustomerId); + const liquidationAddress = await getLiquidationAddressForExternalAccount( + bridgeCustomerId, + firstAccount.id, + ); - const relevantLiquidationAddress = - liquidationAddresses.find( - (address) => - address.external_account_id === firstAccount.id && - address.state === 'active', - )?.address ?? null; - - return relevantLiquidationAddress; + return liquidationAddress; }; module.exports = { diff --git a/amplify/backend/function/bridgeXYZMutation/src/handlers/updateExternalAccount.js b/amplify/backend/function/bridgeXYZMutation/src/handlers/updateExternalAccount.js index 32c3ebabfd8..22198f80733 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/handlers/updateExternalAccount.js +++ b/amplify/backend/function/bridgeXYZMutation/src/handlers/updateExternalAccount.js @@ -4,8 +4,8 @@ const { handlePut, createExternalAccount, deleteExternalAccount, - getLiquidationAddresses, getExternalAccounts, + getLiquidationAddressForExternalAccount, } = require('../api/rest/bridge'); const updateExternalAccountHandler = async (event) => { @@ -28,6 +28,10 @@ const updateExternalAccountHandler = async (event) => { const bridgeCustomerId = graphQlData?.getUser?.bridgeCustomerId; + if (!bridgeCustomerId) { + throw new Error('Bridge customer ID not found'); + } + const externalAccounts = await getExternalAccounts(bridgeCustomerId); const newAccount = await createExternalAccount(bridgeCustomerId, account); @@ -43,7 +47,10 @@ const updateExternalAccountHandler = async (event) => { * Only if the currency is the same as the new account * Otherwise, creating new liquidation address is handled elsewhere */ - const liquidationAddresses = await getLiquidationAddresses(bridgeCustomerId); + const liquidationAddresses = await getLiquidationAddressForExternalAccount( + bridgeCustomerId, + input.id, + ); const targetLiquidationAddress = liquidationAddresses.find( (address) => address.external_account_id === input.id, ); From e05de5fc3a2040614e93479e7ff80f64f0089c7b Mon Sep 17 00:00:00 2001 From: Jakub Zajac Date: Wed, 26 Nov 2025 13:11:15 +0000 Subject: [PATCH 3/3] filter out non-active accounts --- .../function/bridgeXYZMutation/src/api/rest/bridge.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js b/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js index 8ef305441c8..9c7a18f6828 100644 --- a/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js +++ b/amplify/backend/function/bridgeXYZMutation/src/api/rest/bridge.js @@ -130,7 +130,7 @@ const createKYCLinks = async (fullName, email) => { }, ); - if (response.status !== 200) { + if (response.status !== 200 && !response.data.existing_kyc_link) { console.log(`Could not generate new KYC links`); } @@ -204,7 +204,9 @@ const getExternalAccounts = async (bridgeCustomerId) => { return null; } - return response.data.data; + const activeAccounts = response.data.data.filter((a) => a.active === true); + + return activeAccounts; }; const getBridgeCustomer = async (bridgeCustomerId) => {