From 34a8da03cd105714714bb85082346bcde5a8d384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Fri, 6 Sep 2024 08:09:13 +0200 Subject: [PATCH 01/20] chore: upgrade unified bridge sdk --- package.json | 2 +- src/contexts/UnifiedBridgeProvider.tsx | 88 +++++++++++++++++--------- yarn.lock | 39 ++++++------ 3 files changed, 78 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 8af32a293..a2e1d4fc1 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "@avalabs/avalanchejs": "4.0.5", "@avalabs/bitcoin-module": "0.5.0", - "@avalabs/bridge-unified": "2.1.0", + "@avalabs/bridge-unified": "0.0.0-fix-make-sign-optional-for-gas-20240905074019", "@avalabs/core-bridge-sdk": "3.1.0-alpha.4", "@avalabs/core-chains-sdk": "3.1.0-alpha.4", "@avalabs/core-coingecko-sdk": "3.1.0-alpha.4", diff --git a/src/contexts/UnifiedBridgeProvider.tsx b/src/contexts/UnifiedBridgeProvider.tsx index 3fd1c1210..46a2185be 100644 --- a/src/contexts/UnifiedBridgeProvider.tsx +++ b/src/contexts/UnifiedBridgeProvider.tsx @@ -16,6 +16,8 @@ import { TokenType, createUnifiedBridgeService, BridgeTransfer, + getEnabledBridgeServices, + BridgeServicesMap, } from '@avalabs/bridge-unified'; import { ethErrors } from 'eth-rpc-errors'; import { filter, map } from 'rxjs'; @@ -125,25 +127,55 @@ export function UnifiedBridgeProvider({ ); const { featureFlags } = useFeatureFlagContext(); const isCCTPDisabled = !featureFlags[FeatureGates.UNIFIED_BRIDGE_CCTP]; - const disabledBridges = useMemo( + const disabledBridgeTypes = useMemo( () => (isCCTPDisabled ? [BridgeType.CCTP] : []), [isCCTPDisabled] ); + const environment = useMemo(() => { + if (typeof activeNetwork?.isTestnet !== 'boolean') { + return null; + } + + return activeNetwork.isTestnet ? Environment.TEST : Environment.PROD; + }, []); + + const [enabledBridgeServices, setEnabledBridgeServices] = + useState(); + + useEffect(() => { + if (!environment) { + return; + } + + let isMounted = true; + + getEnabledBridgeServices(environment, disabledBridgeTypes) + .then((bridges) => { + if (isMounted) setEnabledBridgeServices(bridges); + }) + .catch((err) => { + console.log('Unable to initialize bridge services', err); + if (isMounted) setEnabledBridgeServices(undefined); + }); + + return () => { + isMounted = false; + }; + }, [environment, disabledBridgeTypes]); + // Memoize the core instance of Unified Bridge based on the current // network environment & feature flags configuration - const core = useMemo( - () => - activeNetwork - ? createUnifiedBridgeService({ - environment: activeNetwork.isTestnet - ? Environment.TEST - : Environment.PROD, - disabledBridgeTypes: disabledBridges, - }) - : null, - [activeNetwork, disabledBridges] - ); + const core = useMemo(() => { + if (!environment || !enabledBridgeServices) { + return null; + } + + return createUnifiedBridgeService({ + environment, + enabledBridgeServices, + }); + }, [environment, enabledBridgeServices]); // Whenever core instance is re-created, initialize it and update assets useEffect(() => { @@ -153,12 +185,12 @@ export function UnifiedBridgeProvider({ let isMounted = true; - core.init().then(async () => { + core.getAssets().then((chainAssetsMap) => { if (!isMounted) { return; } - setAssets(await core.getAssets()); + setAssets(chainAssetsMap); }); return () => { @@ -167,7 +199,7 @@ export function UnifiedBridgeProvider({ }, [core]); const buildChain = useCallback( - (chainId: number) => { + (chainId: number): Chain => { const network = getNetwork(chainId); assert(network, CommonError.UnknownNetwork); @@ -221,14 +253,16 @@ export function UnifiedBridgeProvider({ }, [events, request]); const supportsAsset = useCallback( - (lookupAddress: string, targetChainId: number) => { + (lookupAddressOrSymbol: string, targetChainId: number) => { if (!activeNetwork) { return false; } const sourceAssets = assets[getNetworkCaipId(activeNetwork)] ?? []; - const asset = sourceAssets.find(({ address }) => { - return lookupAddress === address; + const asset = sourceAssets.find((token) => { + return token.type === TokenType.NATIVE + ? token.symbol === lookupAddressOrSymbol + : token.address === lookupAddressOrSymbol; }); if (!asset) { @@ -300,8 +334,7 @@ export function UnifiedBridgeProvider({ assert(activeNetwork, CommonError.NoActiveNetwork); const asset = getAsset(symbol, activeNetwork.chainId); - - assert(asset?.address, UnifiedBridgeError.UnknownAsset); + assert(asset, UnifiedBridgeError.UnknownAsset); const feeMap = await core.getFees({ asset, @@ -310,17 +343,10 @@ export function UnifiedBridgeProvider({ sourceChain: buildChain(activeNetwork.chainId), }); - const fee = feeMap[asset.address]; - - if (typeof fee !== 'bigint') { - throw ethErrors.rpc.invalidRequest({ - data: { - reason: UnifiedBridgeError.InvalidFee, - }, - }); - } + const identifier = + asset.type === TokenType.NATIVE ? asset.symbol : asset.address; - return fee; + return feeMap[identifier] ?? 0n; }, [activeNetwork, core, buildChain, getAsset] ); diff --git a/yarn.lock b/yarn.lock index 5d0b13e05..18dd12916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,14 +56,15 @@ bn.js "5.2.1" zod "3.23.8" -"@avalabs/bridge-unified@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-2.1.0.tgz#2b247cf46df387aeac8633b016419a056e12567b" - integrity sha512-s0lmYoTqi3J9mtA5Ja6qOKLDT/XMsv8D9wGNaWS+bBTOePf0nMDxRZ8k+BhEBikR3upGuQY8gtOEl2j9vkxkrA== +"@avalabs/bridge-unified@0.0.0-fix-make-sign-optional-for-gas-20240905074019": + version "0.0.0-fix-make-sign-optional-for-gas-20240905074019" + resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-0.0.0-fix-make-sign-optional-for-gas-20240905074019.tgz#543a62a639ba36a7624ed4dca22cfbc47720a3eb" + integrity sha512-a1I1kWMe4u9MZsNvBFQahNtPHefFL2RMeT+oLfbR6CClHrDyvcPURdt4mV+oV9oDSSAwK2Lg28cdfxokfkdo3A== dependencies: abitype "0.9.3" lodash "4.17.21" - viem "1.19.8" + viem "2.11.1" + zod "3.23.8" "@avalabs/core-bridge-sdk@3.1.0-alpha.4": version "3.1.0-alpha.4" @@ -6912,10 +6913,10 @@ abitype@0.9.3: resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.3.tgz#294d25288ee683d72baf4e1fed757034e3c8c277" integrity sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w== -abitype@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" - integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== abort-controller@^3.0.0: version "3.0.0" @@ -13238,10 +13239,10 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isows@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" - integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== +isows@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061" + integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ== isstream@~0.1.2: version "0.1.2" @@ -20591,18 +20592,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -viem@1.19.8: - version "1.19.8" - resolved "https://registry.yarnpkg.com/viem/-/viem-1.19.8.tgz#036c4a5f76adf8fcbcc279c82ee5bdf398d82adf" - integrity sha512-AgoZcLej7u4Zw/ojDsDWfonPSoz07EirrvXVndAMG78ikHf7VnRbxkFACAFg2SgNbCXmr5+ePHpgd53dMVIZ4Q== +viem@2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.11.1.tgz#03ff205734c21748b7a0df8e5f956db61ebaf1c5" + integrity sha512-4iypXhxWkXoWO45XStxQvhj/vYZ5+3AtSEngHiOnuHOSNoiIsYfDvTMoTiAO53PeyYvExyVzJc9BFwejGHh7pg== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" "@noble/hashes" "1.3.2" "@scure/bip32" "1.3.2" "@scure/bip39" "1.2.1" - abitype "0.9.8" - isows "1.0.3" + abitype "1.0.0" + isows "1.0.4" ws "8.13.0" vinyl-fs@^3.0.1: From 814151cf2bf654a97b7a5047eb21d8e5f6048495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 10 Sep 2024 12:34:17 +0200 Subject: [PATCH 02/20] chore: make extension compatible with new UnifiedBridge SDK --- package.json | 2 +- .../history/HistoryServiceBridgeHelper.ts | 6 +- .../services/history/HistoryServiceGlacier.ts | 8 +- .../UnifiedBridgeService.test.ts | 20 +++- .../unifiedBridge/UnifiedBridgeService.ts | 100 ++++++++++++------ .../services/unifiedBridge/models.ts | 2 - src/contexts/UnifiedBridgeProvider.tsx | 52 ++++++--- src/localization/locales/en/translation.json | 1 + src/pages/Bridge/Bridge.tsx | 29 ++--- src/pages/Bridge/BridgeTransactionStatus.tsx | 15 ++- src/pages/Bridge/components/BridgeForm.tsx | 46 +++++--- .../Bridge/components/BridgeFormUnified.tsx | 6 +- src/pages/Bridge/hooks/useBridge.ts | 5 +- src/pages/Bridge/hooks/useBridgeAmounts.ts | 2 +- .../Bridge/hooks/useBridgeTransferStatus.ts | 8 +- .../hooks/useLogoUriForBridgeTransaction.ts | 3 +- src/pages/Bridge/hooks/useUnifiedBridge.ts | 12 +-- src/pages/Bridge/utils/getBalances.ts | 11 +- src/pages/Bridge/utils/getTokenAddress.ts | 3 +- src/pages/Wallet/WalletRecentTxs.tsx | 3 +- .../InProgressBridgeActivityCard.tsx | 22 +++- .../components/History/useBlockchainNames.ts | 18 ++-- src/utils/bridge/getBridgedAssetSymbol.ts | 13 +++ src/utils/lowerCaseKeys.ts | 5 + yarn.lock | 8 +- 25 files changed, 263 insertions(+), 137 deletions(-) create mode 100644 src/utils/bridge/getBridgedAssetSymbol.ts create mode 100644 src/utils/lowerCaseKeys.ts diff --git a/package.json b/package.json index a2e1d4fc1..b25b05083 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "@avalabs/avalanchejs": "4.0.5", "@avalabs/bitcoin-module": "0.5.0", - "@avalabs/bridge-unified": "0.0.0-fix-make-sign-optional-for-gas-20240905074019", + "@avalabs/bridge-unified": "0.0.0-feat-is-bridge-address-20240909115936", "@avalabs/core-bridge-sdk": "3.1.0-alpha.4", "@avalabs/core-chains-sdk": "3.1.0-alpha.4", "@avalabs/core-coingecko-sdk": "3.1.0-alpha.4", diff --git a/src/background/services/history/HistoryServiceBridgeHelper.ts b/src/background/services/history/HistoryServiceBridgeHelper.ts index 86a00087a..106fa8e23 100644 --- a/src/background/services/history/HistoryServiceBridgeHelper.ts +++ b/src/background/services/history/HistoryServiceBridgeHelper.ts @@ -27,16 +27,12 @@ export class HistoryServiceBridgeHelper { const config = this.bridgeService.bridgeConfig; const ethereumAssets = config?.config?.critical.assets; const bitcoinAssets = config?.config?.criticalBitcoin?.bitcoinAssets; - const unifiedBridgeAddresses = this.unifiedBridgeService.state.addresses; if (!ethereumAssets || !bitcoinAssets) { return false; } - if ( - unifiedBridgeAddresses.includes(tx.from.toLowerCase()) || - unifiedBridgeAddresses.includes(tx.to.toLowerCase()) - ) { + if (this.unifiedBridgeService.isBridgeAddress(tx.from, tx.to)) { return true; } diff --git a/src/background/services/history/HistoryServiceGlacier.ts b/src/background/services/history/HistoryServiceGlacier.ts index 3f9bcc4ee..65451a6c4 100644 --- a/src/background/services/history/HistoryServiceGlacier.ts +++ b/src/background/services/history/HistoryServiceGlacier.ts @@ -90,10 +90,10 @@ export class HistoryServiceGlacier { return false; } - return [ - ETHEREUM_ADDRESS, - ...this.unifiedBridgeService.state.addresses, - ].includes(address.toLowerCase()); + return ( + ETHEREUM_ADDRESS === address.toLowerCase() || + this.unifiedBridgeService.isBridgeAddress(address) + ); } private getHistoryItemCategories( diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts index 628141724..9eca295c6 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts @@ -1,6 +1,7 @@ import { Environment, createUnifiedBridgeService, + getEnabledBridgeServices, } from '@avalabs/bridge-unified'; import { UnifiedBridgeService } from './UnifiedBridgeService'; import { FeatureGates } from '../featureFlags/models'; @@ -49,10 +50,10 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { getAssets: jest.fn().mockResolvedValue({}), trackTransfer, transferAsset, - init: jest.fn().mockResolvedValue(undefined), } as any; jest.mocked(createUnifiedBridgeService).mockReturnValue(core); + jest.mocked(getEnabledBridgeServices).mockResolvedValue({} as any); networkService.isMainnet.mockReturnValue(false); networkService.getNetwork.mockImplementation(async (chainId) => ({ @@ -62,11 +63,13 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { new UnifiedBridgeService(networkService, storageService, flagsService); }); - it('creates core instance with proper environment', () => { + it('creates core instance with proper environment', async () => { networkService.isMainnet.mockReturnValue(true); new UnifiedBridgeService(networkService, storageService, flagsService); + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call + expect(createUnifiedBridgeService).toHaveBeenCalledWith( expect.objectContaining({ environment: Environment.PROD, @@ -84,20 +87,25 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { ); }); - it('recreates the core instance on testnet mode switch', () => { + it('recreates the core instance on testnet mode switch', async () => { const mockTestnetModeChange = ( networkService.developerModeChanged.add as jest.Mock ).mock.lastCall[0]; + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledTimes(1); + mockTestnetModeChange(); + + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledTimes(2); }); - it('recreates the core instance when certain feature flags are toggled', () => { + it('recreates the core instance when certain feature flags are toggled', async () => { const mockFeatureFlagChanges = (flagsService.addListener as jest.Mock).mock .lastCall[1]; + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledTimes(1); // Toggle an irrelevant flag off @@ -105,6 +113,8 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { [FeatureGates.UNIFIED_BRIDGE_CCTP]: true, [FeatureGates.IMPORT_FIREBLOCKS]: false, }); + + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledTimes(1); // Toggle a relevant flag off @@ -112,6 +122,8 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { [FeatureGates.UNIFIED_BRIDGE_CCTP]: false, [FeatureGates.IMPORT_FIREBLOCKS]: false, }); + + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledTimes(2); }); diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.ts index 17487fc97..c98bb33a7 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.ts @@ -4,9 +4,12 @@ import { BridgeType, createUnifiedBridgeService, Environment, + getEnabledBridgeServices, } from '@avalabs/bridge-unified'; +import { wait } from '@avalabs/core-utils-sdk'; import EventEmitter from 'events'; +import { getExponentialBackoffDelay } from '@src/utils/exponentialBackoff'; import { OnStorageReady } from '@src/background/runtime/lifecycleCallbacks'; import { NetworkService } from '../network/NetworkService'; import { StorageService } from '../storage/StorageService'; @@ -30,9 +33,10 @@ import sentryCaptureException, { @singleton() export class UnifiedBridgeService implements OnStorageReady { - #core: ReturnType; + #core?: ReturnType; #eventEmitter = new EventEmitter(); #state = UNIFIED_BRIDGE_DEFAULT_STATE; + #failedInitAttempts = 0; // We'll re-create the #core instance when one of these flags is toggled. #flagStates: Partial = {}; @@ -49,11 +53,11 @@ export class UnifiedBridgeService implements OnStorageReady { this.#flagStates = this.#getTrackedFlags( this.featureFlagService.featureFlags ); - this.#core = this.#createService(); + this.#recreateService(); // When testnet mode is toggled, we need to recreate the instance. this.networkService.developerModeChanged.add(() => { - this.#core = this.#createService(); + this.#recreateService(); }); // When some of the feature flags change, we need to recreate the instance. @@ -65,7 +69,7 @@ export class UnifiedBridgeService implements OnStorageReady { if (JSON.stringify(newFlags) !== JSON.stringify(this.#flagStates)) { this.#flagStates = newFlags; - this.#core = this.#createService(); + this.#recreateService(); } } ); @@ -104,51 +108,77 @@ export class UnifiedBridgeService implements OnStorageReady { }); } - #updateBridgeAddresses() { - const addresses: string[] = []; - - this.#core.bridges.forEach((bridge) => { - if (bridge.config) { - addresses.push( - ...bridge.config.map( - ({ tokenRouterAddress }) => tokenRouterAddress as string - ) - ); - } - }); - - this.#saveState({ - ...this.#state, - addresses, - }); - } - #getDisabledBridges(): BridgeType[] { const bridges: BridgeType[] = []; if (!this.#flagStates[FeatureGates.UNIFIED_BRIDGE_CCTP]) { bridges.push(BridgeType.CCTP); } - return bridges; } - #createService() { - const core = createUnifiedBridgeService({ - environment: this.networkService.isMainnet() - ? Environment.PROD - : Environment.TEST, - disabledBridgeTypes: this.#getDisabledBridges(), - }); - core.init().then(async () => { - this.#updateBridgeAddresses(); + async #recreateService() { + const environment = this.networkService.isMainnet() + ? Environment.PROD + : Environment.TEST; + + try { + this.#core = createUnifiedBridgeService({ + environment, + enabledBridgeServices: await getEnabledBridgeServices( + environment, + this.#getDisabledBridges() + ), + }); + this.#failedInitAttempts = 0; this.#trackPendingTransfers(); - }); + } catch (err: any) { + // If it failed, it's most likely a network issue. + // Wait a bit and try again. + this.#failedInitAttempts += 1; + + const delay = getExponentialBackoffDelay({ + attempt: this.#failedInitAttempts, + startsAfter: 1, + }); + + sentryCaptureException(err, SentryExceptionTypes.UNIFIED_BRIDGE); + console.log( + `Initialization of UnifiedBridgeService failed, attempt #${ + this.#failedInitAttempts + }. Retry in ${delay / 1000}s` + ); + + await wait(delay); - return core; + // Do not attempt again if it succeded in the meantime + // (e.g. user switched developer mode or feature flags updated) + if (this.#failedInitAttempts > 0) { + this.#recreateService(); + } + } + } + + isBridgeAddress(...addresses: string[]): boolean { + if (!this.#core) { + return false; + } + + return this.#core.isBridgeAddress(...addresses); } trackTransfer(bridgeTransfer: BridgeTransfer) { + if (!this.#core) { + // Just log that this happened. This is edge-casey, but technically possible. + sentryCaptureException( + new Error( + `UnifiedBridge - tracking attempted with no service insantiated.` + ), + SentryExceptionTypes.UNIFIED_BRIDGE + ); + return; + } + const { result } = this.#core.trackTransfer({ bridgeTransfer, updateListener: async (transfer) => { diff --git a/src/background/services/unifiedBridge/models.ts b/src/background/services/unifiedBridge/models.ts index 0861cd010..700a2b874 100644 --- a/src/background/services/unifiedBridge/models.ts +++ b/src/background/services/unifiedBridge/models.ts @@ -16,14 +16,12 @@ export enum UnifiedBridgeError { export type UnifiedBridgeState = { pendingTransfers: Record; - addresses: string[]; }; export const UNIFIED_BRIDGE_TRACKED_FLAGS = [FeatureGates.UNIFIED_BRIDGE_CCTP]; export const UNIFIED_BRIDGE_DEFAULT_STATE: UnifiedBridgeState = { pendingTransfers: {}, - addresses: [], }; export const UNIFIED_BRIDGE_STATE_STORAGE_KEY = 'UNIFIED_BRIDGE_STATE'; diff --git a/src/contexts/UnifiedBridgeProvider.tsx b/src/contexts/UnifiedBridgeProvider.tsx index 46a2185be..aa6a0f771 100644 --- a/src/contexts/UnifiedBridgeProvider.tsx +++ b/src/contexts/UnifiedBridgeProvider.tsx @@ -47,6 +47,7 @@ import { NetworkVMType } from '@avalabs/core-chains-sdk'; import { DAppProviderRequest } from '@src/background/connections/dAppConnection/models'; import { EthSendTransactionHandler } from '@src/background/services/wallet/handlers/eth_sendTransaction'; import { UnifiedBridgeTrackTransfer } from '@src/background/services/unifiedBridge/handlers/unifiedBridgeTrackTransfer'; +import { lowerCaseKeys } from '@src/utils/lowerCaseKeys'; export interface UnifiedBridgeContext { estimateTransferGas( @@ -54,7 +55,7 @@ export interface UnifiedBridgeContext { amount: bigint, targetChainId: number ): Promise; - getAssetAddressOnTargetChain( + getAssetIdentifierOnTargetChain( symbol?: string, chainId?: number ): string | undefined; @@ -63,6 +64,7 @@ export interface UnifiedBridgeContext { amount: bigint, targetChainId: number ): Promise; + isBridgeAddress(...addresses: string[]): boolean; supportsAsset(address: string, targetChainId: number): boolean; transferAsset( symbol: string, @@ -79,7 +81,7 @@ const DEFAULT_STATE = { estimateTransferGas() { throw new Error('Bridge not ready'); }, - getAssetAddressOnTargetChain() { + getAssetIdentifierOnTargetChain() { return undefined; }, getErrorMessage() { @@ -88,6 +90,9 @@ const DEFAULT_STATE = { supportsAsset() { return false; }, + isBridgeAddress() { + return false; + }, transferAsset() { throw new Error('Bridge not ready'); }, @@ -128,7 +133,10 @@ export function UnifiedBridgeProvider({ const { featureFlags } = useFeatureFlagContext(); const isCCTPDisabled = !featureFlags[FeatureGates.UNIFIED_BRIDGE_CCTP]; const disabledBridgeTypes = useMemo( - () => (isCCTPDisabled ? [BridgeType.CCTP] : []), + () => + isCCTPDisabled + ? [BridgeType.CCTP, BridgeType.ICTT_ERC20_ERC20] + : [BridgeType.ICTT_ERC20_ERC20], [isCCTPDisabled] ); @@ -138,7 +146,7 @@ export function UnifiedBridgeProvider({ } return activeNetwork.isTestnet ? Environment.TEST : Environment.PROD; - }, []); + }, [activeNetwork?.isTestnet]); const [enabledBridgeServices, setEnabledBridgeServices] = useState(); @@ -336,17 +344,19 @@ export function UnifiedBridgeProvider({ const asset = getAsset(symbol, activeNetwork.chainId); assert(asset, UnifiedBridgeError.UnknownAsset); - const feeMap = await core.getFees({ - asset, - amount, - targetChain: buildChain(targetChainId), - sourceChain: buildChain(activeNetwork.chainId), - }); + const feeMap = lowerCaseKeys( + await core.getFees({ + asset, + amount, + targetChain: buildChain(targetChainId), + sourceChain: buildChain(activeNetwork.chainId), + }) + ); const identifier = asset.type === TokenType.NATIVE ? asset.symbol : asset.address; - return feeMap[identifier] ?? 0n; + return feeMap[identifier.toLowerCase()] ?? 0n; }, [activeNetwork, core, buildChain, getAsset] ); @@ -380,7 +390,7 @@ export function UnifiedBridgeProvider({ [activeNetwork, core, buildParams, getAsset] ); - const getAssetAddressOnTargetChain = useCallback( + const getAssetIdentifierOnTargetChain = useCallback( (symbol?: string, targetChainId?: number) => { if (!symbol || !targetChainId) { return; @@ -388,7 +398,11 @@ export function UnifiedBridgeProvider({ const asset = getAsset(symbol, targetChainId); - return asset?.address; + if (!asset) { + return; + } + + return asset.type === TokenType.NATIVE ? asset.symbol : asset.address; }, [getAsset] ); @@ -502,13 +516,23 @@ export function UnifiedBridgeProvider({ [t] ); + const isBridgeAddress = useCallback( + (...addresses: string[]) => { + assert(core, CommonError.Unknown); + + return core.isBridgeAddress(...addresses); + }, + [core] + ); + return ( (); + const [currentAssetIdentifier, setCurrentAssetIdentifier] = + useState(); const { amount, setAmount, bridgeFee, provider, minimum, targetChainId } = - useBridge(currentAssetAddress); + useBridge(currentAssetIdentifier); const { bridgeConfig, @@ -66,7 +67,7 @@ export function Bridge() { const bridgeConfigError = bridgeConfig.error; const { t } = useTranslation(); const availableBlockchains = useAvailableBlockchains(); - const { getAssetAddressOnTargetChain } = useUnifiedBridgeContext(); + const { getAssetIdentifierOnTargetChain } = useUnifiedBridgeContext(); const { isFunctionAvailable } = useIsFunctionAvailable(FunctionNames.BRIDGE); @@ -140,7 +141,7 @@ export function Bridge() { // that also calls setCurrentAsset :( const timer = setTimeout(() => { setCurrentAsset(symbol); - setCurrentAssetAddress( + setCurrentAssetIdentifier( bridgePageHistoryData.selectedTokenAddress ?? '' ); }, 1); @@ -153,7 +154,7 @@ export function Bridge() { bridgePageHistoryData.selectedToken, bridgePageHistoryData.selectedTokenAddress, currentAsset, - currentAssetAddress, + currentAssetIdentifier, setCurrentAsset, sourceAssets, bridgeConfig, @@ -161,8 +162,7 @@ export function Bridge() { targetBlockchain, ]); - const isAmountTooLow = - amount && !amount.eq(BIG_ZERO) && amount.lt(minimum || BIG_ZERO); + const [isAmountTooLow, setIsAmountTooLow] = useState(false); const onInitiated = useCallback(() => { captureEncrypted('BridgeTransferStarted', { @@ -253,12 +253,12 @@ export function Bridge() { if (blockChainNetwork) { setNetwork(blockChainNetwork); - const assetAddressOnOppositeChain = getAssetAddressOnTargetChain( + const assetAddressOnOppositeChain = getAssetIdentifierOnTargetChain( currentAsset, blockChainNetwork.chainId ); - setCurrentAssetAddress(assetAddressOnOppositeChain); + setCurrentAssetIdentifier(assetAddressOnOppositeChain); setNavigationHistoryData({ selectedTokenAddress: assetAddressOnOppositeChain, selectedToken: currentAsset, @@ -273,14 +273,14 @@ export function Bridge() { [ amount, bridgeConfig, - getAssetAddressOnTargetChain, + getAssetIdentifierOnTargetChain, currentAsset, networks, setAmount, setNavigationHistoryData, setNetwork, setBridgeError, - setCurrentAssetAddress, + setCurrentAssetIdentifier, ] ); @@ -326,13 +326,14 @@ export function Bridge() { availableBlockchains, bridgeError, isAmountTooLow, + setIsAmountTooLow, provider, setAmount, setBridgeError, - setCurrentAssetAddress, + setCurrentAssetIdentifier, setNavigationHistoryData, targetNetwork, - currentAssetAddress, + currentAssetIdentifier, }; if ( @@ -348,7 +349,7 @@ export function Bridge() { onBackClick={() => { // We need to reset the current asset when the user purposefully navigates away from Bridge. // That's because this kind of action will clear the data we saved in NavigationHistoryService, - // therefore leaving us with no "currentAssetAddress", without which we cannot distinguish between + // therefore leaving us with no "currentAssetIdentifier", without which we cannot distinguish between // USDC and USDC.e // Closing & reopening of the extension will still work & load the previous form values, // because this action does not clear the data in NavigationHistoryService. diff --git a/src/pages/Bridge/BridgeTransactionStatus.tsx b/src/pages/Bridge/BridgeTransactionStatus.tsx index c87013deb..7fbcbfd3d 100644 --- a/src/pages/Bridge/BridgeTransactionStatus.tsx +++ b/src/pages/Bridge/BridgeTransactionStatus.tsx @@ -80,7 +80,14 @@ const BridgeTransactionStatus = () => { [params.txHash, bridgeTransactions] ); - const coingeckoId = useCoinGeckoId(bridgeTransaction?.symbol); + const symbol = useMemo( + () => + isUnifiedBridgeTransfer(bridgeTransaction) + ? bridgeTransaction.asset.symbol + : bridgeTransaction?.symbol, + [bridgeTransaction] + ); + const coingeckoId = useCoinGeckoId(symbol); const logoUri = useLogoUriForBridgeTransaction(bridgeTransaction); const { networks } = useNetworkContext(); @@ -157,7 +164,7 @@ const BridgeTransactionStatus = () => { ? errorMessage : t(`You transferred {{amount}} {{symbol}}!`, { amount, - symbol: bridgeTransaction.symbol, + symbol, })} , { duration: Infinity } @@ -247,7 +254,7 @@ const BridgeTransactionStatus = () => { variant="h6" sx={{ ml: 1, color: 'text.secondary' }} > - {bridgeTransaction.symbol} + {symbol} @@ -589,7 +596,7 @@ const BridgeTransactionStatus = () => { / { isUnifiedBridgeTransfer(bridgeTransaction) - ? bridgeTransaction.requiredTargetConfirmationCount + ? bridgeTransaction.targetRequiredConfirmationCount : 1 // With legacy Avalanche Bridge, we just need 1 confirmation on the destination network } diff --git a/src/pages/Bridge/components/BridgeForm.tsx b/src/pages/Bridge/components/BridgeForm.tsx index b6c272387..00721a80e 100644 --- a/src/pages/Bridge/components/BridgeForm.tsx +++ b/src/pages/Bridge/components/BridgeForm.tsx @@ -12,7 +12,15 @@ import { Typography, useTheme, } from '@avalabs/core-k2-components'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { + Dispatch, + SetStateAction, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { Asset, @@ -68,15 +76,16 @@ export type BridgeFormProps = { isPending: boolean; // Generic props - currentAssetAddress?: string; + currentAssetIdentifier?: string; provider: BridgeProviders; amount: Big; isAmountTooLow: boolean; + setIsAmountTooLow: Dispatch>; availableBlockchains: Blockchain[]; targetNetwork?: Network; bridgeError: string; setBridgeError: (err: string) => void; - setCurrentAssetAddress: (assetAddress?: string) => void; + setCurrentAssetIdentifier: (assetAddress?: string) => void; setNavigationHistoryData: (data: NavigationHistoryDataState) => void; setAmount: (amount: Big) => void; onTransfer: () => void; @@ -84,10 +93,11 @@ export type BridgeFormProps = { }; export const BridgeForm = ({ - currentAssetAddress, + currentAssetIdentifier, provider, amount, isAmountTooLow, + setIsAmountTooLow, availableBlockchains, minimum, maximum, @@ -100,7 +110,7 @@ export const BridgeForm = ({ estimateGas, bridgeError, setBridgeError, - setCurrentAssetAddress, + setCurrentAssetIdentifier, setNavigationHistoryData, setAmount, onTransfer, @@ -122,7 +132,7 @@ export const BridgeForm = ({ const { setNetwork, networks } = useNetworkContext(); const { currencyFormatter, currency } = useSettingsContext(); - const { getAssetAddressOnTargetChain } = useUnifiedBridgeContext(); + const { getAssetIdentifierOnTargetChain } = useUnifiedBridgeContext(); const { getTokenSymbolOnNetwork } = useGetTokenSymbolOnNetwork(); const { sendTokenSelectedAnalytics, sendAmountEnteredAnalytics } = useSendAnalyticsData(); @@ -204,6 +214,14 @@ export const BridgeForm = ({ const [neededGas, setNeededGas] = useState(0n); + useEffect(() => { + if (minimum && amount.lt(minimum)) { + setIsAmountTooLow(true); + } else { + setIsAmountTooLow(false); + } + }, [minimum, amount, setIsAmountTooLow]); + useEffect(() => { let isMounted = true; @@ -285,7 +303,7 @@ export const BridgeForm = ({ (value: { bn: BN; amount: string }) => { const bigValue = bnToBig(value.bn, denomination); setNavigationHistoryData({ - selectedTokenAddress: currentAssetAddress, + selectedTokenAddress: currentAssetIdentifier, selectedToken: currentAsset, inputAmount: bigValue, }); @@ -313,7 +331,7 @@ export const BridgeForm = ({ bridgeError, capture, currentAsset, - currentAssetAddress, + currentAssetIdentifier, setBridgeError, denomination, maximum, @@ -329,7 +347,7 @@ export const BridgeForm = ({ const symbol = token.symbol; const address = getTokenAddress(token); - setCurrentAssetAddress(address); + setCurrentAssetIdentifier(address); setNavigationHistoryData({ selectedToken: symbol, selectedTokenAddress: address, @@ -351,7 +369,7 @@ export const BridgeForm = ({ sendTokenSelectedAnalytics, setAmount, setCurrentAsset, - setCurrentAssetAddress, + setCurrentAssetIdentifier, setNavigationHistoryData, ] ); @@ -366,12 +384,12 @@ export const BridgeForm = ({ ); if (blockChainNetwork) { - const assetAddressOnOppositeChain = getAssetAddressOnTargetChain( + const assetAddressOnOppositeChain = getAssetIdentifierOnTargetChain( currentAsset, blockChainNetwork.chainId ); - setCurrentAssetAddress(assetAddressOnOppositeChain); + setCurrentAssetIdentifier(assetAddressOnOppositeChain); setNavigationHistoryData({ selectedTokenAddress: assetAddressOnOppositeChain, selectedToken: currentAsset, @@ -384,11 +402,11 @@ export const BridgeForm = ({ } }, [ bridgeConfig, - getAssetAddressOnTargetChain, + getAssetIdentifierOnTargetChain, networks, setNetwork, setBridgeError, - setCurrentAssetAddress, + setCurrentAssetIdentifier, currentAsset, setAmount, setNavigationHistoryData, diff --git a/src/pages/Bridge/components/BridgeFormUnified.tsx b/src/pages/Bridge/components/BridgeFormUnified.tsx index 1403612c1..7e5bc04fb 100644 --- a/src/pages/Bridge/components/BridgeFormUnified.tsx +++ b/src/pages/Bridge/components/BridgeFormUnified.tsx @@ -11,7 +11,7 @@ type BridgeFormUnifiedProps = Omit< > & { amount: Big; targetChainId: number; - currentAssetAddress?: string; + currentAssetIdentifier?: string; onInitiated: () => void; onSuccess: (txHash: string) => void; @@ -26,12 +26,12 @@ export const BridgeFormUnified = ({ onRejected, ...props }: BridgeFormUnifiedProps) => { - const { amount, targetChainId, currentAssetAddress } = props; + const { amount, targetChainId, currentAssetIdentifier } = props; const { transfer, ...bridge } = useUnifiedBridge( amount, targetChainId, - currentAssetAddress + currentAssetIdentifier ); const { onTransfer, isPending } = useBridgeTxHandling({ diff --git a/src/pages/Bridge/hooks/useBridge.ts b/src/pages/Bridge/hooks/useBridge.ts index f8b750b9d..4f87d9e72 100644 --- a/src/pages/Bridge/hooks/useBridge.ts +++ b/src/pages/Bridge/hooks/useBridge.ts @@ -57,7 +57,7 @@ export enum BridgeProviders { Unified, } -export function useBridge(currentAssetAddress?: string): Bridge { +export function useBridge(currentAssetIdentifier?: string): Bridge { const { targetBlockchain } = useBridgeSDK(); const { supportsAsset } = useUnifiedBridgeContext(); @@ -99,7 +99,8 @@ export function useBridge(currentAssetAddress?: string): Bridge { bridgeFee, targetChainId, provider: - currentAssetAddress && supportsAsset(currentAssetAddress, targetChainId) + currentAssetIdentifier && + supportsAsset(currentAssetIdentifier, targetChainId) ? BridgeProviders.Unified : BridgeProviders.Avalanche, }; diff --git a/src/pages/Bridge/hooks/useBridgeAmounts.ts b/src/pages/Bridge/hooks/useBridgeAmounts.ts index 2bd60bfbf..9e73e5066 100644 --- a/src/pages/Bridge/hooks/useBridgeAmounts.ts +++ b/src/pages/Bridge/hooks/useBridgeAmounts.ts @@ -39,7 +39,7 @@ export const useBridgeAmounts = ( return { amount: isUnifiedBridgeTransfer(bridgeTx) - ? bigintToBig(bridgeTx.amount, bridgeTx.amountDecimals) + ? bigintToBig(bridgeTx.amount, bridgeTx.asset.decimals) : bridgeTx?.amount, sourceNetworkFee, targetNetworkFee, diff --git a/src/pages/Bridge/hooks/useBridgeTransferStatus.ts b/src/pages/Bridge/hooks/useBridgeTransferStatus.ts index c320488ed..7a2112eb9 100644 --- a/src/pages/Bridge/hooks/useBridgeTransferStatus.ts +++ b/src/pages/Bridge/hooks/useBridgeTransferStatus.ts @@ -22,15 +22,15 @@ export const useBridgeTransferStatus = ( // cap the current confirmations so we don't go over sourceCurrentConfirmations: Math.min( bridgeTx.sourceConfirmationCount, - bridgeTx.requiredSourceConfirmationCount + bridgeTx.sourceRequiredConfirmationCount ), targetCurrentConfirmations: Math.min( bridgeTx.targetConfirmationCount, - bridgeTx.requiredTargetConfirmationCount + bridgeTx.targetRequiredConfirmationCount ), // with Unified Bridge, the SDK provides info about the target confirmations - sourceRequiredConfirmations: bridgeTx.requiredSourceConfirmationCount, - targetRequiredConfirmations: bridgeTx.requiredTargetConfirmationCount, + sourceRequiredConfirmations: bridgeTx.sourceRequiredConfirmationCount, + targetRequiredConfirmations: bridgeTx.targetRequiredConfirmationCount, }; } diff --git a/src/pages/Bridge/hooks/useLogoUriForBridgeTransaction.ts b/src/pages/Bridge/hooks/useLogoUriForBridgeTransaction.ts index 5fff2af61..feed5ba88 100644 --- a/src/pages/Bridge/hooks/useLogoUriForBridgeTransaction.ts +++ b/src/pages/Bridge/hooks/useLogoUriForBridgeTransaction.ts @@ -8,6 +8,7 @@ import { useTokensWithBalances } from '@src/hooks/useTokensWithBalances'; import { findTokenForAsset } from '../utils/findTokenForAsset'; import { networkToBlockchain } from '../utils/blockchainConversion'; import { caipToChainId } from '@src/utils/caipConversion'; +import { getBridgedAssetSymbol } from '@src/utils/bridge/getBridgedAssetSymbol'; export function useLogoUriForBridgeTransaction( bridgeTransaction: BridgeTransaction | BridgeTransfer | undefined @@ -50,7 +51,7 @@ export function useLogoUriForBridgeTransaction( } const token = findTokenForAsset( - bridgeTransaction.symbol, + getBridgedAssetSymbol(bridgeTransaction), targetBlockchain, tokens ); diff --git a/src/pages/Bridge/hooks/useUnifiedBridge.ts b/src/pages/Bridge/hooks/useUnifiedBridge.ts index 47bf55fbf..835ff5e9a 100644 --- a/src/pages/Bridge/hooks/useUnifiedBridge.ts +++ b/src/pages/Bridge/hooks/useUnifiedBridge.ts @@ -24,7 +24,7 @@ import { useAnalyticsContext } from '@src/contexts/AnalyticsProvider'; export function useUnifiedBridge( amount: Big, targetChainId: number, - currentAssetAddress?: string + currentAssetIdentifier?: string ): BridgeAdapter { const { currentAsset, @@ -48,14 +48,14 @@ export function useUnifiedBridge( isEthereum ? Blockchain.ETHEREUM : Blockchain.AVALANCHE ); const sourceBalance = useMemo(() => { - if (!currentAsset || !currentAssetAddress || !network) { + if (!currentAsset || !currentAssetIdentifier || !network) { return undefined; } return assetsWithBalances.find(({ asset }) => { return isUnifiedBridgeAsset(asset) && asset.symbol === currentAsset; }); - }, [network, assetsWithBalances, currentAssetAddress, currentAsset]); + }, [network, assetsWithBalances, currentAssetIdentifier, currentAsset]); useEffect(() => { if (!maximum && sourceBalance?.balance) { @@ -69,9 +69,9 @@ export function useUnifiedBridge( if ( currentAsset && currentAssetData && - currentAssetAddress && + currentAssetIdentifier && amount && - supportsAsset(currentAssetAddress, targetChainId) + supportsAsset(currentAssetIdentifier, targetChainId) ) { const hasAmount = amount && !amount.eq(BIG_ZERO); @@ -103,7 +103,7 @@ export function useUnifiedBridge( }, [ currentAsset, currentAssetData, - currentAssetAddress, + currentAssetIdentifier, amount, targetChainId, getFee, diff --git a/src/pages/Bridge/utils/getBalances.ts b/src/pages/Bridge/utils/getBalances.ts index 892ad6077..60aa8d223 100644 --- a/src/pages/Bridge/utils/getBalances.ts +++ b/src/pages/Bridge/utils/getBalances.ts @@ -6,7 +6,10 @@ import { TokenType, getTokenPrice, } from '@src/background/services/balances/models'; -import { BridgeAsset } from '@avalabs/bridge-unified'; +import { + BridgeAsset, + TokenType as UnifiedTokenType, +} from '@avalabs/bridge-unified'; import { isUnifiedBridgeAsset } from './isUnifiedBridgeAsset'; import { normalizeBalance } from '@src/utils/normalizeBalance'; @@ -34,7 +37,11 @@ export function getBalances( return assets.map((asset) => { const symbol = asset.symbol; const token = isUnifiedBridgeAsset(asset) - ? tokensByAddress[asset.address?.toLowerCase() ?? asset.symbol] + ? tokensByAddress[ + asset.type === UnifiedTokenType.NATIVE + ? asset.symbol.toLowerCase() + : asset.address.toLowerCase() + ] : isNativeAsset(asset) ? tokensByAddress[asset.symbol.toLowerCase()] : isBtcAsset(asset) diff --git a/src/pages/Bridge/utils/getTokenAddress.ts b/src/pages/Bridge/utils/getTokenAddress.ts index 2eb982518..77cf04031 100644 --- a/src/pages/Bridge/utils/getTokenAddress.ts +++ b/src/pages/Bridge/utils/getTokenAddress.ts @@ -1,10 +1,11 @@ import { isEthAsset } from '@avalabs/core-bridge-sdk'; import { AssetBalance } from '../models'; import { isUnifiedBridgeAsset } from './isUnifiedBridgeAsset'; +import { TokenType } from '@avalabs/bridge-unified'; export const getTokenAddress = (token: AssetBalance): string => { if (isUnifiedBridgeAsset(token.asset)) { - return token.asset.address ?? ''; + return token.asset.type === TokenType.ERC20 ? token.asset.address : ''; } else if (isEthAsset(token.asset)) { return token.asset.nativeContractAddress; } diff --git a/src/pages/Wallet/WalletRecentTxs.tsx b/src/pages/Wallet/WalletRecentTxs.tsx index 6d4979e28..8c007eef6 100644 --- a/src/pages/Wallet/WalletRecentTxs.tsx +++ b/src/pages/Wallet/WalletRecentTxs.tsx @@ -42,6 +42,7 @@ import { import { isXchainNetwork } from '@src/background/services/network/utils/isAvalancheXchainNetwork'; import { getAddressForChain } from '@src/utils/getAddressForChain'; import { XchainActivityCard } from './components/History/components/ActivityCard/XchainActivityCard'; +import { getBridgedAssetSymbol } from '@src/utils/bridge/getBridgedAssetSymbol'; type WalletRecentTxsProps = { isEmbedded?: boolean; @@ -145,7 +146,7 @@ export function WalletRecentTxs({ const filteredBridgeTransactions = tokenSymbolFilter ? Object.values(bridgeTransactions).filter( - (tx) => tx.symbol === tokenSymbolFilter + (tx) => getBridgedAssetSymbol(tx) === tokenSymbolFilter ) : bridgeTransactions; diff --git a/src/pages/Wallet/components/History/components/InProgressBridge/InProgressBridgeActivityCard.tsx b/src/pages/Wallet/components/History/components/InProgressBridge/InProgressBridgeActivityCard.tsx index 1b9ad6c63..ba5354d8b 100644 --- a/src/pages/Wallet/components/History/components/InProgressBridge/InProgressBridgeActivityCard.tsx +++ b/src/pages/Wallet/components/History/components/InProgressBridge/InProgressBridgeActivityCard.tsx @@ -65,7 +65,7 @@ export function InProgressBridgeActivityCard({ if (isUnifiedBridgeTransfer(tx)) { const totalConfirmationsRequired = - tx.requiredSourceConfirmationCount + tx.requiredTargetConfirmationCount; + tx.sourceRequiredConfirmationCount + tx.targetRequiredConfirmationCount; const totalConfirmationsObtained = tx.sourceConfirmationCount + tx.targetConfirmationCount; @@ -85,9 +85,13 @@ export function InProgressBridgeActivityCard({ return (currentCount / confirmationCount) * 100; }, [tx]); + const symbol = useMemo( + () => (isUnifiedBridgeTransfer(tx) ? tx.asset.symbol : tx?.symbol), + [tx] + ); const amount = useMemo(() => { if (isUnifiedBridgeTransfer(tx)) { - return bigintToBig(tx.amount, tx.amountDecimals); + return bigintToBig(tx.amount, tx.asset.decimals); } return tx.amount; @@ -114,7 +118,7 @@ export function InProgressBridgeActivityCard({ {isSuccessful ? t(`You transferred {{amount}} {{symbol}}`, { amount, - symbol: tx.symbol, + symbol, }) : tx.errorCode ? getErrorMessage(tx.errorCode) @@ -127,7 +131,15 @@ export function InProgressBridgeActivityCard({ } removeBridgeTransaction(tx.sourceTxHash); - }, [removeBridgeTransaction, t, toastShown, tx, amount, getErrorMessage]); + }, [ + removeBridgeTransaction, + t, + toastShown, + tx, + amount, + getErrorMessage, + symbol, + ]); const errorCode = isUnifiedBridgeTransfer(tx) ? tx.errorCode : undefined; const hasError = typeof errorCode !== 'undefined'; @@ -188,7 +200,7 @@ export function InProgressBridgeActivityCard({ variant="body2" sx={{ color: theme.palette.primary.dark }} > - {tx.symbol} + {symbol} diff --git a/src/pages/Wallet/components/History/useBlockchainNames.ts b/src/pages/Wallet/components/History/useBlockchainNames.ts index fb410d0cc..4c36a9318 100644 --- a/src/pages/Wallet/components/History/useBlockchainNames.ts +++ b/src/pages/Wallet/components/History/useBlockchainNames.ts @@ -10,13 +10,12 @@ import { isPendingBridgeTransaction, } from '@src/utils/bridgeTransactionUtils'; import { caipToChainId } from '@src/utils/caipConversion'; +import { getBridgedAssetSymbol } from '@src/utils/bridge/getBridgedAssetSymbol'; export function useBlockchainNames( item: TxHistoryItem | BridgeTransaction | BridgeTransfer ) { - const { - state: { addresses }, - } = useUnifiedBridgeContext(); + const { isBridgeAddress } = useUnifiedBridgeContext(); const pending = isPendingBridgeTransaction(item); if (pending) { @@ -35,7 +34,7 @@ export function useBlockchainNames( } const isToAvalanche = isTxToAvalanche(item); - const txBlockchain = getTxBlockchain(item, addresses); + const txBlockchain = getTxBlockchain(item, isBridgeAddress); return { sourceBlockchain: isToAvalanche ? txBlockchain : 'Avalanche', @@ -83,9 +82,11 @@ function isTxToAvalanche( function getTxBlockchain( tx: TxHistoryItem | BridgeTransaction | BridgeTransfer, - addresses: string[] + isBridgeAddress: (...addresses: string[]) => boolean ) { - const symbol = isBridgeTransaction(tx) ? tx.symbol : tx.tokens?.[0]?.symbol; + const symbol = isBridgeTransaction(tx) + ? getBridgedAssetSymbol(tx) + : tx.tokens?.[0]?.symbol; const ethereum = 'Ethereum'; const bitcoin = 'Bitcoin'; @@ -98,10 +99,7 @@ function getTxBlockchain( return ethereum; } - if ( - addresses.includes(tx.to.toLowerCase()) || - addresses.includes(tx.from.toLowerCase()) - ) { + if (isBridgeAddress(tx.to, tx.from)) { return ethereum; } } diff --git a/src/utils/bridge/getBridgedAssetSymbol.ts b/src/utils/bridge/getBridgedAssetSymbol.ts new file mode 100644 index 000000000..b578e8739 --- /dev/null +++ b/src/utils/bridge/getBridgedAssetSymbol.ts @@ -0,0 +1,13 @@ +import { BridgeTransfer } from '@avalabs/bridge-unified'; +import { BridgeTransaction } from '@avalabs/core-bridge-sdk'; +import { isUnifiedBridgeTransfer } from '@src/pages/Bridge/utils/isUnifiedBridgeTransfer'; + +export const getBridgedAssetSymbol = ( + tx: BridgeTransfer | BridgeTransaction +): string => { + if (isUnifiedBridgeTransfer(tx)) { + return tx.asset.symbol; + } + + return tx.symbol; +}; diff --git a/src/utils/lowerCaseKeys.ts b/src/utils/lowerCaseKeys.ts new file mode 100644 index 000000000..c47c31363 --- /dev/null +++ b/src/utils/lowerCaseKeys.ts @@ -0,0 +1,5 @@ +export const lowerCaseKeys = (obj: Record): Record => { + return Object.fromEntries( + Object.entries(obj).map(([key, value]) => [key.toLowerCase(), value]) + ); +}; diff --git a/yarn.lock b/yarn.lock index 18dd12916..568766149 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,10 +56,10 @@ bn.js "5.2.1" zod "3.23.8" -"@avalabs/bridge-unified@0.0.0-fix-make-sign-optional-for-gas-20240905074019": - version "0.0.0-fix-make-sign-optional-for-gas-20240905074019" - resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-0.0.0-fix-make-sign-optional-for-gas-20240905074019.tgz#543a62a639ba36a7624ed4dca22cfbc47720a3eb" - integrity sha512-a1I1kWMe4u9MZsNvBFQahNtPHefFL2RMeT+oLfbR6CClHrDyvcPURdt4mV+oV9oDSSAwK2Lg28cdfxokfkdo3A== +"@avalabs/bridge-unified@0.0.0-feat-is-bridge-address-20240909115936": + version "0.0.0-feat-is-bridge-address-20240909115936" + resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-0.0.0-feat-is-bridge-address-20240909115936.tgz#1529f648d301db2bda671d46e8f3d5d6edb2a492" + integrity sha512-Y1AsYR3SKHJVvak6C8IyE68SFLKMmNj3U9hGLNTaB6zR6DyewGuHQByB5wJpVeompd+LHjZl7T0+juY8scneGQ== dependencies: abitype "0.9.3" lodash "4.17.21" From d774bfa0484dcbea735217974a890600d5e29439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 10 Sep 2024 12:34:43 +0200 Subject: [PATCH 03/20] chore: implement schema migration for pending CCTP transfers --- .../migrations/unified_bridge_v2.test.ts | 173 ++++++++++++++++++ .../migrations/unified_bridge_v2.ts | 115 ++++++++++++ .../storage/schemaMigrations/schemaMap.ts | 6 + 3 files changed, 294 insertions(+) create mode 100644 src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.test.ts create mode 100644 src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts diff --git a/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.test.ts b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.test.ts new file mode 100644 index 000000000..dadcc8fd0 --- /dev/null +++ b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.test.ts @@ -0,0 +1,173 @@ +import Joi from 'joi'; + +import unified_bridge_v2 from './unified_bridge_v2'; + +describe('background/services/storage/schemaMigrations/migrations/unified_bridge_v2', () => { + const pendingTransfers = { + '0xEthToAvalanche': { + type: 'cctp', + environment: 'production', + fromAddress: '0xSourceAddress', + toAddress: '0xTargetAddress', + amount: 5000000, + amountDecimals: 6, + symbol: 'USDC', + bridgeFee: 2000000, + sourceChain: { + chainName: 'Ethereum', + chainId: 'eip155:1', + }, + sourceStartedAt: 1725963300000, + sourceTxHash: '0xSourceTxHash', + sourceNetworkFee: 100_000_000, + sourceConfirmationCount: 1, + requiredSourceConfirmationCount: 6, + + targetChain: { + chainName: 'Avalanche C-Chain', + chainId: 'eip155:43114', + }, + targetConfirmationCount: 0, + requiredTargetConfirmationCount: 2, + }, + '0xAvalancheToEth': { + type: 'cctp', + environment: 'production', + fromAddress: '0xSourceAddress', + toAddress: '0xTargetAddress', + amount: 5000000, + amountDecimals: 6, + symbol: 'USDC', + bridgeFee: 2000000, + sourceChain: { + chainName: 'Avalanche C-Chain', + chainId: 'eip155:43114', + }, + sourceStartedAt: 1725963300000, + sourceTxHash: '0xSourceTxHash', + sourceNetworkFee: 100_000_000, + sourceConfirmationCount: 8, + requiredSourceConfirmationCount: 6, + targetChain: { + chainName: 'Ethereum', + chainId: 'eip155:1', + }, + targetConfirmationCount: 2, + requiredTargetConfirmationCount: 4, + startBlockNumber: 1234567, + }, + }; + + const stateWithPendingTransfers = { + pendingTransfers, + addresses: ['0xTargetAddress'], + }; + + it('accepts correct inputs', () => { + expect( + unified_bridge_v2.previousSchema.validate(stateWithPendingTransfers) + ).toEqual({ + error: undefined, + value: stateWithPendingTransfers, + }); + }); + + it('rejects incorrect inputs', () => { + const stateWithMalformedPendingTransfers = { + pendingTransfers: [{ what: 'is', that: '?' }], + }; + + const result = unified_bridge_v2.previousSchema.validate({ + pendingTransfers: [{ what: 'is', that: '?' }], + }); + + expect(result).toEqual({ + value: stateWithMalformedPendingTransfers, + error: expect.any(Joi.ValidationError), + }); + }); + + it('migrates to v2 successfully', async () => { + expect(await unified_bridge_v2.up(stateWithPendingTransfers)).toStrictEqual( + { + pendingTransfers: { + '0xEthToAvalanche': { + type: 'cctp', + environment: 'production', + fromAddress: '0xSourceAddress', + toAddress: '0xTargetAddress', + amount: 5000000, + asset: { + decimals: 6, + symbol: 'USDC', + name: 'USD Coin', + type: 'erc20', + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + }, + bridgeFee: 2000000, + sourceChain: { + chainName: 'Ethereum', + chainId: 'eip155:1', + }, + sourceStartedAt: 1725963300000, + sourceTxHash: '0xSourceTxHash', + sourceNetworkFee: 100_000_000, + sourceConfirmationCount: 1, + sourceRequiredConfirmationCount: 6, + targetChain: { + chainName: 'Avalanche C-Chain', + chainId: 'eip155:43114', + }, + targetConfirmationCount: 0, + targetRequiredConfirmationCount: 2, + targetStartBlockNumber: undefined, + }, + '0xAvalancheToEth': { + type: 'cctp', + environment: 'production', + fromAddress: '0xSourceAddress', + toAddress: '0xTargetAddress', + amount: 5000000, + asset: { + decimals: 6, + symbol: 'USDC', + name: 'USD Coin', + type: 'erc20', + address: '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e', + }, + bridgeFee: 2000000, + sourceChain: { + chainName: 'Avalanche C-Chain', + chainId: 'eip155:43114', + }, + sourceStartedAt: 1725963300000, + sourceTxHash: '0xSourceTxHash', + sourceNetworkFee: 100_000_000, + sourceConfirmationCount: 8, + sourceRequiredConfirmationCount: 6, + targetChain: { + chainName: 'Ethereum', + chainId: 'eip155:1', + }, + targetConfirmationCount: 2, + targetRequiredConfirmationCount: 4, + targetStartBlockNumber: 1234567, + }, + }, + version: 2, + } + ); + + expect( + await unified_bridge_v2.up({ addresses: ['0xTargetAddress'] }) + ).toStrictEqual({ + pendingTransfers: {}, + version: 2, + }); + + expect(await unified_bridge_v2.up({ pendingTransfers: {} })).toStrictEqual({ + pendingTransfers: {}, + version: 2, + }); + }); +}); diff --git a/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts new file mode 100644 index 000000000..ddd02ea20 --- /dev/null +++ b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts @@ -0,0 +1,115 @@ +import Joi from 'joi'; + +const VERSION = 2; + +// Schemas & types below only list the relevant properties +// that actually changed. The rest is untouched & untyped. +type LegacyBridgeTransfer = { + amountDecimals: number; + symbol: string; + sourceChain: { + chainId: string; + }; + requiredSourceConfirmationCount: number; + requiredTargetConfirmationCount: number; + startBlockNumber?: number; +}; + +type NewBridgeTransfer = { + asset: { + type: 'erc20'; + address?: string; + name: string; + symbol: string; + decimals: number; + }; + sourceRequiredConfirmationCount: number; + targetRequiredConfirmationCount: number; + targetStartBlockNumber?: number; +}; + +type PreviousSchema = { + pendingTransfers?: Record; + addresses?: string[]; +}; + +type NewSchema = { + pendingTransfers?: Record; +}; + +const previousSchema = Joi.object({ + addresses: Joi.array().items(Joi.string()).optional(), + pendingTransfers: Joi.object().pattern( + Joi.string(), + Joi.object({ + amountDecimals: Joi.number(), + symbol: Joi.string(), + requiredSourceConfirmationCount: Joi.number(), + requiredTargetConfirmationCount: Joi.number(), + startBlockNumber: Joi.number(), + sourceChain: Joi.object({ chainId: Joi.string() }).unknown(true), + }).unknown(true) + ), +}); + +const getUsdcAddressByChainId = (caipId: string) => { + switch (caipId) { + case 'eip155:1': // Ethereum Mainnet + return '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'; + + case 'eip155:43114': // C-Chain Mainnet + return '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e'; + + case 'eip155:11155111': // Ethereum Sepolia + return '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238'; + + case 'eip155:43113': // C-Chain Fuji + return '0x5425890298aed601595a70ab815c96711a31bc65'; + } +}; + +const up = async ( + unifiedBridgeState: PreviousSchema +): Promise => { + const { pendingTransfers: oldTransfers } = unifiedBridgeState; + + const newTransfers: Record = {}; + + if (oldTransfers !== undefined) { + for (const [id, transfer] of Object.entries(oldTransfers)) { + const { + amountDecimals, + symbol, + requiredSourceConfirmationCount, + requiredTargetConfirmationCount, + startBlockNumber, + ...rest + } = transfer; + + newTransfers[id] = { + ...rest, + asset: { + // Prior to this schema upgrad, only USDC was possible to bridge (via CCTP) + decimals: amountDecimals, + symbol, + type: 'erc20', + name: 'USD Coin', + address: getUsdcAddressByChainId(rest.sourceChain.chainId), + }, + sourceRequiredConfirmationCount: requiredSourceConfirmationCount, + targetRequiredConfirmationCount: requiredTargetConfirmationCount, + targetStartBlockNumber: startBlockNumber, + }; + } + } + + return { + pendingTransfers: newTransfers, + version: VERSION, + }; +}; + +export default { + previousSchema, + up, +}; diff --git a/src/background/services/storage/schemaMigrations/schemaMap.ts b/src/background/services/storage/schemaMigrations/schemaMap.ts index 160ce8a76..6ae4a6419 100644 --- a/src/background/services/storage/schemaMigrations/schemaMap.ts +++ b/src/background/services/storage/schemaMigrations/schemaMap.ts @@ -16,6 +16,8 @@ import { BALANCES_CACHE_KEY } from '../../balances/models'; import balances_v2 from './migrations/balances_v2'; import network_v3 from './migrations/network_v3'; import network_v4 from './migrations/network_v4'; +import { UNIFIED_BRIDGE_STATE_STORAGE_KEY } from '../../unifiedBridge/models'; +import unified_bridge_v2 from './migrations/unified_bridge_v2'; export type Migration = { previousSchema: Joi.Schema; @@ -108,4 +110,8 @@ export const SCHEMA_MAP = { }, ], }, + [UNIFIED_BRIDGE_STATE_STORAGE_KEY]: { + latestVersion: 2, + migrations: [{ version: 2, migration: unified_bridge_v2 }], + }, } as const; From d408cc0f6b2718a1efeac28d2a74e717147d6bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 10 Sep 2024 12:55:54 +0200 Subject: [PATCH 04/20] fix: schema migration bigint support --- .../migrations/unified_bridge_v2.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts index ddd02ea20..64097ae1d 100644 --- a/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts +++ b/src/background/services/storage/schemaMigrations/migrations/unified_bridge_v2.ts @@ -46,7 +46,20 @@ const previousSchema = Joi.object({ symbol: Joi.string(), requiredSourceConfirmationCount: Joi.number(), requiredTargetConfirmationCount: Joi.number(), - startBlockNumber: Joi.number(), + startBlockNumber: Joi.custom((value) => { + // Joi has no support for BigInt + if ( + typeof value !== 'number' && + typeof value !== 'bigint' && + typeof value !== 'undefined' + ) { + return new Error( + `Expected bigint or number, received ${typeof value}` + ); + } + + return value; + }, 'bigint'), sourceChain: Joi.object({ chainId: Joi.string() }).unknown(true), }).unknown(true) ), From 8608f371e928f1a8f26992e2afa947dc14a5d4e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 10 Sep 2024 13:03:42 +0200 Subject: [PATCH 05/20] chore: cleanup translations --- src/localization/locales/en/translation.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/localization/locales/en/translation.json b/src/localization/locales/en/translation.json index 8b74fde52..37ae43366 100644 --- a/src/localization/locales/en/translation.json +++ b/src/localization/locales/en/translation.json @@ -415,7 +415,6 @@ "Insufficient funds": "Insufficient funds", "Insurance Buyer": "Insurance Buyer", "Internal error": "Internal error", - "Internal error occured. Try restarting your browser.": "Internal error occured. Try restarting your browser.", "Internal error. Please try again": "Internal error. Please try again", "Invalid Password": "Invalid Password", "Invalid QR Code": "Invalid QR Code", From 2fe74b3fb1289c0e43470346b18652099a4d4d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 10 Sep 2024 13:33:18 +0200 Subject: [PATCH 06/20] test: update failing tests --- .../services/history/HistoryServiceGlacier.test.ts | 3 ++- src/contexts/UnifiedBridgeProvider.test.tsx | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/background/services/history/HistoryServiceGlacier.test.ts b/src/background/services/history/HistoryServiceGlacier.test.ts index ff1e8f033..394af0090 100644 --- a/src/background/services/history/HistoryServiceGlacier.test.ts +++ b/src/background/services/history/HistoryServiceGlacier.test.ts @@ -76,7 +76,7 @@ const mockedAccountsService = { }, } as any; const mockedUnifiedBridgeService = { - state: { addresses: [] }, + isBridgeAddress: jest.fn(), } as any; const senderAddress = 'Sender Address'; @@ -334,6 +334,7 @@ describe('background/services/history/HistoryServiceGlacier.test.ts', () => { ], }) ); + mockedUnifiedBridgeService.isBridgeAddress.mockReturnValue(false); (Glacier as jest.Mock).mockImplementation(() => { return { evmTransactions: { diff --git a/src/contexts/UnifiedBridgeProvider.test.tsx b/src/contexts/UnifiedBridgeProvider.test.tsx index d3ee521ec..8bc2be6ca 100644 --- a/src/contexts/UnifiedBridgeProvider.test.tsx +++ b/src/contexts/UnifiedBridgeProvider.test.tsx @@ -5,6 +5,7 @@ import { BridgeType, TokenType, createUnifiedBridgeService, + getEnabledBridgeServices, } from '@avalabs/bridge-unified'; import { useConnectionContext } from './ConnectionProvider'; @@ -133,7 +134,6 @@ describe('contexts/UnifiedBridgeProvider', () => { jest.resetAllMocks(); core = { - init: jest.fn().mockResolvedValue(undefined), getAssets: async () => ({ [chainIdToCaip(ethereum.chainId)]: [ethUSDC], [chainIdToCaip(avalanche.chainId)]: [avaxUSDC], @@ -144,7 +144,7 @@ describe('contexts/UnifiedBridgeProvider', () => { } as unknown as ReturnType; jest.mocked(createUnifiedBridgeService).mockReturnValue(core); - + jest.mocked(getEnabledBridgeServices).mockResolvedValue({} as any); // Mock events flow eventsFn.mockReturnValue({ pipe: jest.fn().mockReturnValue({ @@ -195,9 +195,9 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.transferAsset('USDC', 1000n, 1); + await provider.current?.transferAsset('USDCC', 1000n, 1); } catch (err: any) { - expect(err.data.reason).toEqual(UnifiedBridgeError.UnknownAsset); + expect(err.data?.reason).toEqual(UnifiedBridgeError.UnknownAsset); } }); }); @@ -368,7 +368,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.getFee('USDC', 1000n, 1); + await provider.current?.getFee('USDCc', 1000n, 1); } catch (err: any) { expect(err.data.reason).toEqual(UnifiedBridgeError.UnknownAsset); } From af180f2a2847f5a7a655697d0d2061f729ae77a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Thu, 26 Sep 2024 14:22:59 +0200 Subject: [PATCH 07/20] refactor: update consumer-sdk, isBridgeAddress -> isBridgeTx --- package.json | 2 +- .../history/HistoryServiceBridgeHelper.ts | 2 +- .../history/HistoryServiceGlacier.test.ts | 4 ++-- .../services/history/HistoryServiceGlacier.ts | 18 ++++++++---------- .../unifiedBridge/UnifiedBridgeService.ts | 5 +++-- src/contexts/UnifiedBridgeProvider.tsx | 13 +++++++------ .../components/History/useBlockchainNames.ts | 10 +++++----- yarn.lock | 8 ++++---- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index b25b05083..4065bee2d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dependencies": { "@avalabs/avalanchejs": "4.0.5", "@avalabs/bitcoin-module": "0.5.0", - "@avalabs/bridge-unified": "0.0.0-feat-is-bridge-address-20240909115936", + "@avalabs/bridge-unified": "0.0.0-feat-is-bridge-address-20240926120228", "@avalabs/core-bridge-sdk": "3.1.0-alpha.4", "@avalabs/core-chains-sdk": "3.1.0-alpha.4", "@avalabs/core-coingecko-sdk": "3.1.0-alpha.4", diff --git a/src/background/services/history/HistoryServiceBridgeHelper.ts b/src/background/services/history/HistoryServiceBridgeHelper.ts index 106fa8e23..bec22fe7d 100644 --- a/src/background/services/history/HistoryServiceBridgeHelper.ts +++ b/src/background/services/history/HistoryServiceBridgeHelper.ts @@ -32,7 +32,7 @@ export class HistoryServiceBridgeHelper { return false; } - if (this.unifiedBridgeService.isBridgeAddress(tx.from, tx.to)) { + if (this.unifiedBridgeService.isBridgeTx(tx)) { return true; } diff --git a/src/background/services/history/HistoryServiceGlacier.test.ts b/src/background/services/history/HistoryServiceGlacier.test.ts index 394af0090..7735ba579 100644 --- a/src/background/services/history/HistoryServiceGlacier.test.ts +++ b/src/background/services/history/HistoryServiceGlacier.test.ts @@ -76,7 +76,7 @@ const mockedAccountsService = { }, } as any; const mockedUnifiedBridgeService = { - isBridgeAddress: jest.fn(), + isBridgeTx: jest.fn(), } as any; const senderAddress = 'Sender Address'; @@ -334,7 +334,7 @@ describe('background/services/history/HistoryServiceGlacier.test.ts', () => { ], }) ); - mockedUnifiedBridgeService.isBridgeAddress.mockReturnValue(false); + mockedUnifiedBridgeService.isBridgeTx.mockReturnValue(false); (Glacier as jest.Mock).mockImplementation(() => { return { evmTransactions: { diff --git a/src/background/services/history/HistoryServiceGlacier.ts b/src/background/services/history/HistoryServiceGlacier.ts index 65451a6c4..d3acc5e3b 100644 --- a/src/background/services/history/HistoryServiceGlacier.ts +++ b/src/background/services/history/HistoryServiceGlacier.ts @@ -85,14 +85,11 @@ export class HistoryServiceGlacier { return method; } - private isBridgeAddress(address?: string) { - if (!address) { - return false; - } - + private isBridgeTx({ from, to }: { from: string; to: string }) { return ( - ETHEREUM_ADDRESS === address.toLowerCase() || - this.unifiedBridgeService.isBridgeAddress(address) + ETHEREUM_ADDRESS === to?.toLowerCase() || + ETHEREUM_ADDRESS === from?.toLowerCase() || + this.unifiedBridgeService.isBridgeTx({ from: from ?? '', to: to ?? '' }) ); } @@ -103,9 +100,10 @@ export class HistoryServiceGlacier { const nativeOnly = !erc20Transfers && !erc721Transfers; const method = this.parseRawMethod(nativeTransaction.method?.methodName); - const isBridge = - this.isBridgeAddress(erc20Transfers?.[0]?.from?.address) || - this.isBridgeAddress(erc20Transfers?.[0]?.to?.address); + const isBridge = this.isBridgeTx({ + from: erc20Transfers?.[0]?.from?.address ?? '', + to: erc20Transfers?.[0]?.to?.address ?? '', + }); const isSwap = method.toLowerCase().includes('swap'); const isNativeSend = diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.ts index c98bb33a7..7ce3222bc 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.ts @@ -5,6 +5,7 @@ import { createUnifiedBridgeService, Environment, getEnabledBridgeServices, + IsBridgeTxParams, } from '@avalabs/bridge-unified'; import { wait } from '@avalabs/core-utils-sdk'; import EventEmitter from 'events'; @@ -159,12 +160,12 @@ export class UnifiedBridgeService implements OnStorageReady { } } - isBridgeAddress(...addresses: string[]): boolean { + isBridgeTx(txInfo: IsBridgeTxParams): boolean { if (!this.#core) { return false; } - return this.#core.isBridgeAddress(...addresses); + return this.#core.isBridgeTx(txInfo); } trackTransfer(bridgeTransfer: BridgeTransfer) { diff --git a/src/contexts/UnifiedBridgeProvider.tsx b/src/contexts/UnifiedBridgeProvider.tsx index aa6a0f771..bf622dd01 100644 --- a/src/contexts/UnifiedBridgeProvider.tsx +++ b/src/contexts/UnifiedBridgeProvider.tsx @@ -18,6 +18,7 @@ import { BridgeTransfer, getEnabledBridgeServices, BridgeServicesMap, + IsBridgeTxParams, } from '@avalabs/bridge-unified'; import { ethErrors } from 'eth-rpc-errors'; import { filter, map } from 'rxjs'; @@ -64,7 +65,7 @@ export interface UnifiedBridgeContext { amount: bigint, targetChainId: number ): Promise; - isBridgeAddress(...addresses: string[]): boolean; + isBridgeTx(txInfo: IsBridgeTxParams): boolean; supportsAsset(address: string, targetChainId: number): boolean; transferAsset( symbol: string, @@ -90,7 +91,7 @@ const DEFAULT_STATE = { supportsAsset() { return false; }, - isBridgeAddress() { + isBridgeTx() { return false; }, transferAsset() { @@ -516,11 +517,11 @@ export function UnifiedBridgeProvider({ [t] ); - const isBridgeAddress = useCallback( - (...addresses: string[]) => { + const isBridgeTx = useCallback( + (txInfo: IsBridgeTxParams) => { assert(core, CommonError.Unknown); - return core.isBridgeAddress(...addresses); + return core.isBridgeTx(txInfo); }, [core] ); @@ -531,7 +532,7 @@ export function UnifiedBridgeProvider({ estimateTransferGas, getErrorMessage, state, - isBridgeAddress, + isBridgeTx, getAssetIdentifierOnTargetChain, getFee, supportsAsset, diff --git a/src/pages/Wallet/components/History/useBlockchainNames.ts b/src/pages/Wallet/components/History/useBlockchainNames.ts index 4c36a9318..3952db787 100644 --- a/src/pages/Wallet/components/History/useBlockchainNames.ts +++ b/src/pages/Wallet/components/History/useBlockchainNames.ts @@ -1,5 +1,5 @@ import { Blockchain, BridgeTransaction } from '@avalabs/core-bridge-sdk'; -import { BridgeTransfer } from '@avalabs/bridge-unified'; +import { BridgeTransfer, IsBridgeTxParams } from '@avalabs/bridge-unified'; import { BITCOIN_NETWORK, ChainId } from '@avalabs/core-chains-sdk'; import { TxHistoryItem } from '@src/background/services/history/models'; import { isEthereumChainId } from '@src/background/services/network/utils/isEthereumNetwork'; @@ -15,7 +15,7 @@ import { getBridgedAssetSymbol } from '@src/utils/bridge/getBridgedAssetSymbol'; export function useBlockchainNames( item: TxHistoryItem | BridgeTransaction | BridgeTransfer ) { - const { isBridgeAddress } = useUnifiedBridgeContext(); + const { isBridgeTx } = useUnifiedBridgeContext(); const pending = isPendingBridgeTransaction(item); if (pending) { @@ -34,7 +34,7 @@ export function useBlockchainNames( } const isToAvalanche = isTxToAvalanche(item); - const txBlockchain = getTxBlockchain(item, isBridgeAddress); + const txBlockchain = getTxBlockchain(item, isBridgeTx); return { sourceBlockchain: isToAvalanche ? txBlockchain : 'Avalanche', @@ -82,7 +82,7 @@ function isTxToAvalanche( function getTxBlockchain( tx: TxHistoryItem | BridgeTransaction | BridgeTransfer, - isBridgeAddress: (...addresses: string[]) => boolean + isBridgeTx: (txInfo: IsBridgeTxParams) => boolean ) { const symbol = isBridgeTransaction(tx) ? getBridgedAssetSymbol(tx) @@ -99,7 +99,7 @@ function getTxBlockchain( return ethereum; } - if (isBridgeAddress(tx.to, tx.from)) { + if (isBridgeTx(tx)) { return ethereum; } } diff --git a/yarn.lock b/yarn.lock index 568766149..fcfe6f3a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,10 +56,10 @@ bn.js "5.2.1" zod "3.23.8" -"@avalabs/bridge-unified@0.0.0-feat-is-bridge-address-20240909115936": - version "0.0.0-feat-is-bridge-address-20240909115936" - resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-0.0.0-feat-is-bridge-address-20240909115936.tgz#1529f648d301db2bda671d46e8f3d5d6edb2a492" - integrity sha512-Y1AsYR3SKHJVvak6C8IyE68SFLKMmNj3U9hGLNTaB6zR6DyewGuHQByB5wJpVeompd+LHjZl7T0+juY8scneGQ== +"@avalabs/bridge-unified@0.0.0-feat-is-bridge-address-20240926120228": + version "0.0.0-feat-is-bridge-address-20240926120228" + resolved "https://registry.yarnpkg.com/@avalabs/bridge-unified/-/bridge-unified-0.0.0-feat-is-bridge-address-20240926120228.tgz#5cd14896a519579f2de50c7c3bd7ce28835f756c" + integrity sha512-0k7S9Ft0QvX7En7BUv7uoKfkplWv5eQDzxEIGWkMVfvAS/89aaUY8cGbyIg0hG29ogQi811bcCZIDEo05rEiGg== dependencies: abitype "0.9.3" lodash "4.17.21" From 50d431070cc78e06c3bd0b28134f6c2eab56fb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Wed, 2 Oct 2024 15:11:49 +0200 Subject: [PATCH 08/20] test: update HistoryService tests --- src/background/services/history/HistoryService.test.ts | 5 ++--- src/background/services/history/HistoryService.ts | 8 +++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/background/services/history/HistoryService.test.ts b/src/background/services/history/HistoryService.test.ts index 300d68330..7b220633c 100644 --- a/src/background/services/history/HistoryService.test.ts +++ b/src/background/services/history/HistoryService.test.ts @@ -41,9 +41,7 @@ describe('src/background/services/history/HistoryService.ts', () => { isBridgeTransactionBTC: jest.fn(), } as any; const unifiedBridgeServiceMock = { - state: { - addresses: [], - }, + isBridgeTx: jest.fn().mockReturnValue(false), } as any; const txHistoryItem: TxHistoryItem = { @@ -187,6 +185,7 @@ describe('src/background/services/history/HistoryService.ts', () => { ]); }); it('should return results with an pchain transaction', async () => { + jest.mocked(unifiedBridgeServiceMock.isBridgeTx).mockReturnValue(false); jest.mocked(moduleManagereMock.loadModuleByNetwork).mockResolvedValue({ getTransactionHistory: jest.fn(() => { return { diff --git a/src/background/services/history/HistoryService.ts b/src/background/services/history/HistoryService.ts index 15293feeb..370e93d60 100644 --- a/src/background/services/history/HistoryService.ts +++ b/src/background/services/history/HistoryService.ts @@ -69,7 +69,8 @@ export class HistoryService { } return ( this.#isBridgeAddress(transaction.from) || - this.#isBridgeAddress(transaction.to) + this.#isBridgeAddress(transaction.to) || + this.unifiedBridgeService.isBridgeTx(transaction) ); } @@ -95,9 +96,6 @@ export class HistoryService { return false; } - return [ - ETHEREUM_ADDRESS, - ...this.unifiedBridgeService.state.addresses, - ].includes(address.toLowerCase()); + return ETHEREUM_ADDRESS === address.toLowerCase(); } } From 878281591745255b9de264d172bf9a7b9e8573b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 8 Oct 2024 14:41:48 +0200 Subject: [PATCH 09/20] chore: use analyzeTx() from UnifiedBridge SDK --- .../services/history/HistoryService.test.ts | 43 ++++--- .../services/history/HistoryService.ts | 45 ++++---- .../history/HistoryServiceBridgeHelper.ts | 93 --------------- src/background/services/history/models.ts | 51 +-------- .../history/utils/isTxHistoryItem.test.ts | 8 +- .../services/history/utils/isTxHistoryItem.ts | 2 +- .../unifiedBridge/UnifiedBridgeService.ts | 11 +- src/contexts/UnifiedBridgeProvider.test.tsx | 32 ++++-- src/contexts/UnifiedBridgeProvider.tsx | 69 ++++++----- src/localization/locales/en/translation.json | 4 +- src/pages/Wallet/WalletRecentTxs.tsx | 14 ++- .../components/ActivityCard/ActivityCard.tsx | 2 +- .../ActivityCard/ActivityCardIcon.tsx | 2 +- .../ActivityCard/ActivityCardSummary.tsx | 8 +- .../components/History/useBlockchainNames.ts | 107 ++++-------------- 15 files changed, 160 insertions(+), 331 deletions(-) delete mode 100644 src/background/services/history/HistoryServiceBridgeHelper.ts diff --git a/src/background/services/history/HistoryService.test.ts b/src/background/services/history/HistoryService.test.ts index 7b220633c..36f578bf2 100644 --- a/src/background/services/history/HistoryService.test.ts +++ b/src/background/services/history/HistoryService.test.ts @@ -4,6 +4,7 @@ import { TxHistoryItem } from './models'; import { TokenType } from '@avalabs/vm-module-types'; import { TransactionType } from '@avalabs/vm-module-types'; import { ETHEREUM_ADDRESS } from '@src/utils/bridgeTransactionUtils'; +import { BridgeType } from '@avalabs/bridge-unified'; describe('src/background/services/history/HistoryService.ts', () => { let service: HistoryService; @@ -37,15 +38,14 @@ describe('src/background/services/history/HistoryService.ts', () => { addressAVM: 'addressBtc', }, } as any; - const bridgeHistoryHelperServiceMock = { - isBridgeTransactionBTC: jest.fn(), - } as any; const unifiedBridgeServiceMock = { - isBridgeTx: jest.fn().mockReturnValue(false), + analyzeTx: jest.fn(), } as any; const txHistoryItem: TxHistoryItem = { - isBridge: false, + bridgeAnalysis: { + isBridgeTx: false, + }, isContractCall: true, isIncoming: false, isOutgoing: true, @@ -70,7 +70,9 @@ describe('src/background/services/history/HistoryService.ts', () => { }; const btcTxHistoryItem: TxHistoryItem = { - isBridge: false, + bridgeAnalysis: { + isBridgeTx: false, + }, isContractCall: true, isIncoming: false, isOutgoing: true, @@ -100,9 +102,12 @@ describe('src/background/services/history/HistoryService.ts', () => { service = new HistoryService( moduleManagereMock, accountsServiceMock, - bridgeHistoryHelperServiceMock, unifiedBridgeServiceMock ); + + jest + .mocked(unifiedBridgeServiceMock.analyzeTx) + .mockReturnValue({ isBridgeTx: false }); }); it('should return empty array when network is not supported', async () => { @@ -135,9 +140,6 @@ describe('src/background/services/history/HistoryService.ts', () => { return { transactions: [btcTxHistoryItem] }; }), }); - jest - .mocked(bridgeHistoryHelperServiceMock.isBridgeTransactionBTC) - .mockReturnValue(false); const result = await service.getTxHistory({ ...network1, vmName: NetworkVMType.BITCOIN, @@ -151,18 +153,21 @@ describe('src/background/services/history/HistoryService.ts', () => { return { transactions: [btcTxHistoryItem] }; }), }); - jest - .mocked(bridgeHistoryHelperServiceMock.isBridgeTransactionBTC) - .mockReturnValue(true); const result = await service.getTxHistory({ ...network1, vmName: NetworkVMType.BITCOIN, caipId: 'bip122:000000000019d6689c085ae165831e93', }); - expect(result).toEqual([{ ...btcTxHistoryItem, isBridge: true }]); + expect(result).toEqual([ + { ...btcTxHistoryItem, bridgeAnalysis: { isBridgeTx: true } }, + ]); }); it('should return results with an ETH bridge transaction', async () => { + jest.mocked(unifiedBridgeServiceMock.analyzeTx).mockReturnValue({ + isBridgeTx: true, + bridgeType: BridgeType.AVALANCHE_EVM, + }); jest.mocked(moduleManagereMock.loadModuleByNetwork).mockResolvedValue({ getTransactionHistory: jest.fn(() => { return { @@ -181,11 +186,17 @@ describe('src/background/services/history/HistoryService.ts', () => { caipId: 'caip', }); expect(result).toEqual([ - { ...txHistoryItem, isBridge: true, from: ETHEREUM_ADDRESS }, + { + ...txHistoryItem, + bridgeAnalysis: { isBridgeTx: true }, + from: ETHEREUM_ADDRESS, + }, ]); }); it('should return results with an pchain transaction', async () => { - jest.mocked(unifiedBridgeServiceMock.isBridgeTx).mockReturnValue(false); + jest + .mocked(unifiedBridgeServiceMock.analyzeTx) + .mockReturnValue({ isBridgeTx: false }); jest.mocked(moduleManagereMock.loadModuleByNetwork).mockResolvedValue({ getTransactionHistory: jest.fn(() => { return { diff --git a/src/background/services/history/HistoryService.ts b/src/background/services/history/HistoryService.ts index 370e93d60..d44b474fb 100644 --- a/src/background/services/history/HistoryService.ts +++ b/src/background/services/history/HistoryService.ts @@ -4,21 +4,19 @@ import { NetworkWithCaipId } from '../network/models'; import { ModuleManager } from '@src/background/vmModules/ModuleManager'; import { AccountsService } from '../accounts/AccountsService'; import { TxHistoryItem } from './models'; -import { HistoryServiceBridgeHelper } from './HistoryServiceBridgeHelper'; import { Transaction } from '@avalabs/vm-module-types'; -import { ETHEREUM_ADDRESS } from '@src/utils/bridgeTransactionUtils'; import { UnifiedBridgeService } from '../unifiedBridge/UnifiedBridgeService'; import { resolve } from '@src/utils/promiseResolver'; import sentryCaptureException, { SentryExceptionTypes, } from '@src/monitoring/sentryCaptureException'; +import { AnalyzeTxParams } from '@avalabs/bridge-unified'; @singleton() export class HistoryService { constructor( private moduleManager: ModuleManager, private accountsService: AccountsService, - private bridgeHistoryHelperService: HistoryServiceBridgeHelper, private unifiedBridgeService: UnifiedBridgeService ) {} @@ -52,26 +50,31 @@ export class HistoryService { }); const txHistoryItem = transactions.map((transaction) => { - const isBridge = this.#getIsBirdge(network, transaction); + const result = this.#analyze(network, transaction); const vmType = network.vmName; - return { ...transaction, vmType, isBridge }; + return { + ...transaction, + vmType, + bridgeAnalysis: result, + }; }) as TxHistoryItem[]; return txHistoryItem; } - #getIsBirdge(network: NetworkWithCaipId, transaction: Transaction) { - if (network.vmName === NetworkVMType.BITCOIN) { - return this.bridgeHistoryHelperService.isBridgeTransactionBTC([ - transaction.from, - transaction.to, - ]); - } - return ( - this.#isBridgeAddress(transaction.from) || - this.#isBridgeAddress(transaction.to) || - this.unifiedBridgeService.isBridgeTx(transaction) - ); + #analyze(network: NetworkWithCaipId, transaction: Transaction) { + const params: AnalyzeTxParams = { + from: transaction.from as `0x${string}`, + to: transaction.to as `0x${string}`, + chainId: network.caipId, + tokenTransfers: transaction.tokens.map((transfer) => ({ + symbol: transfer.symbol, + from: (transfer.from?.address ?? transaction.from) as `0x${string}`, + to: (transfer.to?.address ?? transaction.to) as `0x${string}`, + })), + }; + + return this.unifiedBridgeService.analyzeTx(params); } #getAddress(network: NetworkWithCaipId) { @@ -90,12 +93,4 @@ export class HistoryService { return undefined; } } - - #isBridgeAddress(address?: string) { - if (!address) { - return false; - } - - return ETHEREUM_ADDRESS === address.toLowerCase(); - } } diff --git a/src/background/services/history/HistoryServiceBridgeHelper.ts b/src/background/services/history/HistoryServiceBridgeHelper.ts deleted file mode 100644 index bec22fe7d..000000000 --- a/src/background/services/history/HistoryServiceBridgeHelper.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { ETHEREUM_ADDRESS } from '@src/utils/bridgeTransactionUtils'; -import { BridgeService } from '../bridge/BridgeService'; -import { singleton } from 'tsyringe'; -import { Erc20Tx } from '@avalabs/core-snowtrace-sdk'; -import { Network } from '@avalabs/core-chains-sdk'; -import { isEthereumNetwork } from '../network/utils/isEthereumNetwork'; -import { UnifiedBridgeService } from '../unifiedBridge/UnifiedBridgeService'; - -@singleton() -export class HistoryServiceBridgeHelper { - constructor( - private bridgeService: BridgeService, - private unifiedBridgeService: UnifiedBridgeService - ) {} - - /** - * Checking if the transaction is a bridge transaction with Ethereum - * - * If the tx is TransactionERC20 - * to or from has to be ETHEREUM_ADDRESS - * and the contractAddress of the transaction has to match one of the addresses from EthereumConfigAssets - * - * If the tx is BitcoinHistoryTx - * it should be false since we currently do not support bridge between Bitcoin and Ethereum - */ - isBridgeTransactionEVM(tx: Erc20Tx, network: Network): boolean { - const config = this.bridgeService.bridgeConfig; - const ethereumAssets = config?.config?.critical.assets; - const bitcoinAssets = config?.config?.criticalBitcoin?.bitcoinAssets; - - if (!ethereumAssets || !bitcoinAssets) { - return false; - } - - if (this.unifiedBridgeService.isBridgeTx(tx)) { - return true; - } - - if (isEthereumNetwork(network)) { - const ethBridgeAddress = config.config?.critical.walletAddresses.ethereum; - return ( - tx.to.toLowerCase() === ethBridgeAddress || - tx.from.toLowerCase() === ethBridgeAddress - ); - } else { - return ( - Object.values(ethereumAssets).some(({ wrappedContractAddress }) => { - return ( - wrappedContractAddress.toLowerCase() === - tx.contractAddress.toLowerCase() && - (tx.to === ETHEREUM_ADDRESS || tx.from === ETHEREUM_ADDRESS) - ); - }) || - Object.values(bitcoinAssets).some( - ({ wrappedContractAddress }) => - wrappedContractAddress.toLowerCase() === - tx.contractAddress.toLowerCase() - ) - ); - } - } - - /** - * Checking if the transaction is a bridge transaction with Bitcoin - * - * If the tx is TransactionERC20 - * The contractAddress from the transaction has to match one of the addresses from BitcoinConfigAssets - * - * If the tx is BitcoinHistoryTx - * addresses is an array of addresses to or from. - * It should include - * config.criticalBitcoin?.walletAddresses.btc or - * config.criticalBitcoin?.walletAddresses.avalanche - */ - isBridgeTransactionBTC(addresses: string[]): boolean { - const config = this.bridgeService.bridgeConfig; - const bitcoinWalletAddresses = - config?.config?.criticalBitcoin?.walletAddresses; - - if (!bitcoinWalletAddresses) { - return false; - } - - return addresses.some((address) => { - return [ - bitcoinWalletAddresses.btc, - bitcoinWalletAddresses.avalanche, - ].some( - (walletAddress) => address.toLowerCase() === walletAddress.toLowerCase() - ); - }); - } -} diff --git a/src/background/services/history/models.ts b/src/background/services/history/models.ts index e2bafafa9..5caab75ff 100644 --- a/src/background/services/history/models.ts +++ b/src/background/services/history/models.ts @@ -1,52 +1,7 @@ -import { - NetworkVMType, - Transaction, - TransactionType, -} from '@avalabs/vm-module-types'; +import { AnalyzeTxResult } from '@avalabs/bridge-unified'; +import { NetworkVMType, Transaction } from '@avalabs/vm-module-types'; export interface TxHistoryItem extends Transaction { - isBridge: boolean; + bridgeAnalysis: AnalyzeTxResult; vmType?: NetworkVMType; } - -export const NonContractCallTypes = [ - TransactionType.BRIDGE, - TransactionType.SEND, - TransactionType.RECEIVE, - TransactionType.TRANSFER, -]; - -export interface HistoryItemCategories { - isBridge: boolean; - isSwap: boolean; - isNativeSend: boolean; - isNativeReceive: boolean; - isNFTPurchase: boolean; - isApprove: boolean; - isTransfer: boolean; - isAirdrop: boolean; - isUnwrap: boolean; - isFillOrder: boolean; - isContractCall: boolean; - method: string; - type: TransactionType; -} - -export interface SubnetHistoryItem { - hash: string; - status: number; - gasPrice: number; - gasUsed: number; - timestamp: number; - from: string; - to: string; - value: string; - method: string; - type: number; - block: number; - toContract?: { - name: string; - symbol: string; - decimals: number; - }; -} diff --git a/src/background/services/history/utils/isTxHistoryItem.test.ts b/src/background/services/history/utils/isTxHistoryItem.test.ts index f59dfd22e..8d755542c 100644 --- a/src/background/services/history/utils/isTxHistoryItem.test.ts +++ b/src/background/services/history/utils/isTxHistoryItem.test.ts @@ -9,7 +9,9 @@ import { TransactionType } from '@avalabs/vm-module-types'; describe('src/background/services/history/utils/isTxHistoryItem.ts', () => { const txHistoryItem: TxHistoryItem = { - isBridge: false, + bridgeAnalysis: { + isBridgeTx: false, + }, isContractCall: true, isIncoming: false, isOutgoing: true, @@ -32,7 +34,9 @@ describe('src/background/services/history/utils/isTxHistoryItem.ts', () => { txType: TransactionType.SEND, }; const pchainTxHistoryItem: TxHistoryItem = { - isBridge: false, + bridgeAnalysis: { + isBridgeTx: false, + }, isContractCall: true, isIncoming: false, isOutgoing: true, diff --git a/src/background/services/history/utils/isTxHistoryItem.ts b/src/background/services/history/utils/isTxHistoryItem.ts index dfcd3b73b..1305488b5 100644 --- a/src/background/services/history/utils/isTxHistoryItem.ts +++ b/src/background/services/history/utils/isTxHistoryItem.ts @@ -1,7 +1,7 @@ import { TxHistoryItem } from '../models'; export function isTxHistoryItem(tx: TxHistoryItem): tx is TxHistoryItem { - if ('isBridge' in tx && tx.vmType !== 'AVM' && tx.vmType !== 'PVM') { + if ('bridgeAnalysis' in tx && tx.vmType !== 'AVM' && tx.vmType !== 'PVM') { return true; } return false; diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.ts index 7ce3222bc..42510380a 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.ts @@ -1,11 +1,12 @@ import { singleton } from 'tsyringe'; import { + AnalyzeTxParams, + AnalyzeTxResult, BridgeTransfer, BridgeType, createUnifiedBridgeService, Environment, getEnabledBridgeServices, - IsBridgeTxParams, } from '@avalabs/bridge-unified'; import { wait } from '@avalabs/core-utils-sdk'; import EventEmitter from 'events'; @@ -160,12 +161,14 @@ export class UnifiedBridgeService implements OnStorageReady { } } - isBridgeTx(txInfo: IsBridgeTxParams): boolean { + analyzeTx(txInfo: AnalyzeTxParams): AnalyzeTxResult { if (!this.#core) { - return false; + return { + isBridgeTx: false, + }; } - return this.#core.isBridgeTx(txInfo); + return this.#core.analyzeTx(txInfo); } trackTransfer(bridgeTransfer: BridgeTransfer) { diff --git a/src/contexts/UnifiedBridgeProvider.test.tsx b/src/contexts/UnifiedBridgeProvider.test.tsx index 8bc2be6ca..3b5189a07 100644 --- a/src/contexts/UnifiedBridgeProvider.test.tsx +++ b/src/contexts/UnifiedBridgeProvider.test.tsx @@ -183,7 +183,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.transferAsset('USDC', 1000n, 1); + await provider.current?.transferAsset('USDC', 1000n, 'eip155:1'); } catch (err: any) { expect(err.data.reason).toEqual(CommonError.Unknown); } @@ -195,7 +195,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.transferAsset('USDCC', 1000n, 1); + await provider.current?.transferAsset('USDCC', 1000n, 'eip155:1'); } catch (err: any) { expect(err.data?.reason).toEqual(UnifiedBridgeError.UnknownAsset); } @@ -242,9 +242,9 @@ describe('contexts/UnifiedBridgeProvider', () => { const provider = getBridgeProvider(); await waitFor(async () => { - expect(await provider.current?.transferAsset('USDC', 1000n, 1)).toEqual( - transfer.sourceTxHash - ); + expect( + await provider.current?.transferAsset('USDC', 1000n, 'eip155:1') + ).toEqual(transfer.sourceTxHash); expect(core.transferAsset).toHaveBeenCalledWith({ asset: expect.objectContaining({ symbol: 'USDC' }), @@ -301,7 +301,11 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.estimateTransferGas('USDC', 1000n, 1); + await provider.current?.estimateTransferGas( + 'USDC', + 1000n, + 'eip155:1' + ); } catch (err: any) { expect(err.data.reason).toEqual(CommonError.Unknown); } @@ -313,7 +317,11 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.estimateTransferGas('USDC', 1000n, 1); + await provider.current?.estimateTransferGas( + 'USDC', + 1000n, + 'eip155:1' + ); } catch (err: any) { expect(err.data.reason).toEqual(UnifiedBridgeError.UnknownAsset); } @@ -327,7 +335,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { expect( - await provider.current?.estimateTransferGas('USDC', 1000n, 1) + await provider.current?.estimateTransferGas('USDC', 1000n, 'eip155:1') ).toEqual(555n); expect(core.estimateGas).toHaveBeenCalledWith({ @@ -356,7 +364,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.getFee('USDC', 1000n, 1); + await provider.current?.getFee('USDC', 1000n, 'eip155:1'); } catch (err: any) { expect(err.data.reason).toEqual(CommonError.Unknown); } @@ -368,7 +376,7 @@ describe('contexts/UnifiedBridgeProvider', () => { await waitFor(async () => { try { - await provider.current?.getFee('USDCc', 1000n, 1); + await provider.current?.getFee('USDCc', 1000n, 'eip155:1'); } catch (err: any) { expect(err.data.reason).toEqual(UnifiedBridgeError.UnknownAsset); } @@ -382,7 +390,9 @@ describe('contexts/UnifiedBridgeProvider', () => { const provider = getBridgeProvider(); await waitFor(async () => { - expect(await provider.current?.getFee('USDC', 1000n, 1)).toEqual(300n); + expect( + await provider.current?.getFee('USDC', 1000n, 'eip155:1') + ).toEqual(300n); expect(core.getFees).toHaveBeenCalledWith({ asset: expect.objectContaining({ symbol: 'USDC' }), diff --git a/src/contexts/UnifiedBridgeProvider.tsx b/src/contexts/UnifiedBridgeProvider.tsx index bf622dd01..fe9a1a057 100644 --- a/src/contexts/UnifiedBridgeProvider.tsx +++ b/src/contexts/UnifiedBridgeProvider.tsx @@ -18,13 +18,13 @@ import { BridgeTransfer, getEnabledBridgeServices, BridgeServicesMap, - IsBridgeTxParams, + AnalyzeTxParams, + AnalyzeTxResult, } from '@avalabs/bridge-unified'; import { ethErrors } from 'eth-rpc-errors'; import { filter, map } from 'rxjs'; import { ExtensionRequest } from '@src/background/connections/extensionConnection/models'; -import { chainIdToCaip } from '@src/utils/caipConversion'; import { UNIFIED_BRIDGE_DEFAULT_STATE, UnifiedBridgeError, @@ -39,7 +39,6 @@ import { CommonError, ErrorCode } from '@src/utils/errors'; import { useTranslation } from 'react-i18next'; import { useFeatureFlagContext } from './FeatureFlagsProvider'; import { FeatureGates } from '@src/background/services/featureFlags/models'; -import { getNetworkCaipId } from '@src/utils/caipConversion'; import { useAccountsContext } from './AccountsProvider'; import { JsonRpcApiProvider } from 'ethers'; import { getProviderForNetwork } from '@src/utils/network/getProviderForNetwork'; @@ -54,23 +53,23 @@ export interface UnifiedBridgeContext { estimateTransferGas( symbol: string, amount: bigint, - targetChainId: number + targetChainId: string ): Promise; getAssetIdentifierOnTargetChain( symbol?: string, - chainId?: number + chainId?: string ): string | undefined; getFee( symbol: string, amount: bigint, - targetChainId: number + targetChainId: string ): Promise; - isBridgeTx(txInfo: IsBridgeTxParams): boolean; - supportsAsset(address: string, targetChainId: number): boolean; + analyzeTx(txInfo: AnalyzeTxParams): AnalyzeTxResult; + supportsAsset(address: string, targetChainId: string): boolean; transferAsset( symbol: string, amount: bigint, - targetChainId: number + targetChainId: string ): Promise; getErrorMessage(errorCode: UnifiedBridgeErrorCode): string; transferableAssets: BridgeAsset[]; @@ -91,8 +90,8 @@ const DEFAULT_STATE = { supportsAsset() { return false; }, - isBridgeTx() { - return false; + analyzeTx(): AnalyzeTxResult { + return { isBridgeTx: false }; }, transferAsset() { throw new Error('Bridge not ready'); @@ -208,13 +207,13 @@ export function UnifiedBridgeProvider({ }, [core]); const buildChain = useCallback( - (chainId: number): Chain => { + (chainId: string): Chain => { const network = getNetwork(chainId); assert(network, CommonError.UnknownNetwork); return { - chainId: chainIdToCaip(network.chainId), + chainId, chainName: network.chainName, rpcUrl: network.rpcUrl, networkToken: { @@ -237,7 +236,7 @@ export function UnifiedBridgeProvider({ // UnifiedBridge SDK returns the chain IDs in CAIP2 format. // This is good, but we need to translate it to numeric chain ids // until we make the switch in extension: - return assets[getNetworkCaipId(activeNetwork)] ?? []; + return assets[activeNetwork.caipId] ?? []; }, [activeNetwork, assets]); useEffect(() => { @@ -262,12 +261,12 @@ export function UnifiedBridgeProvider({ }, [events, request]); const supportsAsset = useCallback( - (lookupAddressOrSymbol: string, targetChainId: number) => { + (lookupAddressOrSymbol: string, targetChainId: string) => { if (!activeNetwork) { return false; } - const sourceAssets = assets[getNetworkCaipId(activeNetwork)] ?? []; + const sourceAssets = assets[activeNetwork.caipId] ?? []; const asset = sourceAssets.find((token) => { return token.type === TokenType.NATIVE ? token.symbol === lookupAddressOrSymbol @@ -278,14 +277,14 @@ export function UnifiedBridgeProvider({ return false; } - return chainIdToCaip(targetChainId) in asset.destinations; + return targetChainId in asset.destinations; }, [assets, activeNetwork] ); const getAsset = useCallback( - (symbol: string, chainId: number) => { - const chainAssets = assets[chainIdToCaip(chainId)] ?? []; + (symbol: string, chainId: string) => { + const chainAssets = assets[chainId] ?? []; const asset = chainAssets.find( ({ symbol: assetSymbol }) => assetSymbol === symbol @@ -298,10 +297,10 @@ export function UnifiedBridgeProvider({ const buildParams = useCallback( ( - targetChainId: number + targetChainId: string ): { sourceChain: Chain; - sourceChainId: number; + sourceChainId: string; targetChain: Chain; provider: JsonRpcApiProvider; fromAddress: `0x${string}`; @@ -313,7 +312,7 @@ export function UnifiedBridgeProvider({ UnifiedBridgeError.UnsupportedNetwork ); - const sourceChain = buildChain(activeNetwork.chainId); + const sourceChain = buildChain(activeNetwork.caipId); const targetChain = buildChain(targetChainId); const provider = getProviderForNetwork( @@ -324,7 +323,7 @@ export function UnifiedBridgeProvider({ return { sourceChain, - sourceChainId: activeNetwork.chainId, + sourceChainId: activeNetwork.caipId, targetChain, provider, fromAddress, @@ -337,12 +336,12 @@ export function UnifiedBridgeProvider({ async ( symbol: string, amount: bigint, - targetChainId: number + targetChainId: string ): Promise => { assert(core, CommonError.Unknown); assert(activeNetwork, CommonError.NoActiveNetwork); - const asset = getAsset(symbol, activeNetwork.chainId); + const asset = getAsset(symbol, activeNetwork.caipId); assert(asset, UnifiedBridgeError.UnknownAsset); const feeMap = lowerCaseKeys( @@ -350,7 +349,7 @@ export function UnifiedBridgeProvider({ asset, amount, targetChain: buildChain(targetChainId), - sourceChain: buildChain(activeNetwork.chainId), + sourceChain: buildChain(activeNetwork.caipId), }) ); @@ -366,12 +365,12 @@ export function UnifiedBridgeProvider({ async ( symbol: string, amount: bigint, - targetChainId: number + targetChainId: string ): Promise => { assert(core, CommonError.Unknown); assert(activeNetwork, CommonError.NoActiveNetwork); - const asset = getAsset(symbol, activeNetwork.chainId); + const asset = getAsset(symbol, activeNetwork.caipId); assert(asset, UnifiedBridgeError.UnknownAsset); @@ -392,7 +391,7 @@ export function UnifiedBridgeProvider({ ); const getAssetIdentifierOnTargetChain = useCallback( - (symbol?: string, targetChainId?: number) => { + (symbol?: string, targetChainId?: string) => { if (!symbol || !targetChainId) { return; } @@ -419,11 +418,11 @@ export function UnifiedBridgeProvider({ ); const transferAsset = useCallback( - async (symbol: string, amount: bigint, targetChainId: number) => { + async (symbol: string, amount: bigint, targetChainId: string) => { assert(core, CommonError.Unknown); assert(activeNetwork, CommonError.NoActiveNetwork); - const asset = getAsset(symbol, activeNetwork.chainId); + const asset = getAsset(symbol, activeNetwork.caipId); assert(asset, UnifiedBridgeError.UnknownAsset); @@ -517,11 +516,11 @@ export function UnifiedBridgeProvider({ [t] ); - const isBridgeTx = useCallback( - (txInfo: IsBridgeTxParams) => { + const analyzeTx = useCallback( + (txInfo: AnalyzeTxParams) => { assert(core, CommonError.Unknown); - return core.isBridgeTx(txInfo); + return core.analyzeTx(txInfo); }, [core] ); @@ -532,7 +531,7 @@ export function UnifiedBridgeProvider({ estimateTransferGas, getErrorMessage, state, - isBridgeTx, + analyzeTx, getAssetIdentifierOnTargetChain, getFee, supportsAsset, diff --git a/src/localization/locales/en/translation.json b/src/localization/locales/en/translation.json index 5449194cc..b76342920 100644 --- a/src/localization/locales/en/translation.json +++ b/src/localization/locales/en/translation.json @@ -719,6 +719,7 @@ "Select a derivation path to see your derived addresses.": "Select a derivation path to see your derived addresses.", "Select derivation path": "Select derivation path", "Select one of the available verification methods below to proceed.": "Select one of the available verification methods below to proceed.", + "Select target chain": "Select target chain", "Select the Core wallet.": "Select the Core wallet.", "Select the first word": "Select the first word", "Select the word that comes after": "Select the word that comes after", @@ -791,7 +792,6 @@ "Swap transaction succeeded! 🎉": "Swap transaction succeeded! 🎉", "Swiss Franc": "Swiss Franc", "Switch": "Switch", - "Switch to {{chainName}}": "Switch to {{chainName}}", "Switch to {{chainName}} Network?": "Switch to {{chainName}} Network?", "Switch to {{name}}?": "Switch to {{name}}?", "Symbol": "Symbol", @@ -894,6 +894,7 @@ "Try typing the information again or go back to the account manager.": "Try typing the information again or go back to the account manager.", "Turkish": "Turkish", "URI": "URI", + "USDC is routed through Circle's Cross-Chain Transfer Protocol. Bridge FAQs": "USDC is routed through Circle's Cross-Chain Transfer Protocol. Bridge FAQs", "Unable to connect. View the troubleshoot guide here": "Unable to connect. View the troubleshoot guide here", "Unable to connect?": "Unable to connect?", "Unable to set TOTP configuration": "Unable to set TOTP configuration", @@ -1026,6 +1027,5 @@ "{{functionName}} is currently unavailable.": "{{functionName}} is currently unavailable.", "{{length}} Bytes": "{{length}} Bytes", "{{name}} successfully removed!": "{{name}} successfully removed!", - "{{symbol}} is routed through {{bridgeName}}. Bridge FAQs": "{{symbol}} is routed through {{bridgeName}}. Bridge FAQs", "{{walletName}} Added": "{{walletName}} Added" } diff --git a/src/pages/Wallet/WalletRecentTxs.tsx b/src/pages/Wallet/WalletRecentTxs.tsx index bb808e78e..cad789580 100644 --- a/src/pages/Wallet/WalletRecentTxs.tsx +++ b/src/pages/Wallet/WalletRecentTxs.tsx @@ -190,7 +190,11 @@ export function WalletRecentTxs({ } function shouldTxBeKept(tx: TxHistoryItem) { - if (isTxHistoryItem(tx) && tx.isBridge && isPendingBridge(tx)) { + if ( + isTxHistoryItem(tx) && + tx.bridgeAnalysis.isBridgeTx && + isPendingBridge(tx) + ) { return false; } return true; @@ -214,12 +218,16 @@ export function WalletRecentTxs({ if (filter === FilterType.ALL) { return true; } else if (filter === FilterType.BRIDGE) { - return tx.txType === TransactionType.BRIDGE || tx.isBridge; + return ( + tx.txType === TransactionType.BRIDGE || tx.bridgeAnalysis.isBridgeTx + ); } else if (filter === FilterType.SWAP) { return tx.txType === TransactionType.SWAP; } else if (filter === FilterType.CONTRACT_CALL) { return ( - tx.isContractCall && !tx.isBridge && tx.txType !== TransactionType.SWAP + tx.isContractCall && + !tx.bridgeAnalysis.isBridgeTx && + tx.txType !== TransactionType.SWAP ); } else if (filter === FilterType.INCOMING) { return tx.isIncoming; diff --git a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCard.tsx b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCard.tsx index d7f7b6563..95a7b441f 100644 --- a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCard.tsx +++ b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCard.tsx @@ -83,7 +83,7 @@ export function ActivityCard({ historyItem }: ActivityCardProp) { const txTitle = useMemo(() => { if (network) { - if (historyItem.isBridge) { + if (historyItem.bridgeAnalysis.isBridgeTx) { return t('Bridge'); } if ( diff --git a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardIcon.tsx b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardIcon.tsx index ec586f125..6eae90829 100644 --- a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardIcon.tsx +++ b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardIcon.tsx @@ -48,7 +48,7 @@ export function ActivityCardIcon({ historyItem }: ActivityCardProp) { ); - if (historyItem.isBridge) { + if (historyItem.bridgeAnalysis.isBridgeTx) { setTxIcon(); return; } diff --git a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardSummary.tsx b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardSummary.tsx index d472ec344..f15544601 100644 --- a/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardSummary.tsx +++ b/src/pages/Wallet/components/History/components/ActivityCard/ActivityCardSummary.tsx @@ -14,13 +14,17 @@ export function ActivityCardSummary({ historyItem }: ActivityCardProp) { useBlockchainNames(historyItem); const { t } = useTranslation(); - if (historyItem.txType === TransactionType.BRIDGE || historyItem.isBridge) { + if ( + historyItem.txType === TransactionType.BRIDGE || + historyItem.bridgeAnalysis.isBridgeTx + ) { return ( ({ color: theme.palette.primary.dark })} > - {sourceBlockchain} -> {targetBlockchain} + {sourceBlockchain ?? t('Unknown')} ->{' '} + {targetBlockchain ?? t('Unknown')} ); } else if (historyItem.txType === TransactionType.SWAP) { diff --git a/src/pages/Wallet/components/History/useBlockchainNames.ts b/src/pages/Wallet/components/History/useBlockchainNames.ts index 3952db787..0d348ad93 100644 --- a/src/pages/Wallet/components/History/useBlockchainNames.ts +++ b/src/pages/Wallet/components/History/useBlockchainNames.ts @@ -1,22 +1,15 @@ -import { Blockchain, BridgeTransaction } from '@avalabs/core-bridge-sdk'; -import { BridgeTransfer, IsBridgeTxParams } from '@avalabs/bridge-unified'; -import { BITCOIN_NETWORK, ChainId } from '@avalabs/core-chains-sdk'; +import { BridgeTransaction } from '@avalabs/core-bridge-sdk'; +import { BridgeTransfer } from '@avalabs/bridge-unified'; + import { TxHistoryItem } from '@src/background/services/history/models'; -import { isEthereumChainId } from '@src/background/services/network/utils/isEthereumNetwork'; -import { useUnifiedBridgeContext } from '@src/contexts/UnifiedBridgeProvider'; -import { isUnifiedBridgeTransfer } from '@src/pages/Bridge/utils/isUnifiedBridgeTransfer'; -import { - ETHEREUM_ADDRESS, - isPendingBridgeTransaction, -} from '@src/utils/bridgeTransactionUtils'; -import { caipToChainId } from '@src/utils/caipConversion'; -import { getBridgedAssetSymbol } from '@src/utils/bridge/getBridgedAssetSymbol'; +import { isPendingBridgeTransaction } from '@src/utils/bridgeTransactionUtils'; +import { useNetworkContext } from '@src/contexts/NetworkProvider'; export function useBlockchainNames( item: TxHistoryItem | BridgeTransaction | BridgeTransfer ) { - const { isBridgeTx } = useUnifiedBridgeContext(); const pending = isPendingBridgeTransaction(item); + const { getNetwork } = useNetworkContext(); if (pending) { return { @@ -33,85 +26,25 @@ export function useBlockchainNames( }; } - const isToAvalanche = isTxToAvalanche(item); - const txBlockchain = getTxBlockchain(item, isBridgeTx); + if (!item.bridgeAnalysis.isBridgeTx) { + return { + sourceBlockchain: undefined, + targetBlockchain: undefined, + }; + } + + const { sourceChainId, targetChainId } = item.bridgeAnalysis; return { - sourceBlockchain: isToAvalanche ? txBlockchain : 'Avalanche', - targetBlockchain: isToAvalanche ? 'Avalanche' : txBlockchain, + sourceBlockchain: sourceChainId + ? getNetwork(sourceChainId)?.chainName ?? sourceChainId + : undefined, + targetBlockchain: targetChainId + ? getNetwork(targetChainId)?.chainName ?? targetChainId + : undefined, }; } function titleCase(name: string) { return (name[0] || '').toUpperCase() + name.slice(1); } - -function isBridgeTransaction( - tx: TxHistoryItem | BridgeTransaction | BridgeTransfer -): tx is BridgeTransaction | BridgeTransfer { - return 'targetChain' in tx; -} - -function isTxToAvalanche( - tx: TxHistoryItem | BridgeTransaction | BridgeTransfer -): boolean { - if (isBridgeTransaction(tx)) { - if (isUnifiedBridgeTransfer(tx)) { - return ( - caipToChainId(tx.targetChain.chainId) === ChainId.ETHEREUM_HOMESTEAD || - caipToChainId(tx.targetChain.chainId) === ChainId.ETHEREUM_TEST_GOERLY - ); - } - - return tx.targetChain === Blockchain.AVALANCHE; - } else if (tx.from === ETHEREUM_ADDRESS) { - return true; - } else if (tx.isOutgoing) { - return ( - tx.chainId !== ChainId.AVALANCHE_MAINNET_ID.toString() && - tx.chainId !== ChainId.AVALANCHE_TESTNET_ID.toString() - ); - } else if (tx.isIncoming) { - return ( - tx.chainId === ChainId.AVALANCHE_MAINNET_ID.toString() || - tx.chainId === ChainId.AVALANCHE_TESTNET_ID.toString() - ); - } - return false; -} - -function getTxBlockchain( - tx: TxHistoryItem | BridgeTransaction | BridgeTransfer, - isBridgeTx: (txInfo: IsBridgeTxParams) => boolean -) { - const symbol = isBridgeTransaction(tx) - ? getBridgedAssetSymbol(tx) - : tx.tokens?.[0]?.symbol; - const ethereum = 'Ethereum'; - const bitcoin = 'Bitcoin'; - - if (symbol === BITCOIN_NETWORK.networkToken.symbol) { - return bitcoin; - } - - if (!isBridgeTransaction(tx)) { - if (isEthereumChainId(Number(tx.chainId))) { - return ethereum; - } - - if (isBridgeTx(tx)) { - return ethereum; - } - } - - const symbolPostfix = symbol?.split('.')[1]; - - switch (symbolPostfix) { - case 'e': - return ethereum; - case 'b': - return bitcoin; - default: - return 'N/A'; - } -} From bf64965da200693a19e5a3c1b6c69ce184f17ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Fri, 11 Oct 2024 12:52:30 +0200 Subject: [PATCH 10/20] chore: another sdk update --- package.json | 28 +-- .../middlewares/PermissionMiddleware.ts | 1 + .../vmModules/ApprovalController.ts | 1 + src/background/vmModules/ModuleManager.ts | 1 + .../common/approval/TransactionDetailItem.tsx | 55 +++++ .../common/approval/TxDetailsRow.tsx | 13 +- src/contexts/ContactsProvider.tsx | 20 +- .../ApproveAction/GenericApprovalScreen.tsx | 14 +- .../ApproveAction/hooks/useFeeCustomizer.tsx | 27 ++- yarn.lock | 188 +++++++++--------- 10 files changed, 218 insertions(+), 130 deletions(-) diff --git a/package.json b/package.json index 97be32782..4c13d7afa 100644 --- a/package.json +++ b/package.json @@ -23,25 +23,25 @@ "sentry": "node sentryscript.js" }, "dependencies": { - "@avalabs/avalanche-module": "0.8.0", + "@avalabs/avalanche-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", "@avalabs/avalanchejs": "4.0.5", - "@avalabs/bitcoin-module": "0.8.0", + "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", - "@avalabs/core-bridge-sdk": "3.1.0-alpha.7", - "@avalabs/core-chains-sdk": "3.1.0-alpha.7", - "@avalabs/core-coingecko-sdk": "3.1.0-alpha.7", - "@avalabs/core-covalent-sdk": "3.1.0-alpha.7", - "@avalabs/core-etherscan-sdk": "3.1.0-alpha.7", + "@avalabs/core-bridge-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-chains-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-coingecko-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-covalent-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-etherscan-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-k2-components": "4.18.0-alpha.47", - "@avalabs/core-snowtrace-sdk": "3.1.0-alpha.7", - "@avalabs/core-token-prices-sdk": "3.1.0-alpha.7", - "@avalabs/core-utils-sdk": "3.1.0-alpha.7", - "@avalabs/core-wallets-sdk": "3.1.0-alpha.7", - "@avalabs/evm-module": "0.8.0", - "@avalabs/glacier-sdk": "3.1.0-alpha.7", + "@avalabs/core-snowtrace-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-token-prices-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-utils-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-wallets-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", + "@avalabs/glacier-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.3", - "@avalabs/vm-module-types": "0.8.0", + "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", "@blockaid/client": "0.10.0", "@coinbase/cbpay-js": "1.6.0", "@cubist-labs/cubesigner-sdk": "0.3.28", diff --git a/src/background/connections/middlewares/PermissionMiddleware.ts b/src/background/connections/middlewares/PermissionMiddleware.ts index 7def81e31..ec519391b 100644 --- a/src/background/connections/middlewares/PermissionMiddleware.ts +++ b/src/background/connections/middlewares/PermissionMiddleware.ts @@ -23,6 +23,7 @@ const RESTRICTED_METHODS = Object.freeze([] as string[]); * "method not found" error. */ export const UNRESTRICTED_METHODS = Object.freeze([ + 'bitcoin_signTransaction', 'eth_accounts', 'eth_requestAccounts', 'eth_baseFee', diff --git a/src/background/vmModules/ApprovalController.ts b/src/background/vmModules/ApprovalController.ts index 1f164ee28..82f1641f2 100644 --- a/src/background/vmModules/ApprovalController.ts +++ b/src/background/vmModules/ApprovalController.ts @@ -173,6 +173,7 @@ export class ApprovalController implements IApprovalController { switch (signingData.type) { case RpcMethod.BITCOIN_SEND_TRANSACTION: + case RpcMethod.BITCOIN_SIGN_TRANSACTION: case RpcMethod.ETH_SEND_TRANSACTION: return await this.#walletService.sign(signingData.data, network); diff --git a/src/background/vmModules/ModuleManager.ts b/src/background/vmModules/ModuleManager.ts index 16af2492c..aa9dcb951 100644 --- a/src/background/vmModules/ModuleManager.ts +++ b/src/background/vmModules/ModuleManager.ts @@ -59,6 +59,7 @@ export class ModuleManager { approvalController: this.#approvalController, appInfo, }), + new AvalancheModule({ environment, approvalController: this.#approvalController, diff --git a/src/components/common/approval/TransactionDetailItem.tsx b/src/components/common/approval/TransactionDetailItem.tsx index 5fca72dde..efc50ef8f 100644 --- a/src/components/common/approval/TransactionDetailItem.tsx +++ b/src/components/common/approval/TransactionDetailItem.tsx @@ -12,6 +12,7 @@ import { type LinkItem, type TextItem, DetailItemType, + FundsRecipientItem, } from '@avalabs/vm-module-types'; import { TokenUnit } from '@avalabs/core-utils-sdk'; @@ -21,6 +22,9 @@ import { useSettingsContext } from '@src/contexts/SettingsProvider'; import { TxDetailsRow } from './TxDetailsRow'; import { useBalancesContext } from '@src/contexts/BalancesProvider'; import { runtime } from 'webextension-polyfill'; +import { useContactsContext } from '@src/contexts/ContactsProvider'; +import { truncateAddress } from '@src/utils/truncateAddress'; +import { useAccountsContext } from '@src/contexts/AccountsProvider'; export const TransactionDetailItem = ({ item }: { item: DetailItem }) => { if (typeof item === 'string') { @@ -40,6 +44,9 @@ export const TransactionDetailItem = ({ item }: { item: DetailItem }) => { case DetailItemType.CURRENCY: return ; + case DetailItemType.FUNDS_RECIPIENT: + return ; + default: return null; } @@ -100,6 +107,54 @@ const AddressInfo = ({ item }: { item: AddressItem }) => ( ); +const FundsRecipientInfo = ({ item }: { item: FundsRecipientItem }) => { + const { currencyFormatter } = useSettingsContext(); + const { getContactByAddress } = useContactsContext(); + const { getAccount } = useAccountsContext(); + const { getTokenPrice } = useBalancesContext(); + + const token = new TokenUnit(item.value, item.maxDecimals, item.symbol); + const tokenPrice = getTokenPrice(item.symbol); + const contact = getAccount(item.label) ?? getContactByAddress(item.label); + + return ( + + + {contact?.name || truncateAddress(item.label)} + + + } + > + + + {token.toDisplay()} {token.getSymbol()} + + {tokenPrice ? ( + + {currencyFormatter( + tokenPrice * token.toDisplay({ asNumber: true }) + )} + + ) : null} + + + ); +}; + const CurrencyInfo = ({ item }: { item: CurrencyItem }) => { const { currencyFormatter } = useSettingsContext(); const { getTokenPrice } = useBalancesContext(); diff --git a/src/components/common/approval/TxDetailsRow.tsx b/src/components/common/approval/TxDetailsRow.tsx index 2f545ec35..6a4d3f566 100644 --- a/src/components/common/approval/TxDetailsRow.tsx +++ b/src/components/common/approval/TxDetailsRow.tsx @@ -1,6 +1,7 @@ import { Stack, Typography, useTheme } from '@avalabs/core-k2-components'; +import React from 'react'; -type TxDetailsRowProps = { label: string }; +type TxDetailsRowProps = { label: string | React.ReactNode }; export const TxDetailsRow: React.FC = ({ children, @@ -17,9 +18,13 @@ export const TxDetailsRow: React.FC = ({ gap: 1, }} > - - {label} - + {typeof label === 'string' ? ( + + {label} + + ) : ( + label + )} ; updateContact(contact: Contact): Promise; getContactById(contactId: string): Contact | undefined; + getContactByAddress(address: string): Contact | undefined; }; const ContactsContext = createContext({} as any); @@ -76,6 +83,16 @@ export function ContactsContextProvider({ children }: { children: any }) { }); } + const getContactByAddress = useCallback( + (lookupAddress: string) => + contacts.contacts.find(({ address, addressBTC, addressXP }) => + [address, addressBTC, addressXP] + .map((a) => (a ?? '').toLowerCase()) + .includes(lookupAddress) + ), + [contacts.contacts] + ); + return ( {children} diff --git a/src/pages/ApproveAction/GenericApprovalScreen.tsx b/src/pages/ApproveAction/GenericApprovalScreen.tsx index aaa4f3067..cd8187cd7 100644 --- a/src/pages/ApproveAction/GenericApprovalScreen.tsx +++ b/src/pages/ApproveAction/GenericApprovalScreen.tsx @@ -53,6 +53,10 @@ export function GenericApprovalScreen() { }); const { displayData, context } = action ?? {}; + const hasFeeSelector = action?.displayData.networkFeeSelector; + const isFeeValid = + !hasFeeSelector || + (!feeError && !isCalculatingFee && hasEnoughForNetworkFee); useEffect(() => { if (!displayData?.network?.chainId) { @@ -147,15 +151,15 @@ export function GenericApprovalScreen() { )} + {sectionIndex === 0 && network && ( + + )} {section.items.map((item, index) => ( ))} - {sectionIndex === 0 && network && ( - - )} ))} @@ -210,9 +214,7 @@ export function GenericApprovalScreen() { disabled={ !displayData || action.status === ActionStatus.SUBMITTING || - Boolean(feeError) || - isCalculatingFee || - !hasEnoughForNetworkFee + !isFeeValid } isLoading={ action.status === ActionStatus.SUBMITTING || isCalculatingFee diff --git a/src/pages/ApproveAction/hooks/useFeeCustomizer.tsx b/src/pages/ApproveAction/hooks/useFeeCustomizer.tsx index c7e902eaf..afbedacb5 100644 --- a/src/pages/ApproveAction/hooks/useFeeCustomizer.tsx +++ b/src/pages/ApproveAction/hooks/useFeeCustomizer.tsx @@ -48,6 +48,7 @@ export const useFeeCustomizer = ({ const [gasFeeModifier, setGasFeeModifier] = useState( GasFeeModifier.NORMAL ); + const isFeeSelectorEnabled = Boolean(action?.displayData.networkFeeSelector); const tokens = useTokensWithBalances({ chainId: network?.chainId, @@ -59,6 +60,10 @@ export const useFeeCustomizer = ({ ) as NetworkTokenWithBalance | null; const signingData = useMemo(() => { + if (!isFeeSelectorEnabled) { + return undefined; + } + switch (action?.signingData?.type) { // Request types that we know may require a fee case RpcMethod.BITCOIN_SEND_TRANSACTION: @@ -69,11 +74,11 @@ export const useFeeCustomizer = ({ default: return undefined; } - }, [action]); + }, [action, isFeeSelectorEnabled]); const updateFee = useCallback( async (maxFeeRate: bigint, maxTipRate?: bigint) => { - if (!actionId) { + if (!actionId || !isFeeSelectorEnabled) { return; } @@ -87,7 +92,7 @@ export const useFeeCustomizer = ({ params: [actionId, newFeeConfig], }); }, - [actionId, request, signingData?.type] + [actionId, isFeeSelectorEnabled, request, signingData?.type] ); const getFeeInfo = useCallback((data: SigningData) => { @@ -136,7 +141,7 @@ export const useFeeCustomizer = ({ useEffect(() => { const nativeBalance = nativeToken?.balance; - if (!nativeBalance || !signingData) { + if (!nativeBalance || !signingData || !isFeeSelectorEnabled) { return; } @@ -148,7 +153,7 @@ export const useFeeCustomizer = ({ ? undefined : SendErrorMessage.INSUFFICIENT_BALANCE_FOR_FEE ); - }, [getFeeInfo, nativeToken?.balance, signingData]); + }, [getFeeInfo, isFeeSelectorEnabled, nativeToken?.balance, signingData]); const [maxFeePerGas, setMaxFeePerGas] = useState( getInitialFeeRate(signingData) @@ -158,14 +163,14 @@ export const useFeeCustomizer = ({ ); useEffect(() => { - if (!networkFee) { + if (!networkFee || !isFeeSelectorEnabled) { return; } // Initialize fee config with default values if they are not set at all setMaxFeePerGas((previous) => previous ?? networkFee.low.maxFee); setMaxPriorityFeePerGas((previous) => previous ?? networkFee.low.maxTip); - }, [networkFee]); + }, [networkFee, isFeeSelectorEnabled]); const setCustomFee = useCallback( (values: { @@ -183,7 +188,7 @@ export const useFeeCustomizer = ({ useEffect(() => { let isMounted = true; - if (!network) { + if (!network || !isFeeSelectorEnabled) { return; } // If the request comes from a dApp, a different network may be active, @@ -197,10 +202,10 @@ export const useFeeCustomizer = ({ return () => { isMounted = false; }; - }, [getNetworkFee, network]); + }, [getNetworkFee, isFeeSelectorEnabled, network]); useEffect(() => { - if (typeof maxFeePerGas === 'undefined') { + if (typeof maxFeePerGas === 'undefined' || !isFeeSelectorEnabled) { return; } @@ -225,7 +230,7 @@ export const useFeeCustomizer = ({ return () => { isMounted = false; }; - }, [maxFeePerGas, maxPriorityFeePerGas, updateFee]); + }, [isFeeSelectorEnabled, maxFeePerGas, maxPriorityFeePerGas, updateFee]); const renderFeeWidget = useCallback(() => { if (!networkFee || !signingData) { diff --git a/yarn.lock b/yarn.lock index b5a61e147..2731dce08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,20 +29,20 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@avalabs/avalanche-module@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.8.0.tgz#351638b9329cfdad66528414d4691b77fdf95158" - integrity sha512-htySDIDj0s91fNKQAb3krR62sKxtRhMTiFybp+PmxJka8B8phduwnvLL37ysQfG5cM8W4LOVGg6CnRXLjU3OyA== +"@avalabs/avalanche-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#5c0b71de3c1e8c44177b6e939d1633d339da1fc1" + integrity sha512-vYZjHzOMZ+We6GT7XG7w7tWSWZFjfNRkNer8CVzwrSCSth7EA7PrRYSG6vr0qb+3xgkoMdjxfDExQPZqtMn6jw== dependencies: "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-alpha.7" - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-etherscan-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" - "@avalabs/types" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.8.0" + "@avalabs/core-chains-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-etherscan-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bn.js "5.2.1" @@ -59,15 +59,15 @@ "@scure/base" "1.1.5" micro-eth-signer "0.7.2" -"@avalabs/bitcoin-module@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.8.0.tgz#ff96d03f5aad9370000710ef001e92ce21e96e0e" - integrity sha512-R50LqzGWOKas9TkEyeD0hK8V5gy1SHZ/b7isF5bb2N+B4ZL9rtOmEfwW5Lx7U+uUNL5BIO4B/LRSjP6KrI1uCQ== +"@avalabs/bitcoin-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#43d5b8ac5145655af4bc954f515d8486566d3c72" + integrity sha512-SYG4NnlZwgK4eI2MpN0WQJBOZXuV0aiYAmQIjg2IRJsFKLIlOT1GhUyPk5pwzd/1Eb2M33Z8kqYQ9/bDOvQBPg== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.8.0" + "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bitcoinjs-lib "5.2.0" @@ -86,42 +86,42 @@ viem "2.11.1" zod "3.23.8" -"@avalabs/core-bridge-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-bridge-sdk/-/core-bridge-sdk-3.1.0-alpha.7.tgz#71b67e425e4654c9755ea7777b3aeb77e8fe3a45" - integrity sha512-3FO8kpN4As/P8+gOMYdur+TifqGr9cHMyLWLCAGs0kKMm+N7hHEE/FC/sir5KEUsw6y0VJ8ONS8Scifj+KAZTg== +"@avalabs/core-bridge-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-bridge-sdk/-/core-bridge-sdk-3.1.0-canary.43ef750.0.tgz#4a82baad90c8a855c85e52409748ffcf01ad87d2" + integrity sha512-LYCS/TS1fVQEyzyuwlXROOSeCHLJghqmgiuC+62QOaMEd5aaRMyyNjXMGO+Jc1nmWdEtBeDVESY1c2aNTqBLAg== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" + "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-chains-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-alpha.7.tgz#b74aa60fdf2def52a2da8a028ffa67194e8ea060" - integrity sha512-kIbaY99ZQTMgUQ+rQBylxd/yNHAdzb2Bs6Nq2n0vA/1s6lS+abmjuAnEdmHQMtW09wNMxtU+GFbIQ1lZBX0EtA== +"@avalabs/core-chains-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-canary.43ef750.0.tgz#49aab766e4a5dedeac0f6283887f8cb27a7ca117" + integrity sha512-tvSioFbLG/H2/KRvuwYYht+Q1EjRjNuxhrVq/H1LosxB0jzx/ITVEAJxpBakYnMysBlZn7wtH1BV2ZXkZGpUaQ== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-coingecko-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-alpha.7.tgz#902069b2aa7bada639ffe660420ad422e67eeb06" - integrity sha512-saLLKlfzKnzyLyvh0Z0RAr8tn4KznMN1Y9a/MVNQiu18bglPkFf6eOFBXeh983msxpzQQMGA9Lk3Iit6tnZoEg== +"@avalabs/core-coingecko-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-canary.43ef750.0.tgz#ff250482e34438fb4e371c419e6f97895c9593c3" + integrity sha512-HX6Ss0SKXyNKbNrJuJC/JVyUs+Zk/UIKYf3cl9ff0VoymW4d6oBme+uH83GFLyBr3OLXWe+Lwt4GOegMAOh0lQ== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-covalent-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-covalent-sdk/-/core-covalent-sdk-3.1.0-alpha.7.tgz#3c8b7d4c23a50b42be8857470f6fe5ad4f1f9a59" - integrity sha512-+4y484/7iliMRDn4+RVxPn0tDLBl6a5ms04N/Hw+VSGkXCX6y2/stoNlCDYSczXwhWlnlHtPchjTYmA0Edlvpg== +"@avalabs/core-covalent-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-covalent-sdk/-/core-covalent-sdk-3.1.0-canary.43ef750.0.tgz#e11147ac3055868bf84a18d4d247a849cc434757" + integrity sha512-tGxinNeqq9XIoFewaEEms+IeviM6SpzK+VnHaQPrwS29EE8qx5p1v+UfoqgYXldw5RLBh4iEZ6Y9cC1HhBxyww== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-etherscan-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-alpha.7.tgz#eaefe7120527bce21c0574543a487c814b998f29" - integrity sha512-obHDRxqCUA3Pw7VSIHaAP37t6LMuoK02JS7Elh5u45p60Krb+ZQJqDPTBtaIupZdZ6KYXUSszyCmjcOKDTYQuQ== +"@avalabs/core-etherscan-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-canary.43ef750.0.tgz#2f69e78a000b72f854570a71a9ca35366cb63c34" + integrity sha512-mNf28ydSRbh4hfBcpGj844gNpgVFUOTBxiMucZFd15baja8y4Y4UjDt4Yk1lSbmQy3kvffi/qmakdC8mBlxgpA== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-k2-components@4.18.0-alpha.47": version "4.18.0-alpha.47" @@ -146,38 +146,38 @@ react-hotkeys-hook "4.4.3" uuid "9.0.1" -"@avalabs/core-snowtrace-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-snowtrace-sdk/-/core-snowtrace-sdk-3.1.0-alpha.7.tgz#41b1a0e14481af554853a5f66addafa04bd7c47d" - integrity sha512-/wFOMlVG1B+ksoQg7bRFMoeqRO6rLHKidcKbKITdik+sfKmefggTO10q+TTt4IJSdjgOMFEmozyVIMKqE/awcg== +"@avalabs/core-snowtrace-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-snowtrace-sdk/-/core-snowtrace-sdk-3.1.0-canary.43ef750.0.tgz#2d0041bc2b035bb07f48fb6ef0d9c70281cece35" + integrity sha512-hLN4k7CpSLrOxpdEw0oFcv29bNK+bxeKAjRBq3li69uINbj8ec5FcraUyi8VIofsp1DHAMeu6se1+fVQufgr3g== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-token-prices-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-token-prices-sdk/-/core-token-prices-sdk-3.1.0-alpha.7.tgz#666db0b4df6b16fe2d403dc12d26d92d8e956573" - integrity sha512-OQNarbUxme31tU7dK3jmbe7Kw5K8wb/x0oByJzDhc1960Riivuhihk/JvpKI2GQ5MdCo20m9XLHbF+5PoQF/sw== +"@avalabs/core-token-prices-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-token-prices-sdk/-/core-token-prices-sdk-3.1.0-canary.43ef750.0.tgz#60da36f4d4d2887698f2eb41b79e5302c1ce00ef" + integrity sha512-ip4J1VW8zR+4Viulpj/PqWI7Ka5b40jZU3zQfIk6yqyjXYFkhoXp88XV+OID+1o8ODrGcfSAHuqNglmwujFEXw== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" + "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" -"@avalabs/core-utils-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-alpha.7.tgz#6e26e275e6594d644dae8e11407988f25ad1f369" - integrity sha512-INofye+10AIk6NfvMhj2pbxoqwHmj2uBNyFibk9Vm6zh61+Y+IX2D9lpdEDVwYztmHt4Cq7aLvIM5w+nlj3w0w== +"@avalabs/core-utils-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-canary.43ef750.0.tgz#3370343f61a67c05d16420e9f4950b421b323e7c" + integrity sha512-4vXHEo3wvtiBIaLQlbu5sac8FC/vxXl0NJ/aCtHtdIcWSfopk1PVWKVBdyILRAWQ/UCw1nP/mmabj+TeXNLepg== dependencies: "@avalabs/avalanchejs" "4.0.5" "@hpke/core" "1.2.5" is-ipfs "6.0.2" -"@avalabs/core-wallets-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-alpha.7.tgz#b600bdc1f0cd43288f6eebb260db89337cccbb67" - integrity sha512-2U25KIGvdMnCp2B9W2N1qPQ7zNKPvCxO6MmMN/s8+3lq/fE6ZRM8Qq38I3Axmx1sfVATAeAg9qsXx6I3FtabwQ== +"@avalabs/core-wallets-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-canary.43ef750.0.tgz#ddc863ba5512c02bcf14dbf914b300192feb21c4" + integrity sha512-X2XvxetV9LA2eWepOi8rDswm5F+SG/MHn9WkfiWmo+siNDWJlhc/5JpYR3R37ZHnUHgQgZ6jvwsW1FL2r+NCZw== dependencies: "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" + "@avalabs/core-chains-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/hw-app-avalanche" "0.14.1" "@ledgerhq/hw-app-btc" "10.2.4" "@ledgerhq/hw-app-eth" "6.36.1" @@ -194,18 +194,18 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/evm-module@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.8.0.tgz#fec3a4db15980ca5b8647b3f901f1d01a03a5a4f" - integrity sha512-jrYAhOmPebc5uEh6tFBEL2q4iFaKxO06nNV8F0s8krE98vXPDDF61Jr4HO9V0XiEKXx7Znsk2Z11hZAZUFjUdg== - dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-etherscan-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" - "@avalabs/types" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.8.0" +"@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#ed3113a24c117bae8567b6c8eb79df3bd8cedb7f" + integrity sha512-BQzTARyh0XK3q7sgwHQ8mAd98XJM+RQRqdxDtLF/GU/+nMQ7yNogWhCbsMO98+d+a6MkNVIPGSLBZ7tjS3IO7Q== + dependencies: + "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-etherscan-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" "@blockaid/client" "0.11.0" "@metamask/rpc-errors" "6.3.0" "@openzeppelin/contracts" "4.9.6" @@ -214,10 +214,10 @@ xss "1.0.13" zod "3.23.8" -"@avalabs/glacier-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-alpha.7.tgz#f7de8a09f9e26b0a789a5e6b50cc7ddcba873f0f" - integrity sha512-kcPm4zDyekJSboq5qs/mhRPQ/eiuQpsWRwT2/cPFoZWpjVOO+a1dnJyg9+fElkfiKg92bS38MlTQ1DWnoNioiQ== +"@avalabs/glacier-sdk@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-canary.43ef750.0.tgz#2d326e692976867565d80cd5e959483da7cb7662" + integrity sha512-6/PSGc4NWL+Avbk4Pbai592FPiv379mS0lvgKb2uM5u8+gt7YVhAWFoiBSItFAW2yFKYK5M0IsrZGCj6pZYkEA== "@avalabs/hw-app-avalanche@0.14.1": version "0.14.1" @@ -235,18 +235,18 @@ resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.3.tgz#3b7fb8cb8e2f124e0b11406788a903142753b5a0" integrity sha512-WN6NyPsF9XpmQp2SN4UbwjBT+XYH8di8gvL9rppQxz4d43xRLI1T2WVt/LXJgYdOauhuaSelb6zB4yNqGyKutQ== -"@avalabs/types@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.7.tgz#c93ac3d5551001d9187040cd1adaf504512ee238" - integrity sha512-7s38LcB09QMx0fzd4/mb7nFcSPexiMsjx+vvdm0uDFpcwMTt0MgADQLgEpfUFfAMUMrm8QOTrRd6nWsuY9Om3Q== +"@avalabs/types@3.1.0-canary.43ef750.0+43ef750": + version "3.1.0-canary.43ef750.0" + resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-canary.43ef750.0.tgz#abe0035b19e23e2a3c2097dfd67afb3fb7c86ede" + integrity sha512-buSH4wOTH+V8+3Zb6K07eatN5QO4teziNZQmXEoDg103jthXGQJubfnF6AHOqQ4ebBw7VHY8sdiuzuuDliR3sQ== -"@avalabs/vm-module-types@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.8.0.tgz#aea593b7f6ae422090e278e8fb99c94a0436106f" - integrity sha512-L6BlU/3GqoAxgXzoP1HrEFknattNcFQ3p1/a7hKldn41/tflBaWJl80lTlcpfe/LMPkP007mtNWh8ADvRogwgg== +"@avalabs/vm-module-types@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#836ab59a31ac7072861fda4b461827a13b314d68" + integrity sha512-P6J7eNi2CT6HX3fVwokXt30TIDWaWFch6urgRQ73b/Z3yO+uSgp6eTrezpaBrGpvPmFiDauRzjrA94BhS5E9tA== dependencies: - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" + "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" "@metamask/rpc-errors" "6.3.0" bitcoinjs-lib "5.2.0" zod "3.23.8" From 727961a19067627b645d7bb217d1e61ca2d42cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Fri, 11 Oct 2024 14:48:33 +0200 Subject: [PATCH 11/20] chore: type fixes --- package.json | 8 ++-- .../common/approval/TransactionDetailItem.tsx | 2 +- src/pages/Bridge/Bridge.tsx | 2 +- src/pages/Bridge/components/BridgeForm.tsx | 2 +- .../Bridge/components/BridgeFormUnified.tsx | 2 +- src/pages/Bridge/hooks/useBridge.ts | 7 ++-- src/pages/Bridge/hooks/useUnifiedBridge.ts | 2 +- .../Bridge/utils/blockchainConversion.test.ts | 23 +++++------ .../Bridge/utils/blockchainConversion.ts | 8 ++-- yarn.lock | 38 +++++++++---------- 10 files changed, 49 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index 4c13d7afa..38465b069 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "sentry": "node sentryscript.js" }, "dependencies": { - "@avalabs/avalanche-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", + "@avalabs/avalanche-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", "@avalabs/avalanchejs": "4.0.5", - "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", + "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", "@avalabs/core-bridge-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-chains-sdk": "3.1.0-canary.43ef750.0+43ef750", @@ -37,11 +37,11 @@ "@avalabs/core-token-prices-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-utils-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-wallets-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", + "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", "@avalabs/glacier-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.3", - "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241011064558", + "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", "@blockaid/client": "0.10.0", "@coinbase/cbpay-js": "1.6.0", "@cubist-labs/cubesigner-sdk": "0.3.28", diff --git a/src/components/common/approval/TransactionDetailItem.tsx b/src/components/common/approval/TransactionDetailItem.tsx index efc50ef8f..ff0790933 100644 --- a/src/components/common/approval/TransactionDetailItem.tsx +++ b/src/components/common/approval/TransactionDetailItem.tsx @@ -113,7 +113,7 @@ const FundsRecipientInfo = ({ item }: { item: FundsRecipientItem }) => { const { getAccount } = useAccountsContext(); const { getTokenPrice } = useBalancesContext(); - const token = new TokenUnit(item.value, item.maxDecimals, item.symbol); + const token = new TokenUnit(item.amount, item.maxDecimals, item.symbol); const tokenPrice = getTokenPrice(item.symbol); const contact = getAccount(item.label) ?? getContactByAddress(item.label); diff --git a/src/pages/Bridge/Bridge.tsx b/src/pages/Bridge/Bridge.tsx index 6c4f017a0..39d586f57 100644 --- a/src/pages/Bridge/Bridge.tsx +++ b/src/pages/Bridge/Bridge.tsx @@ -255,7 +255,7 @@ export function Bridge() { setNetwork(blockChainNetwork); const assetAddressOnOppositeChain = getAssetIdentifierOnTargetChain( currentAsset, - blockChainNetwork.chainId + blockChainNetwork.caipId ); setCurrentAssetIdentifier(assetAddressOnOppositeChain); diff --git a/src/pages/Bridge/components/BridgeForm.tsx b/src/pages/Bridge/components/BridgeForm.tsx index cd799f912..ae068dbf6 100644 --- a/src/pages/Bridge/components/BridgeForm.tsx +++ b/src/pages/Bridge/components/BridgeForm.tsx @@ -383,7 +383,7 @@ export const BridgeForm = ({ if (blockChainNetwork) { const assetAddressOnOppositeChain = getAssetIdentifierOnTargetChain( currentAsset, - blockChainNetwork.chainId + blockChainNetwork.caipId ); setCurrentAssetIdentifier(assetAddressOnOppositeChain); diff --git a/src/pages/Bridge/components/BridgeFormUnified.tsx b/src/pages/Bridge/components/BridgeFormUnified.tsx index 7e5bc04fb..54fd7b160 100644 --- a/src/pages/Bridge/components/BridgeFormUnified.tsx +++ b/src/pages/Bridge/components/BridgeFormUnified.tsx @@ -10,7 +10,7 @@ type BridgeFormUnifiedProps = Omit< keyof ReturnType | 'onTransfer' | 'isPending' > & { amount: Big; - targetChainId: number; + targetChainId: string; currentAssetIdentifier?: string; onInitiated: () => void; diff --git a/src/pages/Bridge/hooks/useBridge.ts b/src/pages/Bridge/hooks/useBridge.ts index 4f87d9e72..6b3535ebd 100644 --- a/src/pages/Bridge/hooks/useBridge.ts +++ b/src/pages/Bridge/hooks/useBridge.ts @@ -15,6 +15,7 @@ import { useUnifiedBridgeContext } from '@src/contexts/UnifiedBridgeProvider'; import { useNetworkContext } from '@src/contexts/NetworkProvider'; import { ChainId } from '@avalabs/core-chains-sdk'; import { BridgeStepDetails } from '@avalabs/bridge-unified'; +import { chainIdToCaip } from '@src/utils/caipConversion'; export interface BridgeAdapter { address?: string; @@ -49,7 +50,7 @@ interface Bridge { bridgeFee: Big; provider: BridgeProviders; minimum: Big; - targetChainId: number; + targetChainId: string; } export enum BridgeProviders { @@ -97,10 +98,10 @@ export function useBridge(currentAssetIdentifier?: string): Bridge { setAmount, minimum, bridgeFee, - targetChainId, + targetChainId: chainIdToCaip(targetChainId), provider: currentAssetIdentifier && - supportsAsset(currentAssetIdentifier, targetChainId) + supportsAsset(currentAssetIdentifier, chainIdToCaip(targetChainId)) ? BridgeProviders.Unified : BridgeProviders.Avalanche, }; diff --git a/src/pages/Bridge/hooks/useUnifiedBridge.ts b/src/pages/Bridge/hooks/useUnifiedBridge.ts index 835ff5e9a..730b9b2ae 100644 --- a/src/pages/Bridge/hooks/useUnifiedBridge.ts +++ b/src/pages/Bridge/hooks/useUnifiedBridge.ts @@ -23,7 +23,7 @@ import { useAnalyticsContext } from '@src/contexts/AnalyticsProvider'; */ export function useUnifiedBridge( amount: Big, - targetChainId: number, + targetChainId: string, currentAssetIdentifier?: string ): BridgeAdapter { const { diff --git a/src/pages/Bridge/utils/blockchainConversion.test.ts b/src/pages/Bridge/utils/blockchainConversion.test.ts index 4e7b7a1f7..71e7f00cb 100644 --- a/src/pages/Bridge/utils/blockchainConversion.test.ts +++ b/src/pages/Bridge/utils/blockchainConversion.test.ts @@ -1,10 +1,11 @@ -import { ChainId, Network, NetworkVMType } from '@avalabs/core-chains-sdk'; +import { ChainId, NetworkVMType } from '@avalabs/core-chains-sdk'; import { blockchainToNetwork, networkToBlockchain, } from './blockchainConversion'; import { Blockchain, BridgeConfig } from '@avalabs/core-bridge-sdk'; import { t } from 'i18next'; +import { decorateWithCaipId } from '@src/utils/caipConversion'; jest.mock('i18next', () => ({ t: jest.fn(), @@ -12,7 +13,7 @@ jest.mock('i18next', () => ({ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { const btcSymbol = 'BTC'; - const mockBTCNetwork: Network = { + const mockBTCNetwork = decorateWithCaipId({ chainName: 'BTC network', chainId: ChainId.BITCOIN, vmName: NetworkVMType.BITCOIN, @@ -26,8 +27,8 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { logoUri: 'https://www.test.com/token/logo', }, logoUri: 'https://www.test.com/network/logo', - }; - const mockBTCTestnetNetwork: Network = { + }); + const mockBTCTestnetNetwork = decorateWithCaipId({ chainName: 'BTC testnet', chainId: ChainId.BITCOIN_TESTNET, vmName: NetworkVMType.BITCOIN, @@ -41,9 +42,9 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { logoUri: 'https://www.test1.com/token/logo', }, logoUri: 'https://www.test1.com/network/logo', - }; + }); - const mockAvalancheNetwork: Network = { + const mockAvalancheNetwork = decorateWithCaipId({ chainName: 'Avalanche', chainId: ChainId.AVALANCHE_MAINNET_ID, vmName: NetworkVMType.EVM, @@ -57,9 +58,9 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { logoUri: 'https://www.test2.com/token/logo', }, logoUri: 'https://www.test2.com/network/logo', - }; + }); - const mockEthereumNetwork: Network = { + const mockEthereumNetwork = decorateWithCaipId({ chainName: 'Ethereum', chainId: ChainId.ETHEREUM_HOMESTEAD, vmName: NetworkVMType.EVM, @@ -73,7 +74,7 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { logoUri: 'https://www.test3.com/token/logo', }, logoUri: 'https://www.test3.com/network/logo', - }; + }); const mockedNetworks = [ mockBTCNetwork, mockBTCTestnetNetwork, @@ -256,7 +257,7 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { }); describe('blockchainToNetwork', () => { - const baseNetwork = { + const baseNetwork = decorateWithCaipId({ chainName: 'chainName', chainId: ChainId.AVALANCHE_MAINNET_ID, vmName: NetworkVMType.EVM, @@ -270,7 +271,7 @@ describe('src/pages/Bridge/utils/blockchainConversion.ts', () => { logoUri: 'https://www.test10.com/token/logo', }, logoUri: 'https://www.test10.com/network/logo', - }; + }); it('should return AVALANCHE if network is AVALANCHE_MAINNET_ID', () => { const result = networkToBlockchain(baseNetwork); expect(result).toEqual(Blockchain.AVALANCHE); diff --git a/src/pages/Bridge/utils/blockchainConversion.ts b/src/pages/Bridge/utils/blockchainConversion.ts index 463a873ff..4b52a0b64 100644 --- a/src/pages/Bridge/utils/blockchainConversion.ts +++ b/src/pages/Bridge/utils/blockchainConversion.ts @@ -1,13 +1,13 @@ import { Blockchain, BridgeConfig } from '@avalabs/core-bridge-sdk'; import { Chain } from '@avalabs/bridge-unified'; import { ChainId } from '@avalabs/core-chains-sdk'; -import { Network } from '@src/background/services/network/models'; +import { NetworkWithCaipId } from '@src/background/services/network/models'; import { caipToChainId } from '@src/utils/caipConversion'; import { t } from 'i18next'; export const blockchainToNetwork = ( blockChain: Blockchain | Chain, - networks: Network[], + networks: NetworkWithCaipId[], bridgeConfig: BridgeConfig, isTestnet?: boolean ) => { @@ -55,7 +55,9 @@ export const blockchainToNetwork = ( } }; -export const networkToBlockchain = (network: Network | Chain | undefined) => { +export const networkToBlockchain = ( + network: NetworkWithCaipId | Chain | undefined +) => { const chainId = typeof network?.chainId === 'string' ? caipToChainId(network.chainId) diff --git a/yarn.lock b/yarn.lock index 2731dce08..1366fbeb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,10 +29,10 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@avalabs/avalanche-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" - resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#5c0b71de3c1e8c44177b6e939d1633d339da1fc1" - integrity sha512-vYZjHzOMZ+We6GT7XG7w7tWSWZFjfNRkNer8CVzwrSCSth7EA7PrRYSG6vr0qb+3xgkoMdjxfDExQPZqtMn6jw== +"@avalabs/avalanche-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#749faee526879ace2f6cb167bd53bd745e87a78a" + integrity sha512-70f0GmTkDPV0gE6cx7avfHdtmciHL5DMnGQjCdr5H0Nod7LTp6nNsRDO1xK9YMdyNQEM1Qx+zl5NC5KYhZOgPA== dependencies: "@avalabs/avalanchejs" "4.0.5" "@avalabs/core-chains-sdk" "3.1.0-canary.43ef750.0+43ef750" @@ -42,7 +42,7 @@ "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bn.js "5.2.1" @@ -59,15 +59,15 @@ "@scure/base" "1.1.5" micro-eth-signer "0.7.2" -"@avalabs/bitcoin-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" - resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#43d5b8ac5145655af4bc954f515d8486566d3c72" - integrity sha512-SYG4NnlZwgK4eI2MpN0WQJBOZXuV0aiYAmQIjg2IRJsFKLIlOT1GhUyPk5pwzd/1Eb2M33Z8kqYQ9/bDOvQBPg== +"@avalabs/bitcoin-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#d92703c638af180c113166a297853a31778a8892" + integrity sha512-LsIbQ6LyKNBKKUoXcMUhZnK6yBVDDJ9/eeaYlxZr1nvCiMze6zuQNkvQxASEWqDXY/OWGmY7NA4+ffwEnObRSA== dependencies: "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bitcoinjs-lib "5.2.0" @@ -194,10 +194,10 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" - resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#ed3113a24c117bae8567b6c8eb79df3bd8cedb7f" - integrity sha512-BQzTARyh0XK3q7sgwHQ8mAd98XJM+RQRqdxDtLF/GU/+nMQ7yNogWhCbsMO98+d+a6MkNVIPGSLBZ7tjS3IO7Q== +"@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#c00474284e8606c6041ca2841ed2f87e8fa51cab" + integrity sha512-ZVUSuYWq+yislRwJSRuRtDx4FQvAMvUYPaxXsVFeNRJXH6ZBQhTvr4Hi9C55DUkeoYXnjGWBIftxPEWTk0VXTw== dependencies: "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-etherscan-sdk" "3.1.0-canary.43ef750.0+43ef750" @@ -205,7 +205,7 @@ "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" "@blockaid/client" "0.11.0" "@metamask/rpc-errors" "6.3.0" "@openzeppelin/contracts" "4.9.6" @@ -240,10 +240,10 @@ resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-canary.43ef750.0.tgz#abe0035b19e23e2a3c2097dfd67afb3fb7c86ede" integrity sha512-buSH4wOTH+V8+3Zb6K07eatN5QO4teziNZQmXEoDg103jthXGQJubfnF6AHOqQ4ebBw7VHY8sdiuzuuDliR3sQ== -"@avalabs/vm-module-types@0.0.0-feat-bitcoin--just-sign-tx-20241011064558": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011064558" - resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.0.0-feat-bitcoin--just-sign-tx-20241011064558.tgz#836ab59a31ac7072861fda4b461827a13b314d68" - integrity sha512-P6J7eNi2CT6HX3fVwokXt30TIDWaWFch6urgRQ73b/Z3yO+uSgp6eTrezpaBrGpvPmFiDauRzjrA94BhS5E9tA== +"@avalabs/vm-module-types@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": + version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#b03d9643f8c2fa1bc403b311ce3de9bec95d0573" + integrity sha512-NsIXahVqvZ/DtSFshNYWoun2sf0AqKYevW/QNbXXMquB7dJDIFZIRHlOyk/hZWf/UyUS3oeAdUnS70iHBdzlIg== dependencies: "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" From 186e7fd53a4af33037bb98426fce8a2e26e36953 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Fri, 11 Oct 2024 14:54:04 +0200 Subject: [PATCH 12/20] chore: types & test fixes --- src/background/services/history/HistoryService.test.ts | 7 +++++-- src/contexts/UnifiedBridgeProvider.test.tsx | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/background/services/history/HistoryService.test.ts b/src/background/services/history/HistoryService.test.ts index 36f578bf2..a6cdf3897 100644 --- a/src/background/services/history/HistoryService.test.ts +++ b/src/background/services/history/HistoryService.test.ts @@ -160,7 +160,7 @@ describe('src/background/services/history/HistoryService.ts', () => { }); expect(result).toEqual([ - { ...btcTxHistoryItem, bridgeAnalysis: { isBridgeTx: true } }, + { ...btcTxHistoryItem, bridgeAnalysis: { isBridgeTx: false } }, ]); }); it('should return results with an ETH bridge transaction', async () => { @@ -188,7 +188,10 @@ describe('src/background/services/history/HistoryService.ts', () => { expect(result).toEqual([ { ...txHistoryItem, - bridgeAnalysis: { isBridgeTx: true }, + bridgeAnalysis: { + bridgeType: BridgeType.AVALANCHE_EVM, + isBridgeTx: true, + }, from: ETHEREUM_ADDRESS, }, ]); diff --git a/src/contexts/UnifiedBridgeProvider.test.tsx b/src/contexts/UnifiedBridgeProvider.test.tsx index 40e15cf4a..753d1cd4f 100644 --- a/src/contexts/UnifiedBridgeProvider.test.tsx +++ b/src/contexts/UnifiedBridgeProvider.test.tsx @@ -80,18 +80,22 @@ describe('contexts/UnifiedBridgeProvider', () => { vmName: NetworkVMType.EVM, isTestnet: false, chainId: 43114, + caipId: 'eip155:43114', }; const ethereum = { vmName: NetworkVMType.EVM, isTestnet: false, chainId: 1, + caipId: 'eip155:1', }; const networkContext = { network: avalanche, getNetwork(chainId) { - return chainId === 43114 ? avalanche : ethereum; + return chainId === 43114 || chainId === 'eip155:43114' + ? avalanche + : ethereum; }, avalancheProvider: { waitForTransaction: jest.fn(), From 4e0dc09b66bdefea45691a55e186e38cedd9811d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Fri, 11 Oct 2024 15:02:12 +0200 Subject: [PATCH 13/20] chore: update translations --- src/localization/locales/en/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/localization/locales/en/translation.json b/src/localization/locales/en/translation.json index c42a345dc..e4624b680 100644 --- a/src/localization/locales/en/translation.json +++ b/src/localization/locales/en/translation.json @@ -720,7 +720,6 @@ "Select chain": "Select chain", "Select derivation path": "Select derivation path", "Select one of the available verification methods below to proceed.": "Select one of the available verification methods below to proceed.", - "Select target chain": "Select target chain", "Select the Core wallet.": "Select the Core wallet.", "Select the first word": "Select the first word", "Select the word that comes after": "Select the word that comes after", @@ -793,6 +792,7 @@ "Swap transaction succeeded! 🎉": "Swap transaction succeeded! 🎉", "Swiss Franc": "Swiss Franc", "Switch": "Switch", + "Switch to {{chainName}}": "Switch to {{chainName}}", "Switch to {{chainName}} Network?": "Switch to {{chainName}} Network?", "Switch to {{name}}?": "Switch to {{name}}?", "Symbol": "Symbol", @@ -895,7 +895,6 @@ "Try typing the information again or go back to the account manager.": "Try typing the information again or go back to the account manager.", "Turkish": "Turkish", "URI": "URI", - "USDC is routed through Circle's Cross-Chain Transfer Protocol. Bridge FAQs": "USDC is routed through Circle's Cross-Chain Transfer Protocol. Bridge FAQs", "Unable to connect. View the troubleshoot guide here": "Unable to connect. View the troubleshoot guide here", "Unable to connect?": "Unable to connect?", "Unable to set TOTP configuration": "Unable to set TOTP configuration", @@ -1028,5 +1027,6 @@ "{{functionName}} is currently unavailable.": "{{functionName}} is currently unavailable.", "{{length}} Bytes": "{{length}} Bytes", "{{name}} successfully removed!": "{{name}} successfully removed!", + "{{symbol}} is routed through {{bridgeName}}. Bridge FAQs": "{{symbol}} is routed through {{bridgeName}}. Bridge FAQs", "{{walletName}} Added": "{{walletName}} Added" } From 1f02da9ffe6e0d61c3edc234c9f2b480167888db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 15 Oct 2024 12:48:42 +0200 Subject: [PATCH 14/20] chore: update vm modules --- package.json | 8 +-- yarn.lock | 143 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 105 insertions(+), 46 deletions(-) diff --git a/package.json b/package.json index 38465b069..c17afc86f 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "sentry": "node sentryscript.js" }, "dependencies": { - "@avalabs/avalanche-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", + "@avalabs/avalanche-module": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", "@avalabs/avalanchejs": "4.0.5", - "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", + "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", "@avalabs/core-bridge-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-chains-sdk": "3.1.0-canary.43ef750.0+43ef750", @@ -37,11 +37,11 @@ "@avalabs/core-token-prices-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-utils-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/core-wallets-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", + "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", "@avalabs/glacier-sdk": "3.1.0-canary.43ef750.0+43ef750", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.3", - "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241011105402", + "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", "@blockaid/client": "0.10.0", "@coinbase/cbpay-js": "1.6.0", "@cubist-labs/cubesigner-sdk": "0.3.28", diff --git a/yarn.lock b/yarn.lock index 1366fbeb1..55f5870c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,20 +29,20 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@avalabs/avalanche-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" - resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#749faee526879ace2f6cb167bd53bd745e87a78a" - integrity sha512-70f0GmTkDPV0gE6cx7avfHdtmciHL5DMnGQjCdr5H0Nod7LTp6nNsRDO1xK9YMdyNQEM1Qx+zl5NC5KYhZOgPA== +"@avalabs/avalanche-module@0.0.0-feat-bitcoin--just-sign-tx-20241015101648": + version "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" + resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.0.0-feat-bitcoin--just-sign-tx-20241015101648.tgz#9878ec20618c306de2af56ce0f27aa6f6e3b5f3e" + integrity sha512-2wK48yAALq+cfoi/Y8df82LGlUPGgnG14WVKK3lMaT3ferQYyJAYf0klEH2e7i/lCmpfEK/+juuZUMCImtrF4Q== dependencies: "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-etherscan-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + "@avalabs/core-chains-sdk" "3.1.0-alpha.8" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-etherscan-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" + "@avalabs/types" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bn.js "5.2.1" @@ -59,15 +59,15 @@ "@scure/base" "1.1.5" micro-eth-signer "0.7.2" -"@avalabs/bitcoin-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" - resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#d92703c638af180c113166a297853a31778a8892" - integrity sha512-LsIbQ6LyKNBKKUoXcMUhZnK6yBVDDJ9/eeaYlxZr1nvCiMze6zuQNkvQxASEWqDXY/OWGmY7NA4+ffwEnObRSA== +"@avalabs/bitcoin-module@0.0.0-feat-bitcoin--just-sign-tx-20241015101648": + version "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" + resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.0.0-feat-bitcoin--just-sign-tx-20241015101648.tgz#b073a05bdc974e8a7d8fca1c99dfa963df0b37ef" + integrity sha512-EZLh8/yWtQkrrTQ2e28qawsUXFyTIbB/kfCYhdOHvEc1pkojBeE+yDGccibfmXVRCR0wbxQJxSt7YhkB2mM5bQ== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bitcoinjs-lib "5.2.0" @@ -95,6 +95,13 @@ "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" +"@avalabs/core-chains-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-alpha.8.tgz#ae9505709ec61eac47edad1c1a7941d4a16da984" + integrity sha512-wY0U5iECTrXY4c5BWeg706A+Sevniy80yLrW6BMtfUPunstxJ5mnjj0i0YT5ULNxWx4C+goqIGnhH5Myso1F3g== + dependencies: + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-chains-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-canary.43ef750.0.tgz#49aab766e4a5dedeac0f6283887f8cb27a7ca117" @@ -102,6 +109,13 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" +"@avalabs/core-coingecko-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-alpha.8.tgz#5fb89fc368b91791731b8990b2b663d53c5fa9cc" + integrity sha512-aGclorlDR6pDCZgj+Ref0GSWTbKwbMw6A5tIyb251OT5PBci7SYUM//EsOqce6mMTTP265mycQDe1Q7rMIvaXg== + dependencies: + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-coingecko-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-canary.43ef750.0.tgz#ff250482e34438fb4e371c419e6f97895c9593c3" @@ -116,6 +130,13 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" +"@avalabs/core-etherscan-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-alpha.8.tgz#6bf3610223434fa13082cfb4c1fa34cdc8fe8558" + integrity sha512-1g5GDw+8Zl3DhN8vdd8yqpveUpLoFkjxNR6aD7Bj4nJiJ14xc8Y94FLQ3BKH+hS3/hfAX065XFhlmvvW9LwEew== + dependencies: + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-etherscan-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-canary.43ef750.0.tgz#2f69e78a000b72f854570a71a9ca35366cb63c34" @@ -161,6 +182,15 @@ "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" +"@avalabs/core-utils-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-alpha.8.tgz#0d20dcc3950c8c6607b28d50217e7ece93eb2ab7" + integrity sha512-LMfhCz8V/g+7kVF0vyw7LbavIQLO3youQXaduobkGUe/hs378iBrh7VmqcdZJpGtJBO11p8+JlDOxRP2DZvYAw== + dependencies: + "@avalabs/avalanchejs" "4.0.5" + "@hpke/core" "1.2.5" + is-ipfs "6.0.2" + "@avalabs/core-utils-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-canary.43ef750.0.tgz#3370343f61a67c05d16420e9f4950b421b323e7c" @@ -170,6 +200,30 @@ "@hpke/core" "1.2.5" is-ipfs "6.0.2" +"@avalabs/core-wallets-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-alpha.8.tgz#52b91cc31f98e14f0e256d43bda11e6431f0df5a" + integrity sha512-wJaTbUqMIEOJf3gptsU+DiIpoVKiQcJ6FXNwmuTgi8ad+7zDdAF/u/KPT98oXn/Qzu0AeKXwjVwIs3fMrMzalQ== + dependencies: + "@avalabs/avalanchejs" "4.0.5" + "@avalabs/core-chains-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" + "@avalabs/hw-app-avalanche" "0.14.1" + "@ledgerhq/hw-app-btc" "10.2.4" + "@ledgerhq/hw-app-eth" "6.36.1" + "@ledgerhq/hw-transport" "6.30.6" + "@metamask/eth-sig-util" "7.0.2" + "@openzeppelin/contracts" "4.9.6" + bip32 "2.0.6" + bip32-path "0.4.2" + bip39 "3.0.4" + bitcoinjs-lib "5.2.0" + coinselect "3.1.13" + create-hash "1.2.0" + hdkey "2.0.1" + ledger-bitcoin "0.2.3" + xss "1.0.14" + "@avalabs/core-wallets-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-canary.43ef750.0.tgz#ddc863ba5512c02bcf14dbf914b300192feb21c4" @@ -194,18 +248,18 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" - resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#c00474284e8606c6041ca2841ed2f87e8fa51cab" - integrity sha512-ZVUSuYWq+yislRwJSRuRtDx4FQvAMvUYPaxXsVFeNRJXH6ZBQhTvr4Hi9C55DUkeoYXnjGWBIftxPEWTk0VXTw== - dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-etherscan-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/types" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" +"@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241015101648": + version "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" + resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241015101648.tgz#bd50d6e659325e81bfbbedf396e9ace8db1e9e08" + integrity sha512-wuCuE5G9B515ACf0hnTYSNCkYfTXDKk3xJoBwUYL2PWWaDaHOxVwHBtjCtXRVBlYggg+CDsCisRoSdqY+/UJqA== + dependencies: + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-etherscan-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" + "@avalabs/types" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" "@blockaid/client" "0.11.0" "@metamask/rpc-errors" "6.3.0" "@openzeppelin/contracts" "4.9.6" @@ -214,6 +268,11 @@ xss "1.0.13" zod "3.23.8" +"@avalabs/glacier-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-alpha.8.tgz#4bd974504dc19fcf63b89e11846d3c00aeda8e79" + integrity sha512-fCrrookWmWYCND1sA6PoM3wl+7Eh76UR70gfZfXPSgoGDZkkExjodYK+YxVq0yttaBCJxMP8+1M/LzyKog8dUw== + "@avalabs/glacier-sdk@3.1.0-canary.43ef750.0+43ef750": version "3.1.0-canary.43ef750.0" resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-canary.43ef750.0.tgz#2d326e692976867565d80cd5e959483da7cb7662" @@ -235,18 +294,18 @@ resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.3.tgz#3b7fb8cb8e2f124e0b11406788a903142753b5a0" integrity sha512-WN6NyPsF9XpmQp2SN4UbwjBT+XYH8di8gvL9rppQxz4d43xRLI1T2WVt/LXJgYdOauhuaSelb6zB4yNqGyKutQ== -"@avalabs/types@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-canary.43ef750.0.tgz#abe0035b19e23e2a3c2097dfd67afb3fb7c86ede" - integrity sha512-buSH4wOTH+V8+3Zb6K07eatN5QO4teziNZQmXEoDg103jthXGQJubfnF6AHOqQ4ebBw7VHY8sdiuzuuDliR3sQ== +"@avalabs/types@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.8.tgz#45c31261cd358baa6aa252c0ee7933aa93401f4d" + integrity sha512-yKf4aFS8JORV+5KwHPM27+1iBVogS9Tn26bHHW07TYyewUYlDTjYRljHSNpAfQcf0ElWubjK7NQcjKXpYgAlxg== -"@avalabs/vm-module-types@0.0.0-feat-bitcoin--just-sign-tx-20241011105402": - version "0.0.0-feat-bitcoin--just-sign-tx-20241011105402" - resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.0.0-feat-bitcoin--just-sign-tx-20241011105402.tgz#b03d9643f8c2fa1bc403b311ce3de9bec95d0573" - integrity sha512-NsIXahVqvZ/DtSFshNYWoun2sf0AqKYevW/QNbXXMquB7dJDIFZIRHlOyk/hZWf/UyUS3oeAdUnS70iHBdzlIg== +"@avalabs/vm-module-types@0.0.0-feat-bitcoin--just-sign-tx-20241015101648": + version "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" + resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.0.0-feat-bitcoin--just-sign-tx-20241015101648.tgz#4d75f6a13532fa0257975f00a6ef606544196e1d" + integrity sha512-c4+2tAKia18cYesA2NYx2Bng0TBGfd7drAVapmrha5etO0590cap9z3mHApPsyR2QVbRblHLGnFvbLj7jOWIyQ== dependencies: - "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" "@metamask/rpc-errors" "6.3.0" bitcoinjs-lib "5.2.0" zod "3.23.8" From 9494ed4122004e0561518c3c22cebe6697050deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 15 Oct 2024 13:17:42 +0200 Subject: [PATCH 15/20] chore: update sdks, disable Avalanche Bridge for now --- package.json | 20 ++-- .../unifiedBridge/UnifiedBridgeService.ts | 5 +- src/contexts/UnifiedBridgeProvider.tsx | 8 +- yarn.lock | 105 ++++-------------- 4 files changed, 43 insertions(+), 95 deletions(-) diff --git a/package.json b/package.json index c17afc86f..678b88698 100644 --- a/package.json +++ b/package.json @@ -27,18 +27,18 @@ "@avalabs/avalanchejs": "4.0.5", "@avalabs/bitcoin-module": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", - "@avalabs/core-bridge-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-chains-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-coingecko-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-covalent-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-etherscan-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-bridge-sdk": "3.1.0-alpha.8", + "@avalabs/core-chains-sdk": "3.1.0-alpha.8", + "@avalabs/core-coingecko-sdk": "3.1.0-alpha.8", + "@avalabs/core-covalent-sdk": "3.1.0-alpha.8", + "@avalabs/core-etherscan-sdk": "3.1.0-alpha.8", "@avalabs/core-k2-components": "4.18.0-alpha.47", - "@avalabs/core-snowtrace-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-token-prices-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-utils-sdk": "3.1.0-canary.43ef750.0+43ef750", - "@avalabs/core-wallets-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/core-snowtrace-sdk": "3.1.0-alpha.8", + "@avalabs/core-token-prices-sdk": "3.1.0-alpha.8", + "@avalabs/core-utils-sdk": "3.1.0-alpha.8", + "@avalabs/core-wallets-sdk": "3.1.0-alpha.8", "@avalabs/evm-module": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", - "@avalabs/glacier-sdk": "3.1.0-canary.43ef750.0+43ef750", + "@avalabs/glacier-sdk": "3.1.0-alpha.8", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.3", "@avalabs/vm-module-types": "0.0.0-feat-bitcoin--just-sign-tx-20241015101648", diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.ts index 42510380a..e1caadbc4 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.ts @@ -111,7 +111,10 @@ export class UnifiedBridgeService implements OnStorageReady { } #getDisabledBridges(): BridgeType[] { - const bridges: BridgeType[] = []; + const bridges: BridgeType[] = [ + BridgeType.ICTT_ERC20_ERC20, + BridgeType.AVALANCHE_EVM, + ]; if (!this.#flagStates[FeatureGates.UNIFIED_BRIDGE_CCTP]) { bridges.push(BridgeType.CCTP); diff --git a/src/contexts/UnifiedBridgeProvider.tsx b/src/contexts/UnifiedBridgeProvider.tsx index 11d182f7d..27112e659 100644 --- a/src/contexts/UnifiedBridgeProvider.tsx +++ b/src/contexts/UnifiedBridgeProvider.tsx @@ -134,8 +134,12 @@ export function UnifiedBridgeProvider({ const disabledBridgeTypes = useMemo( () => isCCTPDisabled - ? [BridgeType.CCTP, BridgeType.ICTT_ERC20_ERC20] - : [BridgeType.ICTT_ERC20_ERC20], + ? [ + BridgeType.CCTP, + BridgeType.ICTT_ERC20_ERC20, + BridgeType.AVALANCHE_EVM, + ] + : [BridgeType.AVALANCHE_EVM, BridgeType.ICTT_ERC20_ERC20], [isCCTPDisabled] ); diff --git a/yarn.lock b/yarn.lock index 55f5870c6..68f39fdfa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -86,14 +86,14 @@ viem "2.11.1" zod "3.23.8" -"@avalabs/core-bridge-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-bridge-sdk/-/core-bridge-sdk-3.1.0-canary.43ef750.0.tgz#4a82baad90c8a855c85e52409748ffcf01ad87d2" - integrity sha512-LYCS/TS1fVQEyzyuwlXROOSeCHLJghqmgiuC+62QOaMEd5aaRMyyNjXMGO+Jc1nmWdEtBeDVESY1c2aNTqBLAg== +"@avalabs/core-bridge-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-bridge-sdk/-/core-bridge-sdk-3.1.0-alpha.8.tgz#3cc5eb67db12772ddab17d74f0c20d9cc31ffa32" + integrity sha512-y1RG6wrLm9Zp9L5lKvrIAiRBt/L7/w82Doij0tLHp4yiJOd4epwzaaa+9BVcuHvnUttR3gHywTZ7SRqHjxmsOQ== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-wallets-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" "@avalabs/core-chains-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" @@ -102,13 +102,6 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-chains-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-canary.43ef750.0.tgz#49aab766e4a5dedeac0f6283887f8cb27a7ca117" - integrity sha512-tvSioFbLG/H2/KRvuwYYht+Q1EjRjNuxhrVq/H1LosxB0jzx/ITVEAJxpBakYnMysBlZn7wtH1BV2ZXkZGpUaQ== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-coingecko-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-alpha.8.tgz#5fb89fc368b91791731b8990b2b663d53c5fa9cc" @@ -116,19 +109,12 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-coingecko-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-canary.43ef750.0.tgz#ff250482e34438fb4e371c419e6f97895c9593c3" - integrity sha512-HX6Ss0SKXyNKbNrJuJC/JVyUs+Zk/UIKYf3cl9ff0VoymW4d6oBme+uH83GFLyBr3OLXWe+Lwt4GOegMAOh0lQ== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - -"@avalabs/core-covalent-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-covalent-sdk/-/core-covalent-sdk-3.1.0-canary.43ef750.0.tgz#e11147ac3055868bf84a18d4d247a849cc434757" - integrity sha512-tGxinNeqq9XIoFewaEEms+IeviM6SpzK+VnHaQPrwS29EE8qx5p1v+UfoqgYXldw5RLBh4iEZ6Y9cC1HhBxyww== +"@avalabs/core-covalent-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-covalent-sdk/-/core-covalent-sdk-3.1.0-alpha.8.tgz#00506c64a5ead5a4b3a4a0c1b17e3673dc9a205a" + integrity sha512-kvvj8lupj6JokjjwFPRu5HBz6hnQPz35o6UKCSMZSce5BhMCoAN3Eggbv9y2f1ZiLhSfimaP37fF4u6GYYeatg== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" "@avalabs/core-etherscan-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" @@ -137,13 +123,6 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-etherscan-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-canary.43ef750.0.tgz#2f69e78a000b72f854570a71a9ca35366cb63c34" - integrity sha512-mNf28ydSRbh4hfBcpGj844gNpgVFUOTBxiMucZFd15baja8y4Y4UjDt4Yk1lSbmQy3kvffi/qmakdC8mBlxgpA== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-k2-components@4.18.0-alpha.47": version "4.18.0-alpha.47" resolved "https://registry.yarnpkg.com/@avalabs/core-k2-components/-/core-k2-components-4.18.0-alpha.47.tgz#94d588cf109350fe57d246dbf36bc127a1fc0584" @@ -167,20 +146,20 @@ react-hotkeys-hook "4.4.3" uuid "9.0.1" -"@avalabs/core-snowtrace-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-snowtrace-sdk/-/core-snowtrace-sdk-3.1.0-canary.43ef750.0.tgz#2d0041bc2b035bb07f48fb6ef0d9c70281cece35" - integrity sha512-hLN4k7CpSLrOxpdEw0oFcv29bNK+bxeKAjRBq3li69uINbj8ec5FcraUyi8VIofsp1DHAMeu6se1+fVQufgr3g== +"@avalabs/core-snowtrace-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-snowtrace-sdk/-/core-snowtrace-sdk-3.1.0-alpha.8.tgz#1a91973bc60cd18ca70d859b06926f341c5b641f" + integrity sha512-GyU05WdNvIemjgbW8PgLqypHX30EFcMaFovUl+icQ2Jc7K9VdfGZSkbCJzYXV6aVh2zG7nLaR6np9icwbVGQdw== dependencies: - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-token-prices-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-token-prices-sdk/-/core-token-prices-sdk-3.1.0-canary.43ef750.0.tgz#60da36f4d4d2887698f2eb41b79e5302c1ce00ef" - integrity sha512-ip4J1VW8zR+4Viulpj/PqWI7Ka5b40jZU3zQfIk6yqyjXYFkhoXp88XV+OID+1o8ODrGcfSAHuqNglmwujFEXw== +"@avalabs/core-token-prices-sdk@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/core-token-prices-sdk/-/core-token-prices-sdk-3.1.0-alpha.8.tgz#4342e324c09b326f42c6c349e89005bbffc2a9e7" + integrity sha512-IGhMKtZdBidkVzG2h5mlip2TphildrMAxvQsVAXaXg0wt7EgwR204oNp4DIMX1rqS69UZQGJTG2ZUoIpF0LTnw== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/core-utils-sdk" "3.1.0-canary.43ef750.0+43ef750" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" "@avalabs/core-utils-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" @@ -191,15 +170,6 @@ "@hpke/core" "1.2.5" is-ipfs "6.0.2" -"@avalabs/core-utils-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-canary.43ef750.0.tgz#3370343f61a67c05d16420e9f4950b421b323e7c" - integrity sha512-4vXHEo3wvtiBIaLQlbu5sac8FC/vxXl0NJ/aCtHtdIcWSfopk1PVWKVBdyILRAWQ/UCw1nP/mmabj+TeXNLepg== - dependencies: - "@avalabs/avalanchejs" "4.0.5" - "@hpke/core" "1.2.5" - is-ipfs "6.0.2" - "@avalabs/core-wallets-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-alpha.8.tgz#52b91cc31f98e14f0e256d43bda11e6431f0df5a" @@ -224,30 +194,6 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/core-wallets-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-canary.43ef750.0.tgz#ddc863ba5512c02bcf14dbf914b300192feb21c4" - integrity sha512-X2XvxetV9LA2eWepOi8rDswm5F+SG/MHn9WkfiWmo+siNDWJlhc/5JpYR3R37ZHnUHgQgZ6jvwsW1FL2r+NCZw== - dependencies: - "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/glacier-sdk" "3.1.0-canary.43ef750.0+43ef750" - "@avalabs/hw-app-avalanche" "0.14.1" - "@ledgerhq/hw-app-btc" "10.2.4" - "@ledgerhq/hw-app-eth" "6.36.1" - "@ledgerhq/hw-transport" "6.30.6" - "@metamask/eth-sig-util" "7.0.2" - "@openzeppelin/contracts" "4.9.6" - bip32 "2.0.6" - bip32-path "0.4.2" - bip39 "3.0.4" - bitcoinjs-lib "5.2.0" - coinselect "3.1.13" - create-hash "1.2.0" - hdkey "2.0.1" - ledger-bitcoin "0.2.3" - xss "1.0.14" - "@avalabs/evm-module@0.0.0-feat-bitcoin--just-sign-tx-20241015101648": version "0.0.0-feat-bitcoin--just-sign-tx-20241015101648" resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.0.0-feat-bitcoin--just-sign-tx-20241015101648.tgz#bd50d6e659325e81bfbbedf396e9ace8db1e9e08" @@ -273,11 +219,6 @@ resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-alpha.8.tgz#4bd974504dc19fcf63b89e11846d3c00aeda8e79" integrity sha512-fCrrookWmWYCND1sA6PoM3wl+7Eh76UR70gfZfXPSgoGDZkkExjodYK+YxVq0yttaBCJxMP8+1M/LzyKog8dUw== -"@avalabs/glacier-sdk@3.1.0-canary.43ef750.0+43ef750": - version "3.1.0-canary.43ef750.0" - resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-canary.43ef750.0.tgz#2d326e692976867565d80cd5e959483da7cb7662" - integrity sha512-6/PSGc4NWL+Avbk4Pbai592FPiv379mS0lvgKb2uM5u8+gt7YVhAWFoiBSItFAW2yFKYK5M0IsrZGCj6pZYkEA== - "@avalabs/hw-app-avalanche@0.14.1": version "0.14.1" resolved "https://registry.yarnpkg.com/@avalabs/hw-app-avalanche/-/hw-app-avalanche-0.14.1.tgz#70b6248e67cf7d64d0640517f88c19632524ac68" From ce3b826dc5d776d048d6f7c961828141dc8babd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 22 Oct 2024 09:44:04 +0200 Subject: [PATCH 16/20] chore: update vm sdks to 0.10.1 --- package.json | 8 +-- yarn.lock | 143 +++++++++++++++------------------------------------ 2 files changed, 46 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index a37508e99..9731bca65 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "sentry": "node sentryscript.js" }, "dependencies": { - "@avalabs/avalanche-module": "0.10.0", + "@avalabs/avalanche-module": "0.10.1", "@avalabs/avalanchejs": "4.0.5", - "@avalabs/bitcoin-module": "0.10.0", + "@avalabs/bitcoin-module": "0.10.1", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", "@avalabs/core-bridge-sdk": "3.1.0-alpha.8", "@avalabs/core-chains-sdk": "3.1.0-alpha.8", @@ -37,11 +37,11 @@ "@avalabs/core-token-prices-sdk": "3.1.0-alpha.8", "@avalabs/core-utils-sdk": "3.1.0-alpha.8", "@avalabs/core-wallets-sdk": "3.1.0-alpha.8", - "@avalabs/evm-module": "0.10.0", + "@avalabs/evm-module": "0.10.1", "@avalabs/glacier-sdk": "3.1.0-alpha.8", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.3", - "@avalabs/vm-module-types": "0.10.0", + "@avalabs/vm-module-types": "0.10.1", "@blockaid/client": "0.10.0", "@coinbase/cbpay-js": "1.6.0", "@cubist-labs/cubesigner-sdk": "0.3.28", diff --git a/yarn.lock b/yarn.lock index 06f39b21b..0b09f98e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,20 +29,20 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@avalabs/avalanche-module@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.10.0.tgz#843706b16f2441db7ad56ae25e236bf3b9bfb88c" - integrity sha512-jRLgDtaQHbE7h128V0EOZjOzJc7um2+ABLL4jQ8A1onxllElugCg98UU78JT53HLV+CDXzFxO8vLbNmgWjQ+BA== +"@avalabs/avalanche-module@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.10.1.tgz#e68d65608ffb2f04ea1185286ea5e7b033e7a55b" + integrity sha512-zLHxNQ+Ckyp6QJ1cYpDneR7XGwFsCw3s1SaxNBu5CD2/yNV18gto6Aq6V95oud14/BDIv/DPm3ftS2e3OYxuHQ== dependencies: "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-alpha.7" - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-etherscan-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" - "@avalabs/types" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.10.0" + "@avalabs/core-chains-sdk" "3.1.0-alpha.8" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-etherscan-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" + "@avalabs/types" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.10.1" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bn.js "5.2.1" @@ -59,15 +59,15 @@ "@scure/base" "1.1.5" micro-eth-signer "0.7.2" -"@avalabs/bitcoin-module@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.10.0.tgz#97c4c4e1465840f5914aff4f96d600f4191cba65" - integrity sha512-jHdpJYDvkJrkTxDUI6orC3Rm+vyMJf9v8yJ/CWqItAQLvR5qNCJZdvKFf85kB1tsycD4LHRoL/yrNn40JbhxnA== +"@avalabs/bitcoin-module@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.10.1.tgz#9529ea60e18bd27558ce56c7298b9c8015b7b7ce" + integrity sha512-gwdiAeec9meja8vJ9hmP3bQKEQdvy+uIAjx8PogN7NsAeojm2XIy7wAhDNpLYC1oQ/6OQF9CM5U7ccLQFfTnwg== dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.10.0" + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.10.1" "@metamask/rpc-errors" "6.3.0" big.js "6.2.1" bitcoinjs-lib "5.2.0" @@ -95,13 +95,6 @@ "@avalabs/core-utils-sdk" "3.1.0-alpha.8" "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" -"@avalabs/core-chains-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-alpha.7.tgz#b74aa60fdf2def52a2da8a028ffa67194e8ea060" - integrity sha512-kIbaY99ZQTMgUQ+rQBylxd/yNHAdzb2Bs6Nq2n0vA/1s6lS+abmjuAnEdmHQMtW09wNMxtU+GFbIQ1lZBX0EtA== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-chains-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-chains-sdk/-/core-chains-sdk-3.1.0-alpha.8.tgz#ae9505709ec61eac47edad1c1a7941d4a16da984" @@ -109,13 +102,6 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-coingecko-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-alpha.7.tgz#902069b2aa7bada639ffe660420ad422e67eeb06" - integrity sha512-saLLKlfzKnzyLyvh0Z0RAr8tn4KznMN1Y9a/MVNQiu18bglPkFf6eOFBXeh983msxpzQQMGA9Lk3Iit6tnZoEg== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-coingecko-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-coingecko-sdk/-/core-coingecko-sdk-3.1.0-alpha.8.tgz#5fb89fc368b91791731b8990b2b663d53c5fa9cc" @@ -130,13 +116,6 @@ dependencies: "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-etherscan-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-alpha.7.tgz#eaefe7120527bce21c0574543a487c814b998f29" - integrity sha512-obHDRxqCUA3Pw7VSIHaAP37t6LMuoK02JS7Elh5u45p60Krb+ZQJqDPTBtaIupZdZ6KYXUSszyCmjcOKDTYQuQ== - dependencies: - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-etherscan-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-etherscan-sdk/-/core-etherscan-sdk-3.1.0-alpha.8.tgz#6bf3610223434fa13082cfb4c1fa34cdc8fe8558" @@ -182,15 +161,6 @@ "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" "@avalabs/core-utils-sdk" "3.1.0-alpha.8" -"@avalabs/core-utils-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-alpha.7.tgz#6e26e275e6594d644dae8e11407988f25ad1f369" - integrity sha512-INofye+10AIk6NfvMhj2pbxoqwHmj2uBNyFibk9Vm6zh61+Y+IX2D9lpdEDVwYztmHt4Cq7aLvIM5w+nlj3w0w== - dependencies: - "@avalabs/avalanchejs" "4.0.5" - "@hpke/core" "1.2.5" - is-ipfs "6.0.2" - "@avalabs/core-utils-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-utils-sdk/-/core-utils-sdk-3.1.0-alpha.8.tgz#0d20dcc3950c8c6607b28d50217e7ece93eb2ab7" @@ -200,30 +170,6 @@ "@hpke/core" "1.2.5" is-ipfs "6.0.2" -"@avalabs/core-wallets-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-alpha.7.tgz#b600bdc1f0cd43288f6eebb260db89337cccbb67" - integrity sha512-2U25KIGvdMnCp2B9W2N1qPQ7zNKPvCxO6MmMN/s8+3lq/fE6ZRM8Qq38I3Axmx1sfVATAeAg9qsXx6I3FtabwQ== - dependencies: - "@avalabs/avalanchejs" "4.0.5" - "@avalabs/core-chains-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" - "@avalabs/hw-app-avalanche" "0.14.1" - "@ledgerhq/hw-app-btc" "10.2.4" - "@ledgerhq/hw-app-eth" "6.36.1" - "@ledgerhq/hw-transport" "6.30.6" - "@metamask/eth-sig-util" "7.0.2" - "@openzeppelin/contracts" "4.9.6" - bip32 "2.0.6" - bip32-path "0.4.2" - bip39 "3.0.4" - bitcoinjs-lib "5.2.0" - coinselect "3.1.13" - create-hash "1.2.0" - hdkey "2.0.1" - ledger-bitcoin "0.2.3" - xss "1.0.14" - "@avalabs/core-wallets-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/core-wallets-sdk/-/core-wallets-sdk-3.1.0-alpha.8.tgz#52b91cc31f98e14f0e256d43bda11e6431f0df5a" @@ -248,18 +194,18 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/evm-module@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.10.0.tgz#0fb82c2373b06d281cbb93d4253b89f4b416b027" - integrity sha512-pMVt8oJXrwSH4Tr2CDcwCk9wq7sbyxGeFDAkNFjAskkA1OmWK34cgf/8x2SBLHhYfzbtHlAS/LNN3PAQlaBtcg== - dependencies: - "@avalabs/core-coingecko-sdk" "3.1.0-alpha.7" - "@avalabs/core-etherscan-sdk" "3.1.0-alpha.7" - "@avalabs/core-utils-sdk" "3.1.0-alpha.7" - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" - "@avalabs/types" "3.1.0-alpha.7" - "@avalabs/vm-module-types" "0.10.0" +"@avalabs/evm-module@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.10.1.tgz#02392fdea0b73c8be932329d68b2e9e42cc0d6c8" + integrity sha512-Re9YZAuedBgIt0abvvEdObgdj4AU2iCM+TkmDpL3J0tWvhRpQ9MOlmm7iaacrHAXSzO89asSnEOdEUJBWvh/Dw== + dependencies: + "@avalabs/core-coingecko-sdk" "3.1.0-alpha.8" + "@avalabs/core-etherscan-sdk" "3.1.0-alpha.8" + "@avalabs/core-utils-sdk" "3.1.0-alpha.8" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" + "@avalabs/types" "3.1.0-alpha.8" + "@avalabs/vm-module-types" "0.10.1" "@blockaid/client" "0.11.0" "@metamask/rpc-errors" "6.3.0" "@openzeppelin/contracts" "4.9.6" @@ -268,11 +214,6 @@ xss "1.0.13" zod "3.23.8" -"@avalabs/glacier-sdk@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-alpha.7.tgz#f7de8a09f9e26b0a789a5e6b50cc7ddcba873f0f" - integrity sha512-kcPm4zDyekJSboq5qs/mhRPQ/eiuQpsWRwT2/cPFoZWpjVOO+a1dnJyg9+fElkfiKg92bS38MlTQ1DWnoNioiQ== - "@avalabs/glacier-sdk@3.1.0-alpha.8": version "3.1.0-alpha.8" resolved "https://registry.yarnpkg.com/@avalabs/glacier-sdk/-/glacier-sdk-3.1.0-alpha.8.tgz#4bd974504dc19fcf63b89e11846d3c00aeda8e79" @@ -294,18 +235,18 @@ resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.3.tgz#3b7fb8cb8e2f124e0b11406788a903142753b5a0" integrity sha512-WN6NyPsF9XpmQp2SN4UbwjBT+XYH8di8gvL9rppQxz4d43xRLI1T2WVt/LXJgYdOauhuaSelb6zB4yNqGyKutQ== -"@avalabs/types@3.1.0-alpha.7": - version "3.1.0-alpha.7" - resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.7.tgz#c93ac3d5551001d9187040cd1adaf504512ee238" - integrity sha512-7s38LcB09QMx0fzd4/mb7nFcSPexiMsjx+vvdm0uDFpcwMTt0MgADQLgEpfUFfAMUMrm8QOTrRd6nWsuY9Om3Q== +"@avalabs/types@3.1.0-alpha.8": + version "3.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.8.tgz#45c31261cd358baa6aa252c0ee7933aa93401f4d" + integrity sha512-yKf4aFS8JORV+5KwHPM27+1iBVogS9Tn26bHHW07TYyewUYlDTjYRljHSNpAfQcf0ElWubjK7NQcjKXpYgAlxg== -"@avalabs/vm-module-types@0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.10.0.tgz#aec03548ed29f0737651188933e6995eab021a70" - integrity sha512-G8zHrm3t0jXwIP7Og7DP8LnOia+hzpgWQC+CIGiHyIgy8Ff9I8AqRzffAVAOv3ulSosFrhCVHE9ZHhQo6ylKbw== +"@avalabs/vm-module-types@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.10.1.tgz#22ca365a6b2d52edb87fa354418bca75c99035fe" + integrity sha512-xZrVzXk7AZIUNe2rNZStj+r+XYVYnQPrJxvP6EoO0fLt7MdB/8G8LJ85l0gbLVCmp4ax8vAQX3Nm2PihoHC1rA== dependencies: - "@avalabs/core-wallets-sdk" "3.1.0-alpha.7" - "@avalabs/glacier-sdk" "3.1.0-alpha.7" + "@avalabs/core-wallets-sdk" "3.1.0-alpha.8" + "@avalabs/glacier-sdk" "3.1.0-alpha.8" "@metamask/rpc-errors" "6.3.0" bitcoinjs-lib "5.2.0" zod "3.23.8" From e93ba1c690548439f0f012305a3a2777d5f4202f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 22 Oct 2024 09:44:40 +0200 Subject: [PATCH 17/20] refactor: better name for isTxHistoryItem() util --- src/background/services/history/models.ts | 4 ++-- .../history/utils/isTxHistoryItem.test.ts | 8 ++++---- .../services/history/utils/isTxHistoryItem.ts | 19 ++++++++++--------- src/pages/Send/components/ContactSelect.tsx | 4 ++-- src/pages/Wallet/WalletRecentTxs.tsx | 10 +++++----- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/background/services/history/models.ts b/src/background/services/history/models.ts index 5caab75ff..4c032f137 100644 --- a/src/background/services/history/models.ts +++ b/src/background/services/history/models.ts @@ -1,7 +1,7 @@ import { AnalyzeTxResult } from '@avalabs/bridge-unified'; import { NetworkVMType, Transaction } from '@avalabs/vm-module-types'; -export interface TxHistoryItem extends Transaction { +export interface TxHistoryItem extends Transaction { bridgeAnalysis: AnalyzeTxResult; - vmType?: NetworkVMType; + vmType?: VMType; } diff --git a/src/background/services/history/utils/isTxHistoryItem.test.ts b/src/background/services/history/utils/isTxHistoryItem.test.ts index 8d755542c..65f08c149 100644 --- a/src/background/services/history/utils/isTxHistoryItem.test.ts +++ b/src/background/services/history/utils/isTxHistoryItem.test.ts @@ -1,6 +1,6 @@ import { TxHistoryItem } from '../models'; import { NetworkVMType, TokenType } from '@avalabs/vm-module-types'; -import { isPchainTxHistoryItem, isTxHistoryItem } from './isTxHistoryItem'; +import { isPchainTxHistoryItem, isNonXPHistoryItem } from './isTxHistoryItem'; import { PChainTransactionType, XChainTransactionType, @@ -72,13 +72,13 @@ describe('src/background/services/history/utils/isTxHistoryItem.ts', () => { describe('isTxHistoryItem', () => { it('should return true when the tx is txHistoryItem', () => { - const result = isTxHistoryItem(txHistoryItem); + const result = isNonXPHistoryItem(txHistoryItem); expect(result).toBe(true); }); it('should return false when the tx is not txHistoryItem', () => { - const result = isTxHistoryItem(pchainTxHistoryItem); + const result = isNonXPHistoryItem(pchainTxHistoryItem); expect(result).toBe(false); - const result2 = isTxHistoryItem(xchainTxHistoryItem); + const result2 = isNonXPHistoryItem(xchainTxHistoryItem); expect(result2).toBe(false); }); }); diff --git a/src/background/services/history/utils/isTxHistoryItem.ts b/src/background/services/history/utils/isTxHistoryItem.ts index 1305488b5..8cab02a96 100644 --- a/src/background/services/history/utils/isTxHistoryItem.ts +++ b/src/background/services/history/utils/isTxHistoryItem.ts @@ -1,15 +1,16 @@ +import { NetworkVMType } from '@avalabs/vm-module-types'; import { TxHistoryItem } from '../models'; -export function isTxHistoryItem(tx: TxHistoryItem): tx is TxHistoryItem { - if ('bridgeAnalysis' in tx && tx.vmType !== 'AVM' && tx.vmType !== 'PVM') { - return true; - } - return false; +export function isNonXPHistoryItem( + tx: TxHistoryItem +): tx is TxHistoryItem< + Exclude +> { + return tx.vmType !== 'AVM' && tx.vmType !== 'PVM'; } -export function isPchainTxHistoryItem(tx: TxHistoryItem): tx is TxHistoryItem { - if (!('vmType' in tx)) { - return false; - } +export function isPchainTxHistoryItem( + tx: TxHistoryItem +): tx is TxHistoryItem { return tx.vmType === 'PVM'; } diff --git a/src/pages/Send/components/ContactSelect.tsx b/src/pages/Send/components/ContactSelect.tsx index 607eb3b69..82612932c 100644 --- a/src/pages/Send/components/ContactSelect.tsx +++ b/src/pages/Send/components/ContactSelect.tsx @@ -22,7 +22,7 @@ import { MyAccountContacts, } from './AddressDropdownListMyAccounts'; import { isPchainNetwork } from '@src/background/services/network/utils/isAvalanchePchainNetwork'; -import { isTxHistoryItem } from '@src/background/services/history/utils/isTxHistoryItem'; +import { isNonXPHistoryItem } from '@src/background/services/history/utils/isTxHistoryItem'; import { stripAddressPrefix } from '@src/utils/stripAddressPrefix'; import { indexOf } from 'lodash'; import { isBitcoinNetwork } from '@src/background/services/network/utils/isBitcoinNetwork'; @@ -76,7 +76,7 @@ export const ContactSelect = ({ } getTransactionHistory().then((history) => { const filteredHistory = history.filter((tx, index, self) => { - if (!tx.isSender || (isTxHistoryItem(tx) && tx.isContractCall)) { + if (!tx.isSender || (isNonXPHistoryItem(tx) && tx.isContractCall)) { return false; } // filter out dupe to addresses diff --git a/src/pages/Wallet/WalletRecentTxs.tsx b/src/pages/Wallet/WalletRecentTxs.tsx index cad789580..6f70b3228 100644 --- a/src/pages/Wallet/WalletRecentTxs.tsx +++ b/src/pages/Wallet/WalletRecentTxs.tsx @@ -24,7 +24,7 @@ import { isNftTokenType } from '@src/background/services/balances/nft/utils/isNF import { usePendingBridgeTransactions } from '../Bridge/hooks/usePendingBridgeTransactions'; import { isPchainTxHistoryItem, - isTxHistoryItem, + isNonXPHistoryItem, } from '@src/background/services/history/utils/isTxHistoryItem'; import { PchainActivityCard } from './components/History/components/ActivityCard/PchainActivityCard'; import { isPchainNetwork } from '@src/background/services/network/utils/isAvalanchePchainNetwork'; @@ -191,7 +191,7 @@ export function WalletRecentTxs({ function shouldTxBeKept(tx: TxHistoryItem) { if ( - isTxHistoryItem(tx) && + isNonXPHistoryItem(tx) && tx.bridgeAnalysis.isBridgeTx && isPendingBridge(tx) ) { @@ -202,7 +202,7 @@ export function WalletRecentTxs({ return unfilteredTxHistory .filter((tx) => { - if (tokenSymbolFilter && isTxHistoryItem(tx)) { + if (tokenSymbolFilter && isNonXPHistoryItem(tx)) { return tokenSymbolFilter === tx.tokens?.[0]?.symbol; } else { return true; @@ -296,7 +296,7 @@ export function WalletRecentTxs({ tx: TxHistoryItem, filter: FilterType | PchainFilterType | XchainFilterType ) { - if (isTxHistoryItem(tx)) { + if (isNonXPHistoryItem(tx)) { return txHistoryItemFilter(tx, filter); } else if (isPchainTxHistoryItem(tx)) { return pchainTxHistoryItemFilter(tx, filter); @@ -494,7 +494,7 @@ export function WalletRecentTxs({ {getDayString(tx.timestamp)} )} - {isTxHistoryItem(tx) ? ( + {isNonXPHistoryItem(tx) ? ( ) : isPchainTxHistoryItem(tx) ? ( From da600aea99b6c0163bf003eea7be9f59ddb79acb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 22 Oct 2024 11:00:46 +0200 Subject: [PATCH 18/20] test: missing tests for UnifiedBridgeService retry logic --- .../UnifiedBridgeService.test.ts | 63 ++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts b/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts index 9eca295c6..82e049270 100644 --- a/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts +++ b/src/background/services/unifiedBridge/UnifiedBridgeService.test.ts @@ -1,13 +1,18 @@ import { + BridgeService, + BridgeType, Environment, createUnifiedBridgeService, getEnabledBridgeServices, } from '@avalabs/bridge-unified'; import { UnifiedBridgeService } from './UnifiedBridgeService'; import { FeatureGates } from '../featureFlags/models'; +import { wait } from '@avalabs/core-utils-sdk'; jest.mock('@avalabs/bridge-unified'); +jest.mock('@avalabs/core-utils-sdk'); jest.mock('@src/utils/network/getProviderForNetwork'); +jest.mock('@src/monitoring/sentryCaptureException'); describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { let core: ReturnType; @@ -59,8 +64,6 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { networkService.getNetwork.mockImplementation(async (chainId) => ({ chainId, })); - - new UnifiedBridgeService(networkService, storageService, flagsService); }); it('creates core instance with proper environment', async () => { @@ -79,6 +82,7 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { networkService.isMainnet.mockReturnValue(false); new UnifiedBridgeService(networkService, storageService, flagsService); + await new Promise(process.nextTick); // Await getEnabledBridgeServices() call expect(createUnifiedBridgeService).toHaveBeenCalledWith( expect.objectContaining({ @@ -88,6 +92,7 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { }); it('recreates the core instance on testnet mode switch', async () => { + new UnifiedBridgeService(networkService, storageService, flagsService); const mockTestnetModeChange = ( networkService.developerModeChanged.add as jest.Mock ).mock.lastCall[0]; @@ -102,6 +107,8 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { }); it('recreates the core instance when certain feature flags are toggled', async () => { + new UnifiedBridgeService(networkService, storageService, flagsService); + const mockFeatureFlagChanges = (flagsService.addListener as jest.Mock).mock .lastCall[1]; @@ -148,4 +155,56 @@ describe('src/background/services/unifiedBridge/UnifiedBridgeService', () => { expect.objectContaining({ bridgeTransfer: { sourceTxHash: '0x2345' } }) ); }); + + describe('when building bridge services fails', () => { + const serviceMap = new Map([[BridgeType.CCTP, {} as BridgeService]]); + + beforeEach(() => { + jest.useFakeTimers(); + jest + .mocked(getEnabledBridgeServices) + .mockRejectedValueOnce(new Error('Failed to fetch')) + .mockRejectedValueOnce(new Error('Failed to fetch')) + .mockRejectedValueOnce(new Error('Failed to fetch')) + .mockResolvedValueOnce(serviceMap); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('retries using an exponential backoff delay', async () => { + networkService.isMainnet.mockReturnValue(true); + storageService.load.mockResolvedValue({ + pendingTransfers: {}, + }); + + new UnifiedBridgeService(networkService, storageService, flagsService); + await jest.runAllTicks(); + + expect(getEnabledBridgeServices).toHaveBeenCalledTimes(1); + expect(wait).toHaveBeenNthCalledWith(1, 2000); + + jest.advanceTimersByTime(2000); + await jest.runOnlyPendingTimers(); + await jest.runAllTicks(); + + expect(getEnabledBridgeServices).toHaveBeenCalledTimes(2); + expect(wait).toHaveBeenNthCalledWith(2, 4000); + + jest.advanceTimersByTime(4000); + await jest.runOnlyPendingTimers(); + await jest.runAllTicks(); + + expect(getEnabledBridgeServices).toHaveBeenCalledTimes(3); + expect(wait).toHaveBeenNthCalledWith(3, 8000); + + jest.advanceTimersByTime(8000); + await jest.runOnlyPendingTimers(); + await jest.runAllTicks(); + + expect(getEnabledBridgeServices).toHaveBeenCalledTimes(4); + expect(createUnifiedBridgeService).toHaveBeenCalled(); + }); + }); }); From 5bf2855cff14f43d8af9c0da6eb2bd4ec91c4797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Tue, 22 Oct 2024 11:29:15 +0200 Subject: [PATCH 19/20] test: missing tests for UnifiedBridgeProvider --- package.json | 5 +- src/contexts/UnifiedBridgeProvider.test.tsx | 51 ++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9731bca65..d1dad9f3c 100644 --- a/package.json +++ b/package.json @@ -256,7 +256,10 @@ "@avalabs/bitcoin-module>@avalabs/vm-module-types>@avalabs/core-wallets-sdk>hdkey>secp256k1": false, "@avalabs/avalanche-module>@avalabs/core-wallets-sdk>@avalabs/hw-app-avalanche>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>eip55>keccak": false, "@avalabs/avalanche-module>@avalabs/core-wallets-sdk>@ledgerhq/hw-app-btc>bitcoinjs-lib>bip32>tiny-secp256k1": false, - "@avalabs/avalanche-module>@avalabs/core-wallets-sdk>hdkey>secp256k1": false + "@avalabs/avalanche-module>@avalabs/core-wallets-sdk>hdkey>secp256k1": false, + "@avalabs/avalanche-module>@avalabs/vm-module-types>@avalabs/core-wallets-sdk>@avalabs/hw-app-avalanche>@ledgerhq/hw-app-eth>@ledgerhq/domain-service>eip55>keccak": false, + "@avalabs/avalanche-module>@avalabs/vm-module-types>@avalabs/core-wallets-sdk>@ledgerhq/hw-app-btc>bitcoinjs-lib>bip32>tiny-secp256k1": false, + "@avalabs/avalanche-module>@avalabs/vm-module-types>@avalabs/core-wallets-sdk>hdkey>secp256k1": false } } } diff --git a/src/contexts/UnifiedBridgeProvider.test.tsx b/src/contexts/UnifiedBridgeProvider.test.tsx index 93b35a2f3..eeba66c8c 100644 --- a/src/contexts/UnifiedBridgeProvider.test.tsx +++ b/src/contexts/UnifiedBridgeProvider.test.tsx @@ -1,8 +1,10 @@ -import { render, waitFor } from '@src/tests/test-utils'; +import { matchingPayload, render, waitFor } from '@src/tests/test-utils'; import { createRef, forwardRef, useImperativeHandle } from 'react'; import { + BridgeService, BridgeSignatureReason, BridgeType, + Environment, TokenType, createUnifiedBridgeService, getEnabledBridgeServices, @@ -176,6 +178,53 @@ describe('contexts/UnifiedBridgeProvider', () => { ); }); + it('initializes with test environment when in testnet mode', async () => { + jest.mocked(useNetworkContext).mockReturnValue({ + ...networkContext, + network: { + ...avalanche, + isTestnet: true, + }, + }); + + getBridgeProvider(); + + await waitFor(() => + expect(createUnifiedBridgeService).toHaveBeenCalledWith( + matchingPayload({ environment: Environment.TEST }) + ) + ); + }); + + it('initializes with prod environment when not in testnet mode', async () => { + getBridgeProvider(); + + await waitFor(() => + expect(createUnifiedBridgeService).toHaveBeenCalledWith( + matchingPayload({ environment: Environment.PROD }) + ) + ); + }); + + it('initializes without AvalancheBridge and ICTT', async () => { + const serviceMap = new Map([[BridgeType.CCTP, {} as BridgeService]]); + jest.mocked(getEnabledBridgeServices).mockResolvedValueOnce(serviceMap); + + getBridgeProvider(); + + await waitFor(() => + expect(getEnabledBridgeServices).toHaveBeenCalledWith(Environment.PROD, [ + BridgeType.AVALANCHE_EVM, + BridgeType.ICTT_ERC20_ERC20, + ]) + ); + await waitFor(() => + expect(createUnifiedBridgeService).toHaveBeenCalledWith( + matchingPayload({ enabledBridgeServices: serviceMap }) + ) + ); + }); + describe('transferAsset()', () => { it('throws error if bridge is not initialized yet', async () => { jest.mocked(useNetworkContext).mockReturnValueOnce({ From b5591b530b8c515a1584120584513c6e07064981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Leszczyk?= Date: Thu, 24 Oct 2024 09:38:04 +0200 Subject: [PATCH 20/20] chore: pin dependencies --- package.json | 8 ++++---- yarn.lock | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index fd8c72543..4fa3ba4d6 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "sentry": "node sentryscript.js" }, "dependencies": { - "@avalabs/avalanche-module": "^0.11.2", + "@avalabs/avalanche-module": "0.11.2", "@avalabs/avalanchejs": "4.1.0-alpha.7", - "@avalabs/bitcoin-module": "^0.11.2", + "@avalabs/bitcoin-module": "0.11.2", "@avalabs/bridge-unified": "0.0.0-feat-ictt-configs-20241009072139", "@avalabs/core-bridge-sdk": "3.1.0-alpha.10", "@avalabs/core-chains-sdk": "3.1.0-alpha.10", @@ -37,11 +37,11 @@ "@avalabs/core-token-prices-sdk": "3.1.0-alpha.10", "@avalabs/core-utils-sdk": "3.1.0-alpha.10", "@avalabs/core-wallets-sdk": "3.1.0-alpha.10", - "@avalabs/evm-module": "^0.11.2", + "@avalabs/evm-module": "0.11.2", "@avalabs/glacier-sdk": "3.1.0-alpha.10", "@avalabs/hw-app-avalanche": "0.14.1", "@avalabs/types": "3.1.0-alpha.10", - "@avalabs/vm-module-types": "^0.11.2", + "@avalabs/vm-module-types": "0.11.2", "@blockaid/client": "0.10.0", "@coinbase/cbpay-js": "1.6.0", "@cubist-labs/cubesigner-sdk": "0.3.28", diff --git a/yarn.lock b/yarn.lock index e5d29663a..20409fc72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,7 +29,7 @@ resolved "https://registry.yarnpkg.com/@apocentre/alias-sampling/-/alias-sampling-0.5.3.tgz#897ff181b48ad7b2bcb4ecf29400214888244f08" integrity sha512-7UDWIIF9hIeJqfKXkNIzkVandlwLf1FWTSdrb9iXvOP8oF544JRXQjCbiTmCv2c9n44n/FIWtehhBfNuAx2CZA== -"@avalabs/avalanche-module@^0.11.2": +"@avalabs/avalanche-module@0.11.2": version "0.11.2" resolved "https://registry.yarnpkg.com/@avalabs/avalanche-module/-/avalanche-module-0.11.2.tgz#265d0a9c781d623cd0ae61495a161c9649972f26" integrity sha512-8oMmaQrTBV3iGntZA2VQYSLP5NKCRRD3rbcMa9WkzxCe16DWhT+tiygH6gqU48dI5pP5ELGcpoD6Bmg3JGN2QA== @@ -59,7 +59,7 @@ "@scure/base" "1.1.5" micro-eth-signer "0.7.2" -"@avalabs/bitcoin-module@^0.11.2": +"@avalabs/bitcoin-module@0.11.2": version "0.11.2" resolved "https://registry.yarnpkg.com/@avalabs/bitcoin-module/-/bitcoin-module-0.11.2.tgz#1603d00481bd6ecc3e30e67abc41c0f7866278f9" integrity sha512-BpyyEN0M0YHXPX1erHHfNeTvbVZ80zEdy9W9zS6m9Eeep9P/1fAxs1NndLZpQOzjP3J+pSzr+pNDkeJfIz/lPw== @@ -194,7 +194,7 @@ ledger-bitcoin "0.2.3" xss "1.0.14" -"@avalabs/evm-module@^0.11.2": +"@avalabs/evm-module@0.11.2": version "0.11.2" resolved "https://registry.yarnpkg.com/@avalabs/evm-module/-/evm-module-0.11.2.tgz#9f91ddc4c198f63e4a7b4a5045c59c4ad77408bc" integrity sha512-2es5NKGurKUXq87a7xYH+zL3kvprjZ4DtcL+CVLIVCIsmVXSYRIAnNl7JgM1SakqrIeI+BAUuBi+OxMhBMc2HA== @@ -235,7 +235,7 @@ resolved "https://registry.yarnpkg.com/@avalabs/types/-/types-3.1.0-alpha.10.tgz#408766fce72882b0dc04ac045e5f3e95d21503d3" integrity sha512-MgWAsW9K+y75tDMK8JCNdRLT4Lkdr1LysiPhlAaYg8Ino7KsZZmGzbIcLHakQwjSbY4CWQblDlB5y4SHN+fdmA== -"@avalabs/vm-module-types@0.11.2", "@avalabs/vm-module-types@^0.11.2": +"@avalabs/vm-module-types@0.11.2": version "0.11.2" resolved "https://registry.yarnpkg.com/@avalabs/vm-module-types/-/vm-module-types-0.11.2.tgz#faa2df6533da181f5d7c6f4cd6e366196c653c91" integrity sha512-PdMCNSKy+jPfDWbNoj6sIzJc1T5XwXfnsAJFonEF+KKHW7j/Vy0WvOyL7bHRECIrvfGdUYFhnfVLragfGBGARQ==