Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Save sub bridge transaction fees in runtime tx processing #1088

Merged
merged 45 commits into from
Jul 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
8f48eea
fix hashi bridge
Nikita-Polyakov Jul 3, 2023
6bcc53a
fetch sub bridgeassets
Nikita-Polyakov Jul 3, 2023
1bbea87
update wallet
Nikita-Polyakov Jul 3, 2023
54b0fa1
fix external account check
Nikita-Polyakov Jul 3, 2023
ab3e7a8
remove unnecessary codeline
Nikita-Polyakov Jul 3, 2023
f8f77bb
remove console.log
Nikita-Polyakov Jul 3, 2023
8b66c3e
demo for fetching extrinsic fee
Nikita-Polyakov Jul 3, 2023
4313870
Merge remote-tracking branch 'origin/develop' into tech/sub-fetch-ext…
Nikita-Polyakov Jul 3, 2023
524f7e4
fix merge conflict
Nikita-Polyakov Jul 3, 2023
9b364ae
merge origin/develop
Nikita-Polyakov Jul 4, 2023
fbe6b61
save tx fee & xcm fee
Nikita-Polyakov Jul 4, 2023
dae1f6b
remove duplicated code from bridge reducers
Nikita-Polyakov Jul 5, 2023
d213e02
improve network restoration
Nikita-Polyakov Jul 5, 2023
f5d39b1
refactoring external native token balance
Nikita-Polyakov Jul 5, 2023
50a9295
refactoring registered asset naming
Nikita-Polyakov Jul 5, 2023
36ea6ed
Merge branch 'develop' into tech/sub-fetch-extrinsic-fee
Nikita-Polyakov Jul 5, 2023
c4481ac
update evm gas price
Nikita-Polyakov Jul 5, 2023
df90c60
update evm gas price
Nikita-Polyakov Jul 5, 2023
78e5013
improve gas fee calculation
Nikita-Polyakov Jul 5, 2023
fe2526d
remove mainnet from evm networks ids
Nikita-Polyakov Jul 5, 2023
7205bda
merge fee update
Nikita-Polyakov Jul 5, 2023
788707b
update gasLimits
Nikita-Polyakov Jul 5, 2023
2c39d78
Merge branch 'develop' into fix/evm-expected-fee
Nikita-Polyakov Jul 6, 2023
6a2963e
add external fee warning
Nikita-Polyakov Jul 6, 2023
250192c
refactoring externalBalance
Nikita-Polyakov Jul 6, 2023
f5c9aff
Merge branch 'fix/evm-expected-fee' of github.com:sora-xor/polkaswap-…
Nikita-Polyakov Jul 6, 2023
9cc07dc
update locales
Nikita-Polyakov Jul 6, 2023
1f3896e
update translations from localisr
Nikita-Polyakov Jul 6, 2023
28e29ff
Merge branch 'fix/evm-expected-fee' into tech/sub-fetch-extrinsic-fee
Nikita-Polyakov Jul 6, 2023
958ce96
impove outgoing tracking
Nikita-Polyakov Jul 6, 2023
c3d2c2a
wip locked balance
Nikita-Polyakov Jul 7, 2023
b263f85
use locked balance in bridge calculations
Nikita-Polyakov Jul 7, 2023
c351bd4
refactoring
Nikita-Polyakov Jul 7, 2023
c6819e6
update BridgeTransaction asset locked balance check
Nikita-Polyakov Jul 7, 2023
f06aa0d
merge origin/develop
Nikita-Polyakov Jul 7, 2023
f84b603
merge origin/develop
Nikita-Polyakov Jul 10, 2023
75f2325
refactoring event search
Nikita-Polyakov Jul 10, 2023
b4ec5f7
merge origin/develop
Nikita-Polyakov Jul 10, 2023
288f10b
get bridge contract asset locked balance
Nikita-Polyakov Jul 10, 2023
50f1b20
remove Karura from config
Nikita-Polyakov Jul 10, 2023
1f3d8af
refactoring before wallet update
Nikita-Polyakov Jul 11, 2023
a1505f7
update wallet 1.18.1
Nikita-Polyakov Jul 11, 2023
bc32ea2
calc evm fee based on asset kind
Nikita-Polyakov Jul 11, 2023
e2db5c0
fix sonar issues
Nikita-Polyakov Jul 11, 2023
246df42
fix naming
Nikita-Polyakov Jul 11, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "polkaswap-exchange-web",
"version": "1.17.0",
"version": "1.18.0",
"repository": {
"type": "git",
"url": "https://github.com/sora-xor/polkaswap-exchange-web.git"
Expand All @@ -23,7 +23,7 @@
},
"dependencies": {
"@metamask/detect-provider": "^2.0.0",
"@soramitsu/soraneo-wallet-web": "1.17.18",
"@soramitsu/soraneo-wallet-web": "1.18.1",
"@walletconnect/web3-provider": "^1.8.0",
"base-64": "^1.0.0",
"core-js": "^3.26.0",
Expand Down
1 change: 0 additions & 1 deletion public/env.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
"EVM_NETWORKS_IDS": [97, 1001],
"SUB_NETWORKS": {
"Rococo": "wss://ws.relaychain-node-1.r1.dev.sora2.soramitsu.co.jp",
"RococoKarura": "wss://ws.karura-node-1.c2.dev.sora2.soramitsu.co.jp",
"RococoSora": "wss://ws.parachain-collator-1.c1.dev.sora2.soramitsu.co.jp"
},
"ETH_BRIDGE": {
Expand Down
3 changes: 1 addition & 2 deletions src/components/mixins/AssetsSearchMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { Component, Mixins } from 'vue-property-decorator';

import SearchInputMixin from '@/components/mixins/SearchInputMixin';

import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { Asset, AccountAsset } from '@sora-substrate/util/build/assets/types';
import type { Asset, AccountAsset, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component
export default class AssetsSearchMixin extends Mixins(SearchInputMixin) {
Expand Down
4 changes: 3 additions & 1 deletion src/components/mixins/BridgeMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import { Component, Mixins } from 'vue-property-decorator';
import WalletConnectMixin from '@/components/mixins/WalletConnectMixin';
import { getter, mutation, state } from '@/store/decorators';

import type { CodecString, RegisteredAccountAsset } from '@sora-substrate/util';
import type { CodecString } from '@sora-substrate/util';
import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component
export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConnectMixin) {
@state.bridge.externalNativeBalance externalNativeBalance!: CodecString;
@state.bridge.externalBlockNumber externalBlockNumber!: number;
@state.bridge.assetLockedBalance assetLockedBalance!: Nullable<CodecString>;

@getter.web3.isValidNetwork isValidNetwork!: boolean;
@getter.bridge.sender sender!: string;
Expand Down
2 changes: 1 addition & 1 deletion src/components/mixins/ExplorePageMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Component, Mixins, Prop, Ref, Watch } from 'vue-property-decorator';

import { getter } from '@/store/decorators';

import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component
export default class ExplorePageMixin extends Mixins(
Expand Down
2 changes: 1 addition & 1 deletion src/components/mixins/NetworkFormatterMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export default class NetworkFormatterMixin extends Mixins(TranslationMixin) {
return 'kusama';
case SubNetwork.Rococo:
return 'rococo';
case SubNetwork.RococoKarura:
case SubNetwork.KusamaKarura:
return 'karura';
default:
return 'ethereum';
Expand Down
3 changes: 1 addition & 2 deletions src/components/mixins/SelectAssetMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ import { Component, Mixins, Watch } from 'vue-property-decorator';
import AssetsSearchMixin from '@/components/mixins/AssetsSearchMixin';
import { getter } from '@/store/decorators';

import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { Asset, AccountAsset } from '@sora-substrate/util/build/assets/types';
import type { Asset, AccountAsset, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component
export default class SelectAsset extends Mixins(mixins.DialogMixin, AssetsSearchMixin) {
Expand Down
7 changes: 3 additions & 4 deletions src/components/pages/Bridge/SelectAsset.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@ import SelectAssetMixin from '@/components/mixins/SelectAssetMixin';
import TranslationMixin from '@/components/mixins/TranslationMixin';
import { Components, ObjectInit } from '@/consts';
import { lazyComponent } from '@/router';
import type { BridgeAccountAsset } from '@/store/assets/types';
import type { BridgeRegisteredAsset } from '@/store/assets/types';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please don't use @ for types imports cuz it breaks js lint sorting rules

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will try to fix this in another PR (because of a lot of changes after linting)

import { state, getter } from '@/store/decorators';
import type { NetworkData } from '@/types/bridge';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same


import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { AccountAsset } from '@sora-substrate/util/build/assets/types';
import type { AccountAsset, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component({
components: {
Expand All @@ -51,7 +50,7 @@ export default class BridgeSelectAsset extends Mixins(TranslationMixin, SelectAs
@Prop({ default: ObjectInit, type: Object }) readonly asset!: AccountAsset;

@getter.web3.selectedNetwork private selectedNetwork!: Nullable<NetworkData>;
@state.assets.registeredAssets private registeredAssets!: Record<string, BridgeAccountAsset>;
@state.assets.registeredAssets private registeredAssets!: Record<string, BridgeRegisteredAsset>;
@state.bridge.isSoraToEvm isSoraToEvm!: boolean;
@state.wallet.settings.shouldBalanceBeHidden shouldBalanceBeHidden!: boolean;

Expand Down
4 changes: 2 additions & 2 deletions src/components/pages/Bridge/TransferNotification.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ import { getter, state, mutation } from '@/store/decorators';
import { isOutgoingTransaction } from '@/utils/bridge/common/utils';
import ethersUtil from '@/utils/ethers-util';

import type { IBridgeTransaction, RegisteredAccountAsset } from '@sora-substrate/util';
import type { Whitelist } from '@sora-substrate/util/build/assets/types';
import type { IBridgeTransaction } from '@sora-substrate/util';
import type { Whitelist, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

@Component({
components: {
Expand Down
34 changes: 22 additions & 12 deletions src/components/pages/Moonpay/BridgeInitMixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Component, Mixins } from 'vue-property-decorator';
import BridgeHistoryMixin from '@/components/mixins/BridgeHistoryMixin';
import WalletConnectMixin from '@/components/mixins/WalletConnectMixin';
import { MoonpayNotifications } from '@/components/pages/Moonpay/consts';
import type { RegisteredAccountAssetObject, BridgeAccountAsset } from '@/store/assets/types';
import type { BridgeRegisteredAsset } from '@/store/assets/types';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the same

import { state, action, mutation, getter } from '@/store/decorators';
import type { BridgeTxData } from '@/store/moonpay/types';
import { getMaxValue, hasInsufficientEvmNativeTokenForFee } from '@/utils';
Expand All @@ -14,6 +14,7 @@ import type { MoonpayTransaction } from '@/utils/moonpay';
import { MoonpayEVMTransferAssetData, MoonpayApi } from '@/utils/moonpay';

import type { CodecString, BridgeHistory } from '@sora-substrate/util';
import type { Asset, AccountBalance } from '@sora-substrate/util/build/assets/types';
import type { EvmNetwork } from '@sora-substrate/util/build/bridgeProxy/evm/types';
import type { WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web';

Expand All @@ -29,10 +30,10 @@ export default class MoonpayBridgeInitMixin extends Mixins(BridgeHistoryMixin, W
@state.moonpay.bridgeTransactionData bridgeTransactionData!: Nullable<BridgeHistory>;
@state.web3.ethBridgeEvmNetwork ethBridgeEvmNetwork!: EvmNetwork;
@state.wallet.settings.soraNetwork soraNetwork!: Nullable<WALLET_CONSTS.SoraNetwork>;
@state.assets.registeredAssets private registeredAssets!: Record<string, BridgeAccountAsset>;
@state.assets.registeredAssets private registeredAssets!: Record<string, BridgeRegisteredAsset>;

@getter.settings.moonpayApiKey moonpayApiKey!: string;
@getter.assets.assetsDataTable assetsDataTable!: RegisteredAccountAssetObject;
@getter.assets.assetsDataTable assetsDataTable!: Record<string, Asset>;

@mutation.moonpay.setConfirmationVisibility setConfirmationVisibility!: (flag: boolean) => void;
@mutation.moonpay.setNotificationVisibility setNotificationVisibility!: (flag: boolean) => void;
Expand Down Expand Up @@ -123,31 +124,40 @@ export default class MoonpayBridgeInitMixin extends Mixins(BridgeHistoryMixin, W
);
}

const [soraAddress] =
const [soraAddress, registeredAsset] =
Object.entries(this.registeredAssets).find(([soraAddress, registeredAsset]) =>
ethersUtil.addressesAreEqual(registeredAsset.address, ethTransferData.address)
) ?? [];

if (!soraAddress) {
if (!(soraAddress && registeredAsset)) {
throw createError(
`Asset is not registered: ethereum address ${ethTransferData.address}`,
MoonpayNotifications.SupportError
);
}

const asset = this.assetsDataTable[soraAddress];

const externalBalance = (await ethersUtil.getAccountAssetBalance(ethTransferData.to, asset.externalAddress))
const externalBalance = (await ethersUtil.getAccountAssetBalance(ethTransferData.to, registeredAsset.address))
.value;
const evmNetworkFee: CodecString = await ethersUtil.getEvmNetworkFee(soraAddress, false);
const evmNetworkFee: CodecString = await ethersUtil.getEvmNetworkFee(
registeredAsset.address,
registeredAsset.kind,
false
);
const evmNativeBalance = await ethersUtil.getAccountBalance(ethTransferData.to);
const hasEthForFee = !hasInsufficientEvmNativeTokenForFee(evmNativeBalance, evmNetworkFee);

if (!hasEthForFee) {
throw createError('Insufficient ETH for fee', MoonpayNotifications.FeeError);
}

const maxAmount = getMaxValue({ ...asset, externalBalance }, evmNetworkFee, true); // max balance (minus fee if eth asset)
const accountAsset = {
...this.assetsDataTable[soraAddress],
balance: {} as AccountBalance,
externalBalance,
externalAddress: registeredAsset.address,
externalDecimals: registeredAsset.decimals,
};
const maxAmount = getMaxValue(accountAsset, evmNetworkFee, true); // max balance (minus fee if eth asset)
const amount = Math.min(Number(maxAmount), Number(ethTransferData.amount));

if (amount <= 0) {
Expand All @@ -157,8 +167,8 @@ export default class MoonpayBridgeInitMixin extends Mixins(BridgeHistoryMixin, W
return {
type: Operation.EthBridgeIncoming,
amount: String(amount),
symbol: asset.symbol,
assetAddress: asset.address,
symbol: accountAsset.symbol,
assetAddress: accountAsset.address,
soraNetworkFee: this.networkFees[Operation.EthBridgeIncoming],
externalNetworkFee: evmNetworkFee,
externalNetwork: this.ethBridgeEvmNetwork,
Expand Down
4 changes: 2 additions & 2 deletions src/consts/sub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ export const SUB_NETWORKS: Partial<Record<SubNetwork, NetworkData>> = {
blockExplorerUrls: [],
shortName: 'Rococo',
},
[SubNetwork.RococoKarura]: {
id: SubNetwork.RococoKarura,
[SubNetwork.KusamaKarura]: {
id: SubNetwork.KusamaKarura,
name: 'Karura',
nativeCurrency: {
name: 'KAR',
Expand Down
2 changes: 1 addition & 1 deletion src/store/addLiquidity/getters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { ZeroStringValue } from '@/consts';
import { addLiquidityGetterContext } from '@/store/addLiquidity';

import type { AddLiquidityState } from './types';
import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';
import type { AccountLiquidity } from '@sora-substrate/util/build/poolXyk/types';

const getters = defineGetters<AddLiquidityState>()({
Expand Down
84 changes: 41 additions & 43 deletions src/store/assets/actions.ts
Original file line number Diff line number Diff line change
@@ -1,86 +1,82 @@
import { BridgeNetworkType } from '@sora-substrate/util/build/bridgeProxy/consts';
import { SubNetwork } from '@sora-substrate/util/build/bridgeProxy/sub/consts';
import { defineActions } from 'direct-vuex';

import { ZeroStringValue } from '@/consts';
import { assetsActionContext } from '@/store/assets';
import type { BridgeAccountAsset } from '@/store/assets/types';
import type { BridgeRegisteredAsset } from '@/store/assets/types';
import { ethBridgeApi } from '@/utils/bridge/eth/api';
import { evmBridgeApi } from '@/utils/bridge/evm/api';
import { subBridgeApi } from '@/utils/bridge/sub/api';
import ethersUtil from '@/utils/ethers-util';

import type { EvmNetwork } from '@sora-substrate/util/build/bridgeProxy/evm/types';
import type { SubNetwork } from '@sora-substrate/util/build/bridgeProxy/sub/consts';
import type { ActionContext } from 'vuex';

async function getEthRegisteredAssets(context: ActionContext<any, any>): Promise<Record<string, BridgeAccountAsset>[]> {
async function getEthRegisteredAssets(
context: ActionContext<any, any>
): Promise<Record<string, BridgeRegisteredAsset>[]> {
const { rootDispatch } = assetsActionContext(context);

const networkAssets = await ethBridgeApi.getRegisteredAssets();
const registeredAssets: Record<string, BridgeAccountAsset>[] = [];

for (const asset of networkAssets) {
const soraAddress = asset.address;
const address = asset.externalAddress || (await rootDispatch.web3.getEvmTokenAddressByAssetId(soraAddress));
// [TODO] fix js-lib: externalDecimals = 0 by default, what could be with nft
const decimals = +asset.externalDecimals || (await ethersUtil.getAssetDecimals(address));

registeredAssets.push({
[soraAddress]: {
address,
balance: ZeroStringValue,
decimals,
},
});
}
const registeredAssets = await Promise.all(
Object.entries(networkAssets).map(async ([soraAddress, assetData]) => {
const address = assetData.address || (await rootDispatch.web3.getEvmTokenAddressByAssetId(soraAddress));
const decimals = assetData.decimals ?? (await ethersUtil.getAssetDecimals(address));

return {
[soraAddress]: {
address,
decimals,
kind: assetData.assetKind,
},
};
})
);

return registeredAssets;
}

async function getEvmRegisteredAssets(context: ActionContext<any, any>): Promise<Record<string, BridgeAccountAsset>[]> {
async function getEvmRegisteredAssets(
context: ActionContext<any, any>
): Promise<Record<string, BridgeRegisteredAsset>[]> {
const { rootState } = assetsActionContext(context);

const evmNetworkId = rootState.web3.networkSelected;
const networkAssets = await evmBridgeApi.getRegisteredAssets(evmNetworkId as number);

const evmNetwork = rootState.web3.networkSelected;
const networkAssets = await evmBridgeApi.getRegisteredAssets(evmNetwork as EvmNetwork);
const registeredAssets = Object.entries(networkAssets).map(([soraAddress, assetData]) => {
const accountAsset = {
address: assetData.address as string,
balance: ZeroStringValue,
contract: '', // map with appKinds
decimals: assetData.decimals,
};

return {
[soraAddress]: accountAsset,
[soraAddress]: {
address: assetData.address,
decimals: assetData.decimals,
kind: assetData.appKind,
},
};
});

return registeredAssets;
}

async function getSubRegisteredAssets(context: ActionContext<any, any>): Promise<Record<string, BridgeAccountAsset>[]> {
async function getSubRegisteredAssets(
context: ActionContext<any, any>
): Promise<Record<string, BridgeRegisteredAsset>[]> {
const { rootState } = assetsActionContext(context);

const subNetwork = rootState.web3.networkSelected;

const networkAssets = await subBridgeApi.getRegisteredAssets(subNetwork as SubNetwork);

const registeredAssets = Object.entries(networkAssets).map(([soraAddress, assetData]) => {
const accountAsset = {
address: '',
balance: ZeroStringValue,
decimals: assetData.decimals,
};

return {
[soraAddress]: accountAsset,
[soraAddress]: {
address: '',
decimals: assetData.decimals,
kind: assetData.assetKind,
},
};
});

return registeredAssets;
}

async function getRegisteredAssets(context: ActionContext<any, any>): Promise<Record<string, BridgeAccountAsset>[]> {
async function getRegisteredAssets(context: ActionContext<any, any>): Promise<Record<string, BridgeRegisteredAsset>[]> {
const { rootState } = assetsActionContext(context);

switch (rootState.web3.networkType) {
Expand All @@ -93,6 +89,8 @@ async function getRegisteredAssets(context: ActionContext<any, any>): Promise<Re
case BridgeNetworkType.Sub: {
return await getSubRegisteredAssets(context);
}
default:
return [];
}
}

Expand Down
12 changes: 4 additions & 8 deletions src/store/assets/getters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { XOR } from '@sora-substrate/util/build/assets/consts';
import { api } from '@soramitsu/soraneo-wallet-web';
import { defineGetters } from 'direct-vuex';

import { ZeroStringValue } from '@/consts';
import { assetsGetterContext } from '@/store/assets';

import type { AssetsState } from './types';
import type { RegisteredAccountAsset } from '@sora-substrate/util';
import type { Asset } from '@sora-substrate/util/build/assets/types';
import type { Asset, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types';

const getters = defineGetters<AssetsState>()({
whitelistAssets(...args): Array<Asset> {
Expand Down Expand Up @@ -35,19 +35,15 @@ const getters = defineGetters<AssetsState>()({

if (!asset) return null;

const {
address: externalAddress,
balance: externalBalance,
decimals: externalDecimals,
} = state.registeredAssets[asset.address] || {};
const { address: externalAddress, decimals: externalDecimals } = state.registeredAssets[asset.address] || {};

const { balance } = rootGetters.wallet.account.accountAssetsAddressTable[asset.address] || {};

return {
...asset,
balance,
externalAddress,
externalBalance,
externalBalance: ZeroStringValue, // remove externalBalance
externalDecimals,
};
};
Expand Down
Loading