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/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/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/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", 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 = (