From 0855c6959eb124ffbac693921dd722211e2d1759 Mon Sep 17 00:00:00 2001 From: tiltom Date: Tue, 25 Nov 2025 15:05:31 +0200 Subject: [PATCH 1/2] SOV-5247: BOS bridging and trading (#1122) * Add BOS to the ERC20 bridge UI * Create red-otters-relax.md * BOS AMM pool and Convert page adjustments * Add BOS to the new pairs section * Bump up gas limit for AMM deposits * fix: bos pool token address * Temporary fix for LP fee rate --------- Co-authored-by: Victor Creed --- .changeset/red-otters-relax.md | 6 +++ .../MarketMakingPage.constants.ts | 10 +++++ .../components/MarketMaking/MarketMaking.tsx | 37 ++++++++++++++++++- .../PoolStatistics/PoolStatistics.tsx | 30 ++++++++++++++- apps/frontend/src/constants/gasLimits.ts | 2 +- .../contracts/src/contracts/assets/eth.ts | 7 ++++ .../src/contracts/assets/icons/rsk/bos.ts | 34 +++++++++++++++++ .../contracts/src/contracts/assets/rsk.ts | 7 ++++ .../sdk/src/_tests/swaps/smart-router.test.ts | 4 +- packages/sdk/src/bridge/config/assets.ts | 17 +++++++++ .../smart-router/routes/amm-swap-route.ts | 1 + 11 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 .changeset/red-otters-relax.md create mode 100644 packages/contracts/src/contracts/assets/icons/rsk/bos.ts diff --git a/.changeset/red-otters-relax.md b/.changeset/red-otters-relax.md new file mode 100644 index 000000000..16e1269cb --- /dev/null +++ b/.changeset/red-otters-relax.md @@ -0,0 +1,6 @@ +--- +"@sovryn/contracts": patch +"@sovryn/sdk": patch +--- + +SOV-5247: BOS bridging and trading diff --git a/apps/frontend/src/app/5_pages/MarketMakingPage/MarketMakingPage.constants.ts b/apps/frontend/src/app/5_pages/MarketMakingPage/MarketMakingPage.constants.ts index a299ca2da..ab44c2e58 100644 --- a/apps/frontend/src/app/5_pages/MarketMakingPage/MarketMakingPage.constants.ts +++ b/apps/frontend/src/app/5_pages/MarketMakingPage/MarketMakingPage.constants.ts @@ -136,6 +136,16 @@ export const MAINNET_AMM = [ '0x4531DD0f24D204c08b251084E12ce3D3e70Dd03e', '0xBfd61419D30650FD943855b2bbE4C2A2E54857f9', ), + new AmmLiquidityPool( + 'BOS', + COMMON_SYMBOLS.BTC, + 1, + ChainIds.RSK_MAINNET, + '0xF1DeE3175593f4e13a2b9e09a5FaafC513c9A27F', + '0xfd834bbcde8c3ac4766bf5c1f5d861400103087b', + undefined, + true, + ), ]; export const TESTNET_AMM = [ diff --git a/apps/frontend/src/app/5_pages/MarketMakingPage/components/MarketMaking/MarketMaking.tsx b/apps/frontend/src/app/5_pages/MarketMakingPage/components/MarketMaking/MarketMaking.tsx index e2a5bc858..21d45e717 100644 --- a/apps/frontend/src/app/5_pages/MarketMakingPage/components/MarketMaking/MarketMaking.tsx +++ b/apps/frontend/src/app/5_pages/MarketMakingPage/components/MarketMaking/MarketMaking.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useEffect, useState } from 'react'; +import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { t } from 'i18next'; import { Helmet } from 'react-helmet-async'; @@ -17,8 +17,11 @@ import { MarketMakingNetworkBanner } from '../../../../2_molecules/MarketMakingN import { RSK_STORAGE_KEY } from '../../../../2_molecules/MarketMakingNetworkBanner/MarketMakingNetworkBanner.constants'; import { useIsMobile } from '../../../../../hooks/useIsMobile'; import { translations } from '../../../../../locales/i18n'; +import { AmmLiquidityPoolDictionary } from '../../utils/AmmLiquidityPoolDictionary'; import { PoolsTable } from '../PoolsTable/PoolsTable'; +const ammPools = AmmLiquidityPoolDictionary.list(); + export const MarketMaking: FC = () => { const { isMobile } = useIsMobile(); const [activePool, setActivePool] = useState(''); @@ -38,6 +41,11 @@ export const MarketMaking: FC = () => { } }, [activePool, isMobile]); + const isAnyPoolHighlighted = useMemo( + () => ammPools.some(pool => pool.isHighlighted), + [], + ); + return ( <> @@ -71,6 +79,33 @@ export const MarketMaking: FC = () => { )} /> + + {isAnyPoolHighlighted && ( + <> + + {t(translations.marketMakingPage.newPairs)} + + + + + + {t(translations.marketMakingPage.allPairs)} + + + )} + = ({ pool }) => { } = useGetProtocolFee(); const renderLpFeeRate = useMemo(() => { + // Temporary fix for BOS pool + if (pool.poolTokenA === '0xfd834bbcde8c3ac4766bf5c1f5d861400103087b') { + return ( + + ); + } + if (pool.converterVersion === 2) { return ( = ({ pool }) => { ) : ( 0 ); - }, [conversionFee, conversionFeeLoading, pool.converterVersion]); + }, [ + conversionFee, + conversionFeeLoading, + pool.converterVersion, + pool.poolTokenA, + ]); const renderBitocracyFeeRate = useMemo( () => @@ -73,6 +89,17 @@ export const PoolsStatistics: FC = ({ pool }) => { ); const renderTotalSwapFeeRate = useMemo(() => { + // Temporary fix for BOS pool + if (pool.poolTokenA === '0xfd834bbcde8c3ac4766bf5c1f5d861400103087b') { + return ( + + ); + } + if (pool.converterVersion === 2) { return ( = ({ pool }) => { 0 ); }, [ + pool.poolTokenA, pool.converterVersion, protocolFeeLoading, conversionFeeLoading, diff --git a/apps/frontend/src/constants/gasLimits.ts b/apps/frontend/src/constants/gasLimits.ts index fbd994a48..1bcadcfbb 100644 --- a/apps/frontend/src/constants/gasLimits.ts +++ b/apps/frontend/src/constants/gasLimits.ts @@ -31,7 +31,7 @@ export const GAS_LIMIT = { PROPOSAL_QUEUE: 250_000, PROPOSAL_EXECUTE: 6_000_000, MARKET_MAKING_DEPOSIT: 6_000_000, - MARKET_MAKING_ADD_LIQUIDITY: 550_000, + MARKET_MAKING_ADD_LIQUIDITY: 750_000, MARKET_MAKING_REMOVE_LIQUIDITY: 650_000, MARKET_MAKING_CLAIM_FEES: 650_000, MARKET_MAKING_REPOSITION: 600_000, diff --git a/packages/contracts/src/contracts/assets/eth.ts b/packages/contracts/src/contracts/assets/eth.ts index 95c2d6c68..3bebea3d8 100644 --- a/packages/contracts/src/contracts/assets/eth.ts +++ b/packages/contracts/src/contracts/assets/eth.ts @@ -26,4 +26,11 @@ export const eth: Array = [ decimals: 18, getIcon: async () => (await import('./icons/rsk/dllr')).default, }, + { + symbol: 'BOS', + address: '0x13239C268BEDDd88aD0Cb02050D3ff6a9d00de6D', + name: 'BitcoinOS Token', + decimals: 18, + getIcon: async () => (await import('./icons/rsk/bos')).default, + }, ]; diff --git a/packages/contracts/src/contracts/assets/icons/rsk/bos.ts b/packages/contracts/src/contracts/assets/icons/rsk/bos.ts new file mode 100644 index 000000000..a0865b7d4 --- /dev/null +++ b/packages/contracts/src/contracts/assets/icons/rsk/bos.ts @@ -0,0 +1,34 @@ +// eslint-disable-next-line import/no-anonymous-default-export +export default ` + + + + + + + +`; diff --git a/packages/contracts/src/contracts/assets/rsk.ts b/packages/contracts/src/contracts/assets/rsk.ts index 0f3b3a254..53327e3ce 100644 --- a/packages/contracts/src/contracts/assets/rsk.ts +++ b/packages/contracts/src/contracts/assets/rsk.ts @@ -125,4 +125,11 @@ export const rsk: Array = [ decimals: 18, getIcon: async () => (await import('./icons/rsk/powa')).default, }, + { + symbol: 'BOS', + address: '0x3E3006896458F0ACfE79b57A1A0fe067B3a1ce6f', + name: 'BitcoinOS Token', + decimals: 18, + getIcon: async () => (await import('./icons/rsk/bos')).default, + }, ]; diff --git a/packages/sdk/src/_tests/swaps/smart-router.test.ts b/packages/sdk/src/_tests/swaps/smart-router.test.ts index 3a63b6d65..594e0ed3f 100644 --- a/packages/sdk/src/_tests/swaps/smart-router.test.ts +++ b/packages/sdk/src/_tests/swaps/smart-router.test.ts @@ -117,12 +117,12 @@ describe('SmartRouter', () => { }); it('returns all available entries', async () => { - await expect(router.getEntries(chainId)).resolves.toHaveLength(16); + await expect(router.getEntries(chainId)).resolves.toHaveLength(17); }); it('returns all available destinations for entry token', async () => { await expect(router.getDestination(chainId, sov)).resolves.toHaveLength( - 14, + 15, ); }); diff --git a/packages/sdk/src/bridge/config/assets.ts b/packages/sdk/src/bridge/config/assets.ts index 558ae7ab6..95544bdbb 100644 --- a/packages/sdk/src/bridge/config/assets.ts +++ b/packages/sdk/src/bridge/config/assets.ts @@ -86,6 +86,15 @@ export const ethToRskMainnetAssets: AssetConfig[] = [ aggregatorContractAddress: aggregators.mainnet.eths, bridgeTokenAddress: '0xd412acd34a832a09c80c8a4895ff46d733f09538', }, + { + symbol: 'BOS', + minDecimals: 4, + isNative: false, + isBase: false, + usesAggregator: false, + aggregatorContractAddress: undefined, + bridgeTokenAddress: '0x13239C268BEDDd88aD0Cb02050D3ff6a9d00de6D', + }, ]; // RSK to ETH Assets (Mainnet) @@ -115,6 +124,14 @@ export const rskToEthMainnetAssets: AssetConfig[] = [ aggregatorContractAddress: aggregators.mainnet.eths, bridgeTokenAddress: '0xFe878227c8F334038DAb20a99fC3B373fFe0a755', }, + { + symbol: 'BOS', + minDecimals: 4, + isNative: false, + isBase: false, + usesAggregator: false, + aggregatorContractAddress: undefined, + }, ]; // BSC to RSK Assets (Testnet) diff --git a/packages/sdk/src/swaps/smart-router/routes/amm-swap-route.ts b/packages/sdk/src/swaps/smart-router/routes/amm-swap-route.ts index a687da91b..af3cec8f2 100644 --- a/packages/sdk/src/swaps/smart-router/routes/amm-swap-route.ts +++ b/packages/sdk/src/swaps/smart-router/routes/amm-swap-route.ts @@ -124,6 +124,7 @@ export const ammSwapRoute: SwapRouteFunction = ( 'MYNT', 'BPRO', 'POWA', + 'BOS', ]; const contracts = ( From 4c361237141d806f57220e9e1a942ff98ca6c69c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:09:35 +0200 Subject: [PATCH 2/2] Version Packages (#1123) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/red-otters-relax.md | 6 ------ packages/contracts/CHANGELOG.md | 6 ++++++ packages/contracts/package.json | 2 +- packages/sdk/CHANGELOG.md | 8 ++++++++ packages/sdk/package.json | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 .changeset/red-otters-relax.md diff --git a/.changeset/red-otters-relax.md b/.changeset/red-otters-relax.md deleted file mode 100644 index 16e1269cb..000000000 --- a/.changeset/red-otters-relax.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@sovryn/contracts": patch -"@sovryn/sdk": patch ---- - -SOV-5247: BOS bridging and trading diff --git a/packages/contracts/CHANGELOG.md b/packages/contracts/CHANGELOG.md index 9114b6145..8b41e53aa 100644 --- a/packages/contracts/CHANGELOG.md +++ b/packages/contracts/CHANGELOG.md @@ -1,5 +1,11 @@ # @sovryn/contracts +## 1.2.7 + +### Patch Changes + +- 0855c695: SOV-5247: BOS bridging and trading + ## 1.2.6 ### Patch Changes diff --git a/packages/contracts/package.json b/packages/contracts/package.json index e992ef8fd..f938c4be6 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@sovryn/contracts", - "version": "1.2.6", + "version": "1.2.7", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index dfa0fbf7a..5bbfecbae 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -1,5 +1,13 @@ # @sovryn/sdk +## 2.0.9 + +### Patch Changes + +- 0855c695: SOV-5247: BOS bridging and trading +- Updated dependencies [0855c695] + - @sovryn/contracts@1.2.7 + ## 2.0.8 ### Patch Changes diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 230022a20..39c1faab3 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@sovryn/sdk", - "version": "2.0.8", + "version": "2.0.9", "main": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT",