From 7eff3e5f1e483603de4053227ed2e316f7046352 Mon Sep 17 00:00:00 2001 From: Victor Creed Date: Thu, 8 Jan 2026 09:07:30 +0200 Subject: [PATCH 1/2] chore: add bos as collateral for borrowing --- .vscode/extensions.json | 3 + .vscode/settings.json | 9 ++- .../OpenLoansTable/hooks/useGetOpenLoans.ts | 71 ++++++------------- .../src/constants/infrastructure/bsc.ts | 4 +- .../src/utils/LendingPoolDictionary.ts | 14 +++- apps/frontend/src/utils/asset.ts | 1 + .../contracts/src/contracts/assets/rsk.ts | 2 +- .../src/contracts/assets/rskTestnet.ts | 7 ++ 8 files changed, 54 insertions(+), 57 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..1d7ac851e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 72446f434..e4217a4e6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,10 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.sortImports": "explicit" + }, + "cSpell.words": ["sovryn"] } diff --git a/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts b/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts index 5ccccdb05..35890de6d 100644 --- a/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts +++ b/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { keepPreviousData, useQuery } from '@tanstack/react-query'; import dayjs from 'dayjs'; @@ -12,7 +12,6 @@ import { useAccount } from '../../../../../../hooks/useAccount'; import { useBlockNumber } from '../../../../../../hooks/useBlockNumber'; import { useLoadContract } from '../../../../../../hooks/useLoadContract'; import { queryRate } from '../../../../../../utils/calls'; -import { useGetActiveLoansQuery } from '../../../../../../utils/graphql/rsk/generated'; import { decimalic } from '../../../../../../utils/math'; import { calculateApr, @@ -30,35 +29,19 @@ const unsafeOnly = false; export const useGetOpenLoans = () => { const { account } = useAccount(); - const { value: blockNumber } = useBlockNumber(); - const [processedBlock, setProcessedBlock] = useState(); + const blockNumber = useBlockNumber(); const contract = useLoadContract('protocol', 'protocol', RSK_CHAIN_ID); - const [loadingLoans, setLoadingLoans] = useState(false); - const [loanItemsSmartContract, setLoanItemsSmartContract] = useState< - LoanItem[] - >([]); const { - data, - loading: loadingSubgraph, - refetch, - } = useGetActiveLoansQuery({ - variables: { user: account }, - }); - - const loading = useMemo( - () => loadingLoans || loadingSubgraph, - [loadingLoans, loadingSubgraph], - ); - - const getUserLoans = useCallback(async () => { - if (!account || !contract) { - setLoadingLoans(false); - return; - } - - try { - setLoadingLoans(true); + data: loanItemsSmartContract, + isPending, + error, + } = useQuery({ + queryKey: ['userLoans', { account, blockNumber }], + queryFn: async () => { + if (!account || !contract) { + return []; + } const loans = await contract.getUserLoans( account, start, @@ -69,7 +52,7 @@ export const useGetOpenLoans = () => { ); if (!loans) { - return; + return []; } const rates = await mapRates(loans); @@ -125,29 +108,17 @@ export const useGetOpenLoans = () => { .filter(Boolean) .filter(item => isSupportedPool(item.debtAsset, item.collateralAsset)); - setLoanItemsSmartContract(result); - setProcessedBlock(blockNumber); - } catch (error) { - console.error(`Error while fetching loans: ${error}`); - } finally { - setLoadingLoans(false); - } - }, [account, blockNumber, contract]); - - useEffect(() => { - if (blockNumber !== processedBlock) { - refetch(); - getUserLoans(); - } - }, [blockNumber, getUserLoans, processedBlock, refetch]); - - if (!data?.loans || !contract || !loanItemsSmartContract) { - return { data: [], loading }; - } + return result as LoanItem[]; + }, + enabled: !!account && !!contract, + placeholderData: keepPreviousData, + throwOnError: true, + }); return { - data: loanItemsSmartContract, - loading, + data: loanItemsSmartContract ?? [], + loading: isPending, + error, }; }; diff --git a/apps/frontend/src/constants/infrastructure/bsc.ts b/apps/frontend/src/constants/infrastructure/bsc.ts index a3e63bd44..d05b192e4 100644 --- a/apps/frontend/src/constants/infrastructure/bsc.ts +++ b/apps/frontend/src/constants/infrastructure/bsc.ts @@ -1,8 +1,8 @@ import { Environments } from '../../types/global'; const rpc = { - [Environments.Mainnet]: 'wss://bsc.sovryn.app/mainnet/websocket', - [Environments.Testnet]: 'wss://bsc.sovryn.app/testnet/websocket', + [Environments.Mainnet]: 'https://bsc.sovryn.app/mainnet', + [Environments.Testnet]: 'https://bsc.sovryn.app/testnet', }; export const BSC = { diff --git a/apps/frontend/src/utils/LendingPoolDictionary.ts b/apps/frontend/src/utils/LendingPoolDictionary.ts index 3dd2fa052..9d3ff2905 100644 --- a/apps/frontend/src/utils/LendingPoolDictionary.ts +++ b/apps/frontend/src/utils/LendingPoolDictionary.ts @@ -7,7 +7,7 @@ export class LendingPoolDictionary { COMMON_SYMBOLS.DLLR, new LendingPool( COMMON_SYMBOLS.DLLR, - [COMMON_SYMBOLS.BTC, 'BPRO', COMMON_SYMBOLS.SOV], + [COMMON_SYMBOLS.BTC, 'BPRO', COMMON_SYMBOLS.SOV, COMMON_SYMBOLS.BOS], false, false, ), @@ -22,6 +22,7 @@ export class LendingPoolDictionary { COMMON_SYMBOLS.SOV, 'BPRO', COMMON_SYMBOLS.DOC, + COMMON_SYMBOLS.BOS, ], false, false, @@ -31,7 +32,7 @@ export class LendingPoolDictionary { COMMON_SYMBOLS.XUSD, new LendingPool( COMMON_SYMBOLS.XUSD, - [COMMON_SYMBOLS.BTC, 'BPRO', COMMON_SYMBOLS.SOV], + [COMMON_SYMBOLS.BTC, 'BPRO', COMMON_SYMBOLS.SOV, COMMON_SYMBOLS.BOS], true, false, ), @@ -40,7 +41,13 @@ export class LendingPoolDictionary { COMMON_SYMBOLS.DOC, new LendingPool( COMMON_SYMBOLS.DOC, - [COMMON_SYMBOLS.BTC, COMMON_SYMBOLS.XUSD, 'BPRO', COMMON_SYMBOLS.SOV], + [ + COMMON_SYMBOLS.BTC, + COMMON_SYMBOLS.XUSD, + 'BPRO', + COMMON_SYMBOLS.SOV, + COMMON_SYMBOLS.BOS, + ], false, false, ), @@ -59,6 +66,7 @@ export class LendingPoolDictionary { COMMON_SYMBOLS.XUSD, COMMON_SYMBOLS.DOC, COMMON_SYMBOLS.SOV, + COMMON_SYMBOLS.BOS, ], false, false, diff --git a/apps/frontend/src/utils/asset.ts b/apps/frontend/src/utils/asset.ts index 9aa623a3b..5dc7bb776 100644 --- a/apps/frontend/src/utils/asset.ts +++ b/apps/frontend/src/utils/asset.ts @@ -37,6 +37,7 @@ export const COMMON_SYMBOLS = { ETH: 'ETH', WBTC_OLD: 'WBTC.OLD', USDT: 'USDT', + BOS: 'BOS', }; export const compareAssets = (asset1?: string | null, asset2?: string | null) => diff --git a/packages/contracts/src/contracts/assets/rsk.ts b/packages/contracts/src/contracts/assets/rsk.ts index 53327e3ce..5d548f449 100644 --- a/packages/contracts/src/contracts/assets/rsk.ts +++ b/packages/contracts/src/contracts/assets/rsk.ts @@ -127,7 +127,7 @@ export const rsk: Array = [ }, { symbol: 'BOS', - address: '0x3E3006896458F0ACfE79b57A1A0fe067B3a1ce6f', + address: '0x3e3006896458f0acfe79b57a1a0fe067b3a1ce6f', name: 'BitcoinOS Token', decimals: 18, getIcon: async () => (await import('./icons/rsk/bos')).default, diff --git a/packages/contracts/src/contracts/assets/rskTestnet.ts b/packages/contracts/src/contracts/assets/rskTestnet.ts index cbe979416..36e76f6bf 100644 --- a/packages/contracts/src/contracts/assets/rskTestnet.ts +++ b/packages/contracts/src/contracts/assets/rskTestnet.ts @@ -125,4 +125,11 @@ export const rskTestnet: Array = [ decimals: 18, getIcon: async () => (await import('./icons/rsk/powa')).default, }, + { + symbol: 'BOS', + address: '0x0000000000000000000000000000000000000000', + name: 'BitcoinOS Token', + decimals: 18, + getIcon: async () => (await import('./icons/rsk/bos')).default, + }, ]; From 543fc66590a21a672905121527d298ad7ecfddaf Mon Sep 17 00:00:00 2001 From: Victor Creed Date: Thu, 8 Jan 2026 10:26:23 +0200 Subject: [PATCH 2/2] fix: review comments --- .../components/OpenLoansTable/hooks/useGetOpenLoans.ts | 3 +-- packages/contracts/src/contracts/assets/rskTestnet.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts b/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts index 35890de6d..cfb118d40 100644 --- a/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts +++ b/apps/frontend/src/app/5_pages/BorrowPage/components/OpenLoansTable/hooks/useGetOpenLoans.ts @@ -29,7 +29,7 @@ const unsafeOnly = false; export const useGetOpenLoans = () => { const { account } = useAccount(); - const blockNumber = useBlockNumber(); + const { value: blockNumber } = useBlockNumber(); const contract = useLoadContract('protocol', 'protocol', RSK_CHAIN_ID); const { @@ -112,7 +112,6 @@ export const useGetOpenLoans = () => { }, enabled: !!account && !!contract, placeholderData: keepPreviousData, - throwOnError: true, }); return { diff --git a/packages/contracts/src/contracts/assets/rskTestnet.ts b/packages/contracts/src/contracts/assets/rskTestnet.ts index 36e76f6bf..876c59484 100644 --- a/packages/contracts/src/contracts/assets/rskTestnet.ts +++ b/packages/contracts/src/contracts/assets/rskTestnet.ts @@ -127,7 +127,7 @@ export const rskTestnet: Array = [ }, { symbol: 'BOS', - address: '0x0000000000000000000000000000000000000000', + address: '0x0000000000000000000000000000000000000000', // todo: This is a placeholder address, change it once we have it deployed on RSK Testnet name: 'BitcoinOS Token', decimals: 18, getIcon: async () => (await import('./icons/rsk/bos')).default,