diff --git a/package.json b/package.json index 5d927e55e..dda77e846 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.32.6", + "@soramitsu/soraneo-wallet-web": "1.32.7", "@walletconnect/ethereum-provider": "^2.11.2", "@walletconnect/modal": "^2.6.2", "core-js": "^3.36.0", diff --git a/public/env.json b/public/env.json index 18c8d7755..8a57ab36e 100644 --- a/public/env.json +++ b/public/env.json @@ -64,7 +64,7 @@ { "chain": "Liberland Dev Testnet", "name": "Soramitsu", - "address": "wss://rpc.liberland-1.lib1.dev.sora2.soramitsu.co.jp" + "address": "wss://ws.liberland-node-1.lib1.dev.sora2.soramitsu.co.jp" } ] }, diff --git a/src/App.vue b/src/App.vue index 607d49cac..dd3bfee13 100644 --- a/src/App.vue +++ b/src/App.vue @@ -106,7 +106,6 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) @state.router.loading pageLoading!: boolean; @getter.settings.nodeIsConnected nodeIsConnected!: boolean; - @getter.settings.chartsEnabled private chartsEnabled!: boolean; @getter.wallet.transactions.firstReadyTx firstReadyTransaction!: Nullable; @getter.wallet.account.isLoggedIn isSoraAccountConnected!: boolean; @getter.libraryTheme libraryTheme!: Theme; diff --git a/src/components/App/Footer/Indexer/utils.ts b/src/components/App/Footer/Indexer/utils.ts deleted file mode 100644 index ea181ebce..000000000 --- a/src/components/App/Footer/Indexer/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IndexerType } from '@soramitsu/soraneo-wallet-web/lib/consts'; - -export function getIndexerName(type: IndexerType): string { - return type.charAt(0).toUpperCase() + type.slice(1).toLowerCase(); -} diff --git a/src/components/App/Footer/StatisticsDialog.vue b/src/components/App/Footer/StatisticsDialog.vue index d5c2deda8..fcd9a444c 100644 --- a/src/components/App/Footer/StatisticsDialog.vue +++ b/src/components/App/Footer/StatisticsDialog.vue @@ -13,12 +13,12 @@ import { components, mixins, WALLET_CONSTS, WALLET_TYPES } from '@soramitsu/soraneo-wallet-web'; import { Component, Mixins } from 'vue-property-decorator'; -import { getIndexerName } from '@/components/App/Footer/Indexer/utils'; import TranslationMixin from '@/components/mixins/TranslationMixin'; import { Components } from '@/consts'; import { lazyComponent } from '@/router'; import { action, state, mutation } from '@/store/decorators'; import { Indexer } from '@/types/indexers'; +import { capitalize } from '@/utils'; const IndexerListView = 'IndexerListView'; const IndexerInfoView = 'IndexerInfoView'; @@ -47,7 +47,7 @@ export default class SelectIndexerDialog extends Mixins(TranslationMixin, mixins return Object.keys(WALLET_CONSTS.IndexerType).map((key) => { const type = WALLET_CONSTS.IndexerType[key]; return { - name: getIndexerName(type), + name: capitalize(type), type, endpoint: this.indexersData[type].endpoint, online: this.indexersData[type].status === WALLET_TYPES.ConnectionStatus.Available, diff --git a/src/components/App/Menu/AppMenu.vue b/src/components/App/Menu/AppMenu.vue index c5506bf83..9212cf85f 100644 --- a/src/components/App/Menu/AppMenu.vue +++ b/src/components/App/Menu/AppMenu.vue @@ -201,9 +201,13 @@ export default class AppMenu extends Mixins(TranslationMixin) { @include scrollbar(0, 100%, true); } +.app-menu { + background: var(--s-color-utility-body); +} + .app-menu.collapsed { @include tablet { - background: var(--s-color-utility-body); + background: transparent; .sidebar-item-content { & > .icon-container + span { @@ -217,6 +221,7 @@ export default class AppMenu extends Mixins(TranslationMixin) { &:hover, &:focus { + background: var(--s-color-utility-body); box-shadow: 20px 20px 60px 0px #0000001a; .sidebar-item-content { diff --git a/src/components/mixins/BridgeTransactionMixin.ts b/src/components/mixins/BridgeTransactionMixin.ts index 9a2fbce09..18fb58fad 100644 --- a/src/components/mixins/BridgeTransactionMixin.ts +++ b/src/components/mixins/BridgeTransactionMixin.ts @@ -25,7 +25,7 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin ); } - get txSoraAccount(): string { + get txInternalAccount(): string { return this.tx?.from ?? ''; } @@ -37,21 +37,19 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin return this.tx?.txId ?? ''; } - get txSoraBlockId(): string { - return this.tx?.blockId ?? ''; - } - get txSoraHash(): string { return this.tx?.hash ?? ''; } - get txInternalHash(): string { - if (!this.isOutgoing) return this.txSoraHash; + get txInternalBlockNumber(): number | undefined { + return this.tx?.blockHeight; + } - return this.txSoraHash || this.txSoraBlockId || this.txSoraId; + get txInternalBlockId(): string { + return this.tx?.blockId ?? ''; } - get txExternalEventIndex(): number | undefined { + get txEventIndex(): number | undefined { return this.tx?.payload?.eventIndex; } @@ -63,6 +61,10 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin return this.tx?.externalBlockHeight; } + get txExternalBlockId(): string { + return this.tx?.externalBlockId ?? ''; + } + get externalNetworkType(): Nullable { return this.tx?.externalNetworkType; } @@ -71,8 +73,13 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin return this.tx?.externalNetwork; } - get soraExplorerLinks(): Array { - return soraExplorerLinks(this.soraNetwork, this.txSoraId, this.txSoraBlockId); + get internalExplorerLinks(): Array { + return soraExplorerLinks( + this.soraNetwork, + this.txSoraId, + this.txInternalBlockNumber ?? this.txInternalBlockId, + this.txEventIndex + ); } get externalExplorerLinks(): Array { @@ -82,13 +89,13 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin this.externalNetworkType, this.externalNetworkId, this.txExternalHash, - this.txExternalBlockNumber, - this.txExternalEventIndex + this.txExternalBlockNumber ?? this.txExternalBlockId, + this.txEventIndex ); } get internalAccountLinks(): Array { - return soraExplorerLinks(this.soraNetwork, this.txSoraAccount, this.txSoraBlockId, true); + return soraExplorerLinks(this.soraNetwork, this.txInternalAccount, undefined, undefined, true); } get externalAccountLinks(): Array { diff --git a/src/components/mixins/ChartSpecMixin.ts b/src/components/mixins/ChartSpecMixin.ts index 7c9121aa8..b73d513a6 100644 --- a/src/components/mixins/ChartSpecMixin.ts +++ b/src/components/mixins/ChartSpecMixin.ts @@ -4,6 +4,7 @@ import { Component, Mixins } from 'vue-property-decorator'; import ThemePaletteMixin from '@/components/mixins/ThemePaletteMixin'; import TranslationMixin from '@/components/mixins/TranslationMixin'; +import { capitalize } from '@/utils'; const LABEL_PADDING = 4; const AXIS_OFFSET = 8; @@ -42,7 +43,7 @@ export default class ChartSpecMixin extends Mixins(ThemePaletteMixin, Translatio const formatted = this.formatDate(+value, timeFormat); if (isNewMonth) { - return `{monthStyle|${formatted.charAt(0).toUpperCase() + formatted.slice(1)}}`; + return `{monthStyle|${capitalize(formatted)}}`; } if (isNewDay) { return `{dateStyle|${formatted}}`; diff --git a/src/components/mixins/NetworkFormatterMixin.ts b/src/components/mixins/NetworkFormatterMixin.ts index dddc9cf45..342410f2b 100644 --- a/src/components/mixins/NetworkFormatterMixin.ts +++ b/src/components/mixins/NetworkFormatterMixin.ts @@ -9,6 +9,7 @@ import { SUB_NETWORKS } from '@/consts/sub'; import { state, getter } from '@/store/decorators'; import type { AvailableNetwork } from '@/store/web3/types'; import type { NetworkData } from '@/types/bridge'; +import { getSubstrateExplorerLinks } from '@/utils'; import { isOutgoingTransaction } from '@/utils/bridge/common/utils'; import { isUnsignedToPart } from '@/utils/bridge/eth/utils'; @@ -23,58 +24,31 @@ const getSubNetworkLinks = ( networkData: NetworkData, type: EvmLinkType, value?: string, // tx hash or account address - blockNumber?: number, + blockId?: number | string, eventIndex?: number ): WALLET_CONSTS.ExplorerLink[] => { - const links: Array = []; - const explorerUrl = networkData.blockExplorerUrls[0]; - - switch (type) { - case EvmLinkType.Account: { - if (explorerUrl && value) { - links.push({ - type: WALLET_CONSTS.ExplorerType.Subscan, - value: `${explorerUrl}/account/${value}`, - }); - } - break; - } - case EvmLinkType.Transaction: { - if (explorerUrl) { - if (value) { - links.push({ - type: WALLET_CONSTS.ExplorerType.Subscan, - value: `${explorerUrl}/extrinsic/${value}`, - }); - } else if (Number.isFinite(blockNumber)) { - let link = `${explorerUrl}/block/${blockNumber}`; - - if (Number.isFinite(eventIndex)) { - link += `?tab=event&event=${blockNumber}-${eventIndex}`; - } - - links.push({ - type: WALLET_CONSTS.ExplorerType.Subscan, - value: link, - }); - } - } - - if (Number.isFinite(blockNumber)) { - const networkUrl = networkData.nodes?.[0].address; - const polkadotBaseLink = `https://polkadot.js.org/apps/?rpc=${networkUrl}#/explorer/query`; - const polkadotLink = { - type: WALLET_CONSTS.ExplorerType.Polkadot, - value: `${polkadotBaseLink}/${blockNumber}`, - }; - - links.push(polkadotLink); - } - break; - } + const baseLinks: WALLET_CONSTS.ExplorerLink[] = []; + + const subscanLink = networkData.blockExplorerUrls[0]; + const polkadotUrl = networkData.nodes?.[0].address; + const polkadotLink = polkadotUrl + ? `https://polkadot.js.org/apps/?rpc=${networkData.nodes?.[0].address}#/explorer/query` + : ''; + + if (subscanLink) { + baseLinks.push({ + type: WALLET_CONSTS.ExplorerType.Subscan, + value: subscanLink, + }); + } + if (polkadotLink) { + baseLinks.push({ + type: WALLET_CONSTS.ExplorerType.Polkadot, + value: polkadotLink, + }); } - return links; + return getSubstrateExplorerLinks(baseLinks, type === EvmLinkType.Account, value, blockId, eventIndex); }; const getEvmNetworkLinks = ( @@ -186,7 +160,7 @@ export default class NetworkFormatterMixin extends Mixins(TranslationMixin) { networkType: BridgeNetworkType, networkId: BridgeNetworkId, value?: string, - blockNumber?: number, + blockId?: number | string, eventIndex?: number, type = EvmLinkType.Transaction ): Array { @@ -198,7 +172,7 @@ export default class NetworkFormatterMixin extends Mixins(TranslationMixin) { } return networkType === BridgeNetworkType.Sub - ? getSubNetworkLinks(networkData, type, value, blockNumber, eventIndex) + ? getSubNetworkLinks(networkData, type, value, blockId, eventIndex) : getEvmNetworkLinks(networkData, type, value); } diff --git a/src/components/pages/Bridge/TransferNotification.vue b/src/components/pages/Bridge/TransferNotification.vue index f3559f777..8b93f1c66 100644 --- a/src/components/pages/Bridge/TransferNotification.vue +++ b/src/components/pages/Bridge/TransferNotification.vue @@ -83,7 +83,7 @@ export default class BridgeTransferNotification extends Mixins(BridgeTransaction } get txLink() { - const link = this.isOutgoing ? this.externalExplorerLinks[0] : this.soraExplorerLinks[0]; + const link = this.isOutgoing ? this.externalExplorerLinks[0] : this.internalExplorerLinks[0]; const network = this.isOutgoing ? this.externalNetworkId : undefined; return this.prepareLink(link, network); diff --git a/src/components/pages/Swap/StatusActionBadge.vue b/src/components/pages/Swap/StatusActionBadge.vue index 4626b0752..7ca4f4682 100644 --- a/src/components/pages/Swap/StatusActionBadge.vue +++ b/src/components/pages/Swap/StatusActionBadge.vue @@ -15,7 +15,7 @@ export default class SwapStatusActionBadge extends Vue {} diff --git a/src/components/pages/Swap/Widget/Form.vue b/src/components/pages/Swap/Widget/Form.vue index 094b04255..30cef897b 100644 --- a/src/components/pages/Swap/Widget/Form.vue +++ b/src/components/pages/Swap/Widget/Form.vue @@ -8,15 +8,6 @@ - -
@@ -184,7 +175,6 @@ import type { Subscription } from 'rxjs'; SelectToken: lazyComponent(Components.SelectToken), TokenInput: lazyComponent(Components.TokenInput), ValueStatusWrapper: lazyComponent(Components.ValueStatusWrapper), - SvgIconButton: lazyComponent(Components.SvgIconButton), FormattedAmount: components.FormattedAmount, }, }) @@ -204,15 +194,12 @@ export default class SwapFormWidget extends Mixins( @getter.assets.xor private xor!: AccountAsset; @getter.swap.swapLiquiditySource liquiditySource!: Nullable; - @getter.settings.chartsFlagEnabled chartsFlagEnabled!: boolean; @getter.settings.nodeIsConnected nodeIsConnected!: boolean; - @getter.settings.chartsEnabled chartsEnabled!: boolean; @getter.wallet.account.isLoggedIn isLoggedIn!: boolean; @getter.swap.tokenFrom tokenFrom!: Nullable; @getter.swap.tokenTo tokenTo!: Nullable; @getter.swap.swapMarketAlgorithm swapMarketAlgorithm!: MarketAlgorithms; - @mutation.settings.setChartsEnabled private setChartsEnabled!: (value: boolean) => void; @mutation.swap.setFromValue private setFromValue!: (value: string) => void; @mutation.swap.setToValue private setToValue!: (value: string) => void; @mutation.swap.setAmountWithoutImpact private setAmountWithoutImpact!: (amount?: CodecString) => void; @@ -561,10 +548,6 @@ export default class SwapFormWidget extends Mixins( this.showSettings = true; } - toggleChart(): void { - this.setChartsEnabled(!this.chartsEnabled); - } - private enableSwapSubscriptions(): void { this.updateBalanceSubscriptions(); this.subscribeOnQuote(); diff --git a/src/components/shared/Settings/SlippageTolerance.vue b/src/components/shared/Settings/SlippageTolerance.vue index 4fae28828..bdf937b02 100644 --- a/src/components/shared/Settings/SlippageTolerance.vue +++ b/src/components/shared/Settings/SlippageTolerance.vue @@ -221,6 +221,7 @@ export default class SlippageTolerance extends Mixins(mixins.NumberFormatterMixi .el-collapse-item__content { padding: 0 !important; + line-height: inherit; } .el-collapse--item .is-active .el-collapse { diff --git a/src/components/shared/TokensRow.vue b/src/components/shared/TokensRow.vue index d007f806c..1a403a512 100644 --- a/src/components/shared/TokensRow.vue +++ b/src/components/shared/TokensRow.vue @@ -46,13 +46,17 @@ export default class TokensRow extends Vue { &__item { display: block; - border-width: 2px; border-style: solid; border-color: transparent; border-radius: 50%; + border-width: 0px; &.border { border-color: var(--s-color-utility-surface); + + & + & { + border-left-width: 2px; + } } & + & { diff --git a/src/components/shared/Widget/Base.vue b/src/components/shared/Widget/Base.vue index 398e91919..a2ca0ba6a 100644 --- a/src/components/shared/Widget/Base.vue +++ b/src/components/shared/Widget/Base.vue @@ -4,7 +4,7 @@
- {{ title }} + {{ capitalize(title) }} @@ -30,6 +30,8 @@ + + + + diff --git a/src/components/shared/Widget/PriceChart.vue b/src/components/shared/Widget/PriceChart.vue index ae70ef09b..fbd4e2af5 100644 --- a/src/components/shared/Widget/PriceChart.vue +++ b/src/components/shared/Widget/PriceChart.vue @@ -9,6 +9,7 @@ ()({ }, externalAccountFormatted(...args): string { - const { getters, state, rootState } = bridgeGetterContext(args); + const { getters, rootState } = bridgeGetterContext(args); const { subSS58 } = rootState.web3; - if (getters.isSubBridge && state.isSoraToEvm && getters.externalAccount) { - return formatSubAddress(getters.externalAccount, subSS58); - } else { - return getters.externalAccount; - } + if (!getters.isSubBridge) return getters.externalAccount; + + return formatSubAddress(getters.externalAccount, subSS58); }, sender(...args): string { diff --git a/src/store/settings/getters.ts b/src/store/settings/getters.ts index af553e7ee..a3ac33cdd 100644 --- a/src/store/settings/getters.ts +++ b/src/store/settings/getters.ts @@ -31,14 +31,6 @@ const getters = defineGetters()({ const { state, getters } = settingsGetterContext(args); return !!getters.x1ApiKey && !!state.featureFlags.x1ex; }, - chartsFlagEnabled(...args): boolean { - const { state } = settingsGetterContext(args); - return !!state.featureFlags.charts; - }, - chartsEnabled(...args): boolean { - const { state } = settingsGetterContext(args); - return !!state.featureFlags.charts && state.chartsEnabled; - }, soraCardEnabled(...args): Nullable { const { state } = settingsGetterContext(args); return state.featureFlags.soraCard; diff --git a/src/store/settings/mutations.ts b/src/store/settings/mutations.ts index 9e11b374f..5788949b3 100644 --- a/src/store/settings/mutations.ts +++ b/src/store/settings/mutations.ts @@ -17,10 +17,6 @@ const mutations = defineMutations()({ state.marketAlgorithm = value; storage.set('marketAlgorithm', value); }, - setChartsEnabled(state, value: boolean): void { - state.chartsEnabled = value; - storage.set('сhartsEnabled', value); // TODO: replace Cyrillic character - }, setTransactionDeadline(state, value: number): void { state.transactionDeadline = value; storage.set('transactionDeadline', value); diff --git a/src/store/settings/state.ts b/src/store/settings/state.ts index 1128dc26f..9845d94ae 100644 --- a/src/store/settings/state.ts +++ b/src/store/settings/state.ts @@ -9,7 +9,6 @@ import type { SettingsState } from './types'; function initialState(): SettingsState { const disclaimerApprove = settingsStorage.get('disclaimerApprove'); - const chartsEnabled = storage.get('сhartsEnabled'); const isBrowserNotificationApiAvailable = 'Notification' in window; const appConnection = new NodesConnection(settingsStorage, connection); @@ -18,7 +17,6 @@ function initialState(): SettingsState { featureFlags: {}, slippageTolerance: storage.get('slippageTolerance') || DefaultSlippageTolerance, marketAlgorithm: (storage.get('marketAlgorithm') || DefaultMarketAlgorithm) as MarketAlgorithms, - chartsEnabled: chartsEnabled ? Boolean(JSON.parse(chartsEnabled)) : true, userDisclaimerApprove: disclaimerApprove ? JSON.parse(disclaimerApprove) : false, transactionDeadline: Number(storage.get('transactionDeadline')) || 20, isBrowserNotificationApiAvailable, diff --git a/src/store/settings/types.ts b/src/store/settings/types.ts index d30f34a5c..f32972856 100644 --- a/src/store/settings/types.ts +++ b/src/store/settings/types.ts @@ -23,7 +23,6 @@ export type SettingsState = { featureFlags: FeatureFlags; slippageTolerance: string; marketAlgorithm: MarketAlgorithms; - chartsEnabled: boolean; userDisclaimerApprove: boolean; transactionDeadline: number; language: string; diff --git a/src/types/layout.ts b/src/types/layout.ts new file mode 100644 index 000000000..27e05cd7f --- /dev/null +++ b/src/types/layout.ts @@ -0,0 +1 @@ +export type WidgetsVisibilityModel = Record; diff --git a/src/utils/bridge/sub/classes/adapters/relaychain.ts b/src/utils/bridge/sub/classes/adapters/relaychain.ts index 0c23edff2..f691f79f0 100644 --- a/src/utils/bridge/sub/classes/adapters/relaychain.ts +++ b/src/utils/bridge/sub/classes/adapters/relaychain.ts @@ -64,13 +64,13 @@ export class RelaychainAdapter extends SubAdapter { switch (this.subNetwork) { case SubNetworkId.Rococo: // Hardcoded value for Rococo - 0.000125 ROC - return '125810197'; + return new FPNumber(0.000125, asset.externalDecimals).toCodecString(); case SubNetworkId.Kusama: - // Hardcoded value for Kusama - 0.0007 KSM - return '700000000'; + // Hardcoded value for Kusama - 0.002 KSM + return new FPNumber(0.002, asset.externalDecimals).toCodecString(); case SubNetworkId.Polkadot: - // Hardcoded value for Polkadot - 0.01836 DOT - return '183600000'; + // Hardcoded value for Polkadot - 0.059 DOT + return new FPNumber(0.059, asset.externalDecimals).toCodecString(); default: return '0'; } diff --git a/src/utils/bridge/sub/classes/history.ts b/src/utils/bridge/sub/classes/history.ts index 9ce7736a8..081398350 100644 --- a/src/utils/bridge/sub/classes/history.ts +++ b/src/utils/bridge/sub/classes/history.ts @@ -10,6 +10,7 @@ import { subBridgeApi } from '@/utils/bridge/sub/api'; import { SubNetworksConnector, subBridgeConnector } from '@/utils/bridge/sub/classes/adapter'; import { getDepositedBalance, + getParachainBridgeAppMintedBalance, getMessageAcceptedNonces, getMessageDispatchedNonces, isMessageDispatchedNonces, @@ -54,9 +55,8 @@ const findTxInBlock = async (blockHash: string, soraHash: string) => { const txEvents = getTxEvents(blockEvents, txIndex); const extrinsics = await api.system.getExtrinsicsFromBlock(blockHash); const tx = extrinsics[txIndex]; - const txHash = tx.hash.toString(); - return { hash: txHash, events: txEvents }; + return { tx, txEvents, blockEvents }; }; class SubBridgeHistory extends SubNetworksConnector { @@ -89,13 +89,14 @@ class SubBridgeHistory extends SubNetworksConnector { } public async updateAccountHistory( + network: SubNetwork, address: string, inProgressIds: Record, assetDataByAddress: (address?: Nullable) => Nullable, updateCallback?: FnWithoutArgs | AsyncFnWithoutArgs ): Promise { try { - const transactions = await subBridgeApi.getUserTransactions(address, this.network.subNetwork); + const transactions = await subBridgeApi.getUserTransactions(address, network); if (!transactions.length) return; @@ -176,22 +177,26 @@ class SubBridgeHistory extends SubNetworksConnector { history.blockId = blockId; history.externalBlockId = externalBlockId; - const [{ hash, events: soraEvents }, startTime] = await Promise.all([ + const [{ tx: soraTx, txEvents: soraTxEvents, blockEvents: soraBlockEvents }, startTime] = await Promise.all([ findTxInBlock(blockId, id), api.system.getBlockTimestamp(blockId, this.soraApi), ]); - history.txId = hash; + history.txId = soraTx.hash.toString(); history.startTime = history.endTime = startTime; if (isOutgoing) { return await this.processOutgoingTxExternalData({ history, asset, - soraEvents, + events: soraTxEvents, }); } else { - return await this.processIncomingTxExternalData({ history, soraEvents }); + return await this.processIncomingTxExternalData({ + history, + txEvents: soraTxEvents, + blockEvents: soraBlockEvents, + }); } } catch (error) { console.error(`[${id}]`, error); @@ -212,17 +217,17 @@ class SubBridgeHistory extends SubNetworksConnector { private async processOutgoingTxExternalData({ history, asset, - soraEvents, + events, }: { history: SubHistory; asset: Nullable; - soraEvents: any[]; + events: any[]; }): Promise { // update SORA network fee - const soraFeeEvent = soraEvents.find((e) => this.soraApi.events.transactionPayment.TransactionFeePaid.is(e.event)); + const soraFeeEvent = events.find((e) => this.soraApi.events.transactionPayment.TransactionFeePaid.is(e.event)); history.soraNetworkFee = soraFeeEvent.event.data[1].toString(); // sended from SORA nonces - const [soraBatchNonce, soraMessageNonce] = getMessageAcceptedNonces(soraEvents, this.soraApi); + const [soraBatchNonce, soraMessageNonce] = getMessageAcceptedNonces(events, this.soraApi); // api for Standalone network or SORA parachain const networkApi = this.getIntermediateApi(history); const networkBlockId = history.externalBlockId as string; @@ -376,13 +381,15 @@ class SubBridgeHistory extends SubNetworksConnector { private async processIncomingTxExternalData({ history, - soraEvents, + txEvents, + blockEvents, }: { history: SubHistory; - soraEvents: any[]; + txEvents: any[]; + blockEvents: any[]; }): Promise> { // find SORA hash event index - const requestStatusUpdateEventIndex = soraEvents.findIndex((e) => { + const requestStatusUpdateEventIndex = txEvents.findIndex((e) => { if (!this.soraApi.events.bridgeProxy.RequestStatusUpdate.is(e.event)) return false; const hash = e.event.data[0].toString(); @@ -391,7 +398,7 @@ class SubBridgeHistory extends SubNetworksConnector { }); // Received on SORA nonces const [soraBatchNonce, soraMessageNonce] = getMessageDispatchedNonces( - soraEvents.slice(requestStatusUpdateEventIndex), + txEvents.slice(requestStatusUpdateEventIndex), this.soraApi ); // api for Standalone network or SORA parachain @@ -429,6 +436,9 @@ class SubBridgeHistory extends SubNetworksConnector { const incomingMessageFromRelaychain = networkExtrinsicEvents.find((e) => parachainApi.events.parachainSystem.DownwardMessagesProcessed.is(e.event) ); + // Token is minted to account event + const [_, eventIndex] = getParachainBridgeAppMintedBalance(blockEvents, history.from as string, this.soraApi); + history.payload.eventIndex = eventIndex; if (incomingMessageFromRelaychain) { history.parachainBlockId = history.externalBlockId; @@ -564,7 +574,13 @@ export const updateSubBridgeHistory = await subBridgeHistory.clearHistory(networkSelected as SubNetwork, inProgressIds, updateCallback); } - await subBridgeHistory.updateAccountHistory(address, inProgressIds, assetDataByAddress, updateCallback); + await subBridgeHistory.updateAccountHistory( + networkSelected as SubNetwork, + address, + inProgressIds, + assetDataByAddress, + updateCallback + ); } catch (error) { console.error(error); } diff --git a/src/utils/bridge/sub/classes/reducers.ts b/src/utils/bridge/sub/classes/reducers.ts index 82ba290aa..7d2a8da19 100644 --- a/src/utils/bridge/sub/classes/reducers.ts +++ b/src/utils/bridge/sub/classes/reducers.ts @@ -13,6 +13,7 @@ import { SubTransferType } from '@/utils/bridge/sub/types'; import { getBridgeProxyHash, getDepositedBalance, + getParachainBridgeAppMintedBalance, getMessageAcceptedNonces, isMessageDispatchedNonces, isAssetAddedToChannel, @@ -75,16 +76,16 @@ export class SubBridgeReducer extends BridgeReducer { updateTransactionPayload(id: string, params: Record) { const { payload: prevPayload } = this.getTransaction(id); - this.updateTransactionParams(id, { ...prevPayload, ...params }); + this.updateTransactionParams(id, { payload: { ...prevPayload, ...params } }); } async saveParachainBlock(id: string): Promise { - const soraParachainApi = this.connector.soraParachain?.api; + const adapter = this.connector.soraParachain; - if (!soraParachainApi) throw new Error(`[${this.constructor.name}]: Sora Parachain Api is not exists`); + if (!adapter) throw new Error(`[${this.constructor.name}]: Sora Parachain Adapter is not exists`); // get current sora parachain block number - const parachainStartBlock = (await soraParachainApi.query.system.number()).toNumber(); + const parachainStartBlock = await adapter.getBlockNumber(); // update history data this.updateTransactionPayload(id, { parachainStartBlock }); } @@ -150,10 +151,19 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { private async updateTxSigningData(id: string): Promise { const tx = this.getTransaction(id); - if (!(tx.externalBlockId && tx.externalHash)) { + if (!(tx.externalBlockId && tx.externalHash && tx.externalBlockHeight)) { + const adapter = this.connector.network; + + await adapter.connect(); + + const externalHash = tx.txId as string; + const externalBlockId = tx.blockId as string; + const externalBlockHeight = await api.system.getBlockNumber(externalBlockId, adapter.api); + this.updateTransactionParams(id, { - externalHash: tx.txId, // network tx hash - externalBlockId: tx.blockId, // network block hash + externalHash, + externalBlockId, + externalBlockHeight, }); } } @@ -290,8 +300,7 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { } } - const received = FPNumber.fromCodecValue(recipientAmount, this.asset.externalDecimals); - const amount2 = received.toString(); + const amount2 = FPNumber.fromCodecValue(recipientAmount, this.asset.externalDecimals).toString(); this.updateTransactionPayload(id, { messageNonce, batchNonce }); this.updateTransactionParams(id, { amount2 }); @@ -310,6 +319,8 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { let subscription!: Subscription; let soraHash!: string; + let amount!: string; + let eventIndex!: number; try { await new Promise((resolve, reject) => { @@ -324,7 +335,14 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { if (substrateDispatchEventIndex === -1) return; - soraHash = getBridgeProxyHash(events.slice(substrateDispatchEventIndex), subBridgeApi.api); + const foundedEvents = events.slice(substrateDispatchEventIndex); + + soraHash = getBridgeProxyHash(foundedEvents, subBridgeApi.api); + [amount, eventIndex] = getParachainBridgeAppMintedBalance( + foundedEvents, + tx.from as string, + subBridgeApi.api + ); resolve(); } catch (error) { @@ -336,9 +354,10 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { subscription.unsubscribe(); } - this.updateTransactionParams(id, { - hash: soraHash, - }); + const amount2 = FPNumber.fromCodecValue(amount, this.asset.decimals).toString(); + + this.updateTransactionParams(id, { hash: soraHash, amount2 }); + this.updateTransactionPayload(id, { eventIndex }); } private async waitSoraBlockByHash(id: string): Promise { diff --git a/src/utils/bridge/sub/utils.ts b/src/utils/bridge/sub/utils.ts index 4c1c3b70f..18ef1abba 100644 --- a/src/utils/bridge/sub/utils.ts +++ b/src/utils/bridge/sub/utils.ts @@ -51,11 +51,10 @@ export const getBridgeProxyHash = (events: Array, api: ApiPromise): string // Native token for network export const getDepositedBalance = (events: Array, to: string, api: ApiPromise): [string, number] => { - const index = events.findIndex( - (e) => - api.events.balances.Deposit.is(e.event) && - subBridgeApi.formatAddress(e.event.data.who.toString()) === subBridgeApi.formatAddress(to) - ); + const index = events.findIndex((e) => { + if (!api.events.balances.Deposit.is(e.event)) return false; + return subBridgeApi.formatAddress(e.event.data.who.toString()) === subBridgeApi.formatAddress(to); + }); if (index === -1) throw new Error(`Unable to find "balances.Deposit" event`); @@ -65,6 +64,25 @@ export const getDepositedBalance = (events: Array, to: string, api: ApiProm return [balance, index]; }; +// for SORA from Relaychain +export const getParachainBridgeAppMintedBalance = ( + events: Array, + to: string, + api: ApiPromise +): [string, number] => { + const index = events.findIndex((e) => { + if (!api.events.parachainBridgeApp.Minted.is(e.event)) return false; + return subBridgeApi.formatAddress(e.event.data[3].toString()) === subBridgeApi.formatAddress(to); + }); + + if (index === -1) throw new Error(`Unable to find "parachainBridgeApp.Minted" event`); + + const event = events[index]; + const balance = event.event.data[4].toString(); + + return [balance, index]; +}; + export const getReceivedAmount = (sendedAmount: string, receivedAmount: CodecString, decimals?: number) => { const sended = new FPNumber(sendedAmount, decimals); const received = FPNumber.fromCodecValue(receivedAmount, decimals); diff --git a/src/utils/index.ts b/src/utils/index.ts index 70caa2726..5b6cb6fdd 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -48,6 +48,8 @@ export const copyToClipboard = async (text: string): Promise => { } }; +export const capitalize = (text: string) => text.charAt(0).toUpperCase() + text.slice(1); + export const formatAddress = (address: string, length = address.length / 2): string => { return `${address.slice(0, length / 2)}...${address.slice(-length / 2)}`; }; @@ -384,53 +386,67 @@ export const sortPools = (a: PoolAssets, b: PoolAssets) = export const calcElScrollGutter: () => number = scrollbarWidth; -export const soraExplorerLinks = ( - soraNetwork: Nullable, - txValue: Nullable, - blockHash: Nullable, - isAccount = false -): Array => { - if (!soraNetwork) return []; +const getSubscanTxLink = (baseUrl: string, txId?: string, blockId?: number | string, eventIndex?: number): string => { + if (!(txId || blockId)) return ''; - const baseLinks = getExplorerLinks(soraNetwork); + let link = txId ? `${baseUrl}/extrinsic/${txId}` : `${baseUrl}/block/${blockId}`; - if (!baseLinks.length) return []; + if (Number.isFinite(eventIndex) && Number.isFinite(blockId)) { + link += `?event=${blockId}-${eventIndex}`; - if (isAccount) { - return baseLinks - .filter(({ type }) => type !== WALLET_CONSTS.ExplorerType.Polkadot) - .map(({ type, value }) => ({ type, value: `${value}/account/${txValue}` })); + if (!txId) { + link += '&tab=event'; + } } - const txId = txValue ?? blockHash; + return link; +}; - if (!txId) return []; +const getPolkadotTxLink = (baseUrl: string, txId?: string, blockId?: number | string, eventIndex?: number): string => { + if (blockId) { + return `${baseUrl}/${blockId}`; + } + return ''; +}; - if (!txValue) { - // txId is block - return baseLinks.map(({ type, value }) => { - const link = { type } as WALLET_CONSTS.ExplorerLink; - if (type === WALLET_CONSTS.ExplorerType.Polkadot) { - link.value = `${value}/${txId}`; - } else { - link.value = `${value}/block/${txId}`; - } - return link; - }); +export const getSubstrateExplorerLinks = ( + baseLinks: WALLET_CONSTS.ExplorerLink[], + isAccount = false, + id?: string, // tx hash or account address + blockId?: number | string, + eventIndex?: number +) => { + if (!baseLinks.length) return []; + + if (isAccount) { + return baseLinks + .filter(({ type }) => type !== WALLET_CONSTS.ExplorerType.Polkadot) + .map(({ type, value }) => ({ type, value: `${value}/account/${id}` })); } return baseLinks .map(({ type, value }) => { const link = { type } as WALLET_CONSTS.ExplorerLink; - if (type === WALLET_CONSTS.ExplorerType.Sorascan) { - link.value = `${value}/transaction/${txId}`; - } else if (type === WALLET_CONSTS.ExplorerType.Subscan) { - link.value = `${value}/extrinsic/${txId}`; - } else if (blockHash) { - // ExplorerType.Polkadot - link.value = `${value}/${blockHash}`; + + if (type === WALLET_CONSTS.ExplorerType.Subscan) { + link.value = getSubscanTxLink(value, id, blockId, eventIndex); + } else if (type === WALLET_CONSTS.ExplorerType.Polkadot) { + link.value = getPolkadotTxLink(value, id, blockId, eventIndex); } + return link; }) - .filter((value) => !!value.value); // Polkadot explorer won't be shown without block + .filter((value) => !!value.value); +}; + +export const soraExplorerLinks = ( + soraNetwork: Nullable, + txValue?: string, + blockId?: number | string, + eventIndex?: number, + isAccount = false +): Array => { + if (!soraNetwork) return []; + + return getSubstrateExplorerLinks(getExplorerLinks(soraNetwork), isAccount, txValue, blockId, eventIndex); }; diff --git a/src/utils/storage.ts b/src/utils/storage.ts index fc0a65b09..c114f7156 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -1,4 +1,8 @@ +import { Storage } from '@sora-substrate/util'; import { storage as soraStorage } from '@soramitsu/soraneo-wallet-web'; export { settingsStorage } from '@soramitsu/soraneo-wallet-web'; + export default soraStorage; + +export const layoutsStorage = new Storage('layouts'); diff --git a/src/views/BridgeTransaction.vue b/src/views/BridgeTransaction.vue index a2d068374..6f9be4c68 100644 --- a/src/views/BridgeTransaction.vue +++ b/src/views/BridgeTransaction.vue @@ -328,10 +328,6 @@ export default class BridgeTransaction extends Mixins( return this.asset ? this.getFiatAmountByCodecString(this.txExternalTransferFee, this.asset) : null; } - get txExternalBlockId(): string { - return this.tx?.externalBlockId ?? ''; - } - get txParachainBlockId(): string { return (this.historyItem as SubHistory)?.parachainBlockId ?? ''; } @@ -492,10 +488,9 @@ export default class BridgeTransaction extends Mixins( } get confirmationBlocksLeft(): number { - if (this.isOutgoing || !this.historyItem?.externalBlockHeight || !this.externalBlockNumber) return 0; - if (!Number.isFinite(this.historyItem?.externalBlockHeight)) return 0; + if (!(this.isEvmTxType && !this.isOutgoing && this.txExternalBlockNumber && this.externalBlockNumber)) return 0; - const blocksLeft = +this.historyItem.externalBlockHeight + 30 - this.externalBlockNumber; + const blocksLeft = this.txExternalBlockNumber + 30 - this.externalBlockNumber; return Math.max(blocksLeft, 0); } @@ -514,9 +509,15 @@ export default class BridgeTransaction extends Mixins( router.push({ name: this.prevRoute as string | undefined }); } + get txInternalHash(): string { + if (!this.isOutgoing) return this.txSoraHash; + + return this.txSoraHash || this.txInternalBlockId || this.txSoraId; + } + get accountLinks(): LinkData[] { const name = this.t('accountAddressText'); - const internal = this.getLinkData(this.txSoraAccount, this.internalAccountLinks, name); + const internal = this.getLinkData(this.txInternalAccount, this.internalAccountLinks, name); const external = this.getLinkData(this.txExternalAccount, this.externalAccountLinks, name, this.externalNetworkId); return this.sortLinksByTxDirection([internal, external]); @@ -525,7 +526,7 @@ export default class BridgeTransaction extends Mixins( get transactionLinks(): LinkData[] { const txHashName = this.t('bridgeTransaction.transactionHash'); const txBlockName = this.t('transaction.blockId'); - const internal = this.getLinkData(this.txInternalHash, this.soraExplorerLinks, txHashName); + const internal = this.getLinkData(this.txInternalHash, this.internalExplorerLinks, txHashName); const parachain = this.getLinkData( this.txParachainBlockId, this.parachainExplorerLinks, diff --git a/src/views/Swap.vue b/src/views/Swap.vue index 4ac9c3031..5d6e95174 100644 --- a/src/views/Swap.vue +++ b/src/views/Swap.vue @@ -2,11 +2,12 @@
- + +
- - + +
@@ -21,28 +22,65 @@ import TranslationMixin from '@/components/mixins/TranslationMixin'; import { Components, PageNames } from '@/consts'; import { lazyComponent } from '@/router'; import { action, getter, state } from '@/store/decorators'; +import type { WidgetsVisibilityModel } from '@/types/layout'; +import { layoutsStorage } from '@/utils/storage'; import type { AccountAsset } from '@sora-substrate/util/build/assets/types'; +enum SwapWidgets { + Chart = 'swapChart', + Transactions = 'swapTransactions', + Distribution = 'swapDistribution', +} + +const storageTemporaryKey = 'swapWidgets'; + @Component({ components: { SwapFormWidget: lazyComponent(Components.SwapFormWidget), SwapChartWidget: lazyComponent(Components.SwapChartWidget), SwapTransactionsWidget: lazyComponent(Components.SwapTransactionsWidget), SwapDistributionWidget: lazyComponent(Components.SwapDistributionWidget), + CustomiseWidget: lazyComponent(Components.CustomiseWidget), }, }) export default class Swap extends Mixins(mixins.LoadingMixin, TranslationMixin, SelectedTokenRouteMixin) { @state.swap.isAvailable isAvailable!: boolean; @state.router.prev private prevRoute!: Nullable; - @getter.settings.chartsEnabled chartsEnabled!: boolean; @getter.swap.tokenFrom tokenFrom!: Nullable; @getter.swap.tokenTo tokenTo!: Nullable; @action.swap.setTokenFromAddress private setTokenFromAddress!: (address?: string) => Promise; @action.swap.setTokenToAddress private setTokenToAddress!: (address?: string) => Promise; + readonly SwapWidgets = SwapWidgets; + + customise = false; + + widgets: WidgetsVisibilityModel = { + [SwapWidgets.Chart]: true, + [SwapWidgets.Distribution]: true, + [SwapWidgets.Transactions]: false, + }; + + get widgetsSync(): WidgetsVisibilityModel { + return this.widgets; + } + + set widgetsSync(widgetsModel: WidgetsVisibilityModel) { + this.widgets = widgetsModel; + layoutsStorage.set(storageTemporaryKey, JSON.stringify(widgetsModel)); + } + + get labels(): Record { + return { + [SwapWidgets.Chart]: this.t('priceChartText'), + [SwapWidgets.Distribution]: this.t('swap.route'), + [SwapWidgets.Transactions]: this.tc('transactionText', 2), + }; + } + @Watch('tokenFrom') @Watch('tokenTo') private updateRouteTokensParams() { @@ -54,6 +92,12 @@ export default class Swap extends Mixins(mixins.LoadingMixin, TranslationMixin, } created(): void { + const widgetsModel = layoutsStorage.get(storageTemporaryKey); + + if (widgetsModel) { + this.widgets = JSON.parse(widgetsModel); + } + this.withApi(async () => { this.parseCurrentRoute(); // Need to wait the previous page beforeDestroy somehow to set the route params @@ -93,7 +137,7 @@ export default class Swap extends Mixins(mixins.LoadingMixin, TranslationMixin, .swap-chart-widget, .swap-form-widget { @include desktop { - min-height: 517px; + min-height: 492px; } } } diff --git a/yarn.lock b/yarn.lock index 95fc432db..ab17e8329 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== -"@0no-co/graphql.web@^1.0.1": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.4.tgz#9606eb651955499525d068ce0ad8bea596286ce2" - integrity sha512-W3ezhHGfO0MS1PtGloaTpg0PbaT8aZSmmaerL7idtU5F7oCI+uu25k+MsMS31BVFlp4aMkHSrNRxiD72IlK8TA== +"@0no-co/graphql.web@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.6.tgz#3def68bbaf654a301bd910ce3744506cad97ab9a" + integrity sha512-KZ7TnwMcQJcFgzjoY623AVxtlDQonkqp3rSz0wb15/jHPyU1v5gynUibEpuutDeoyGJ5Tp+FwxjGyDGDwq3vIw== "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" @@ -2349,69 +2349,69 @@ resolved "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.2.tgz#a53515db25d8038374381b73af20bb4f2e508d87" integrity sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w== -"@sora-substrate/api@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/api/-/api-1.32.11.tgz#ec365d84bab405f51eecd2605dff59f2ff99c625" - integrity sha512-/v/rxIj+639k9hXvN2q8BaKIaOxLzEiz1t2jc5UQ8UvisaNHPEC7mPpaHwh+dKYxQ1pOclBKadWoqfnWealoTg== +"@sora-substrate/api@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/api/-/api-1.33.2.tgz#689bedcfcbef0965ba3208a6e1b07eb9a730c191" + integrity sha512-2HgxVcHuz/XDJxhM5UmFB/vf1U328FU/4y2e0d1eQZUZ2bdCQBwvBhursRKR3oDsq0k4nmUo56XN/4mDO5JSmg== dependencies: "@open-web3/orml-api-derive" "1.1.4" "@polkadot/api" "9.14.2" - "@sora-substrate/types" "1.32.11" + "@sora-substrate/types" "1.33.2" -"@sora-substrate/connection@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/connection/-/connection-1.32.11.tgz#c60e051d72f906e914b62fbf6ca673a7471b5f75" - integrity sha512-uftH+j1d1AfeI4fyNAGy9Fovoql4dvuNXdBAb6dn8hAHXHheiwyKNHoU7IacMGOvg516hXkuRxnR1Hq1apNqxw== +"@sora-substrate/connection@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/connection/-/connection-1.33.2.tgz#c9d2c7e0f303bb04a0b9e5503f82e40291c72c75" + integrity sha512-rgsUaHe41ojpZoHtM592DfAvOm8qvopyw6GtG/0Hsq5I+kuW8UjAaNeGnP6BZO1eVnCi2H0/9lu3vFcTPkLT7w== dependencies: - "@sora-substrate/api" "1.32.11" + "@sora-substrate/api" "1.33.2" -"@sora-substrate/liquidity-proxy@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/liquidity-proxy/-/liquidity-proxy-1.32.11.tgz#2964ba8a806829a72cef132994521e662c8694b3" - integrity sha512-V8qV6utNtCKwo50dfJi5opx0R5HhTAlKUo/KbFnZp+kWEqSZkopCOiPsW3Eqq1y2znZCpMZd4qX3tojV4hWIcg== +"@sora-substrate/liquidity-proxy@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/liquidity-proxy/-/liquidity-proxy-1.33.2.tgz#0568eaf2e920d0611a5e758f87f2dffbb1aa8d33" + integrity sha512-UiG+5cp72N2b528nkG5rCzP4LPOjTs+VTaB2CX+7TA2U92Qk55Urf9poK1wiKhXhMMY7E5g2cAuqIVMnF3WyBg== dependencies: - "@sora-substrate/math" "1.32.11" + "@sora-substrate/math" "1.33.2" -"@sora-substrate/math@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/math/-/math-1.32.11.tgz#a6e1d8cdd48f2176c4aaf98661c874eefe03a9a9" - integrity sha512-9XzIW4+VM4Suyn9u2wKEbdZ25IPau0Fufe9BrXpDI58L/Qm7chRVdg+ebzREQEeVgUdPZ8jwzGBatzjCdgwGcw== +"@sora-substrate/math@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/math/-/math-1.33.2.tgz#def1f6276ab66fccbc3a81e1c07ace2aedc0e68f" + integrity sha512-nAFcmBnfS3UBR84YxTYu6TbEu6OdlheghXOlpy8fgvmyXzI4vlEW2eKaqMMRz6pErrHwtzFevCbm6O2g9x6boQ== dependencies: "@polkadot/types" "9.14.2" bignumber.js "^9.1.2" lodash "^4.17.21" -"@sora-substrate/type-definitions@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/type-definitions/-/type-definitions-1.32.11.tgz#bab58056fe12f696395b959e8b8a63a6f599be97" - integrity sha512-fC+pSJ20Bp5FMBhxvBec5rdStfi3kwO3xzowIY7hyOHZHiQThU/7pjgnejDGiAMsaOQOFTt/1aMdpcCCeKyG7A== +"@sora-substrate/type-definitions@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/type-definitions/-/type-definitions-1.33.2.tgz#e3874322cefdb41cf2fd390470bce06a002cdaca" + integrity sha512-Z3FT+2xbaf3IjRub7E5A8l0PCr79aH+Ocn1+x3QKGA/HL3V+GrI1SDSdgCEQ26bCcbIGtyRA5r+ZrxXodtcxmA== dependencies: "@open-web3/orml-type-definitions" "1.1.4" -"@sora-substrate/types@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/types/-/types-1.32.11.tgz#55237b33e1e8fe37ef33856169ff3ef9a22f5882" - integrity sha512-WF5MH2gzc7zyUqwvJXzw7MtCyaNFPJXtiRX9hOTiTTpsBnNRchfUZkNAHfNsM5xBD+RoOv1XGxVYc62unuuosw== +"@sora-substrate/types@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/types/-/types-1.33.2.tgz#9a0232a40e21c2cd3d6d9a2c0e1f261a23ae2fa4" + integrity sha512-w3roB1v2tCWHM1oONQGt72R3oukfIfMzn0QEQ7dgXdJ8xO5jUT1w0pO3E1MyT5vOiy5TtgyyT9uapXjBuJ+DRQ== dependencies: "@open-web3/api-mobx" "0.9.4-26" "@open-web3/orml-types" "1.1.4" "@polkadot/api" "9.14.2" "@polkadot/typegen" "9.14.2" "@polkadot/types" "9.14.2" - "@sora-substrate/type-definitions" "1.32.11" + "@sora-substrate/type-definitions" "1.33.2" -"@sora-substrate/util@1.32.11": - version "1.32.11" - resolved "https://registry.yarnpkg.com/@sora-substrate/util/-/util-1.32.11.tgz#147c7f80842c9151459ffea58a83778c7d3a012a" - integrity sha512-gRcixdXEz7QD78yJnus7HfL5IVuPqm2ANZjMmWpHTwrBRMiGRRncZiqNn2J6jP7kNQpKLpLkKtaOTUuvbU8pWA== +"@sora-substrate/util@1.33.2": + version "1.33.2" + resolved "https://registry.yarnpkg.com/@sora-substrate/util/-/util-1.33.2.tgz#3f35a53713b846bee8db2cb044dec0da58cbc58a" + integrity sha512-/F1+W1TPetsbVO/rFt4mC5eA9+TWn7PsDKlJ4g0ulUT10UOlhJaAZLhIN476qCt9EtvPF0etnXAiCcxal/nbfw== dependencies: "@polkadot/ui-keyring" "2.12.1" - "@sora-substrate/api" "1.32.11" - "@sora-substrate/connection" "1.32.11" - "@sora-substrate/liquidity-proxy" "1.32.11" - "@sora-substrate/math" "1.32.11" - "@sora-substrate/types" "1.32.11" - axios "^1.6.7" + "@sora-substrate/api" "1.33.2" + "@sora-substrate/connection" "1.33.2" + "@sora-substrate/liquidity-proxy" "1.33.2" + "@sora-substrate/math" "1.33.2" + "@sora-substrate/types" "1.33.2" + axios "^1.6.8" crypto-js "^4.2.0" lodash "^4.17.21" @@ -2443,27 +2443,27 @@ vue-property-decorator "^9.1.2" vuex "^3.6.2" -"@soramitsu/soraneo-wallet-web@1.32.6": - version "1.32.6" - resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.6.tgz#bf50576ef2111062b57ef4382031a2d0f13b54e0" - integrity sha512-BLhpV5m1E8vb40H90Fq+PGe+XrjZcovH6OY6f17kctYt5cySwFXFQBJ5WsUu3RU+dJoFubXUAiAbRQdmBE4xjg== +"@soramitsu/soraneo-wallet-web@1.32.7": + version "1.32.7" + resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.7.tgz#5557a1900d82e2e001ff93985f8cbd593b713d5b" + integrity sha512-4maKp1nKpi10itmg748WHgUqVV4UVz/ZQukvcKCGUt8sNuP+0tNqe/BU7nD3One1cSPR4Y38WFiKH59cO810xQ== dependencies: "@polkadot/vue-identicon" "2.12.1" - "@sora-substrate/util" "1.32.11" + "@sora-substrate/util" "1.33.2" "@sora-test/wallet-connect" "^0.0.9" "@soramitsu-ui/ui-vue2" "^1.1.1" - "@urql/core" "^4.1.2" + "@urql/core" "^5.0.0" "@zxing/browser" "^0.1.4" "@zxing/library" "^0.20.0" base-64 "^1.0.0" - core-js "^3.32.2" + core-js "^3.36.1" crypto-js "^4.2.0" crypto-random-string "^5.0.0" - dayjs "^1.11.9" + dayjs "^1.11.10" direct-vuex "^0.12.1" file-saver "^2.0.5" - graphql "^16.8.0" - graphql-ws "^5.13.1" + graphql "^16.8.1" + graphql-ws "^5.16.0" is-electron "^2.2.2" lodash "^4.17.21" maska "^1.5.1" @@ -3193,12 +3193,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@urql/core@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-4.1.3.tgz#8b61f015425f9c96e8e9368d071d3f663a2bd926" - integrity sha512-Wapa58olpEJtZzSEuZNDxzBxmOmHuivG6Hb/QPc6HjHfCJ6f36gnlWc9a9TsC8Vddle+6PsS6+quMMTuj+bj7A== +"@urql/core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.0.tgz#690e664cf66f733077c558bf685adbdac2b25823" + integrity sha512-kFkZxusq/VBQKEUcQFtf7AilMotLO+oGpE4WFhCiminZm8ZU2aulXSDWla50TaD0pj704FnWlXts6lRm0uHdDg== dependencies: - "@0no-co/graphql.web" "^1.0.1" + "@0no-co/graphql.web" "^1.0.5" wonka "^6.3.2" "@vue/babel-helper-vue-jsx-merge-props@^1.4.0": @@ -4520,12 +4520,12 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axios@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== +axios@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== dependencies: - follow-redirects "^1.15.4" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -5662,11 +5662,16 @@ core-js@^2.4.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.26.1, core-js@^3.32.2, core-js@^3.36.0, core-js@^3.8.3: +core-js@^3.26.1, core-js@^3.36.0, core-js@^3.8.3: version "3.36.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.0.tgz#e752fa0b0b462a0787d56e9d73f80b0f7c0dde68" integrity sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw== +core-js@^3.36.1: + version "3.36.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.36.1.tgz#c97a7160ebd00b2de19e62f4bbd3406ab720e578" + integrity sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -6010,7 +6015,7 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dayjs@^1.11.9: +dayjs@^1.11.10: version "1.11.10" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== @@ -7521,7 +7526,7 @@ flatted@^3.2.7: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0, follow-redirects@^1.15.4: +follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== @@ -7892,12 +7897,12 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -graphql-ws@^5.13.1: - version "5.14.1" - resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.14.1.tgz#d05dba9c2cbf1582c990a2dfec4b8f6a55d99da4" - integrity sha512-aqkls1espsygP1PfkAuuLIV96IbztQ6EaADse97pw8wRIMT3+AL/OYfS8V2iCRkc0gzckitoDRGCQEdnySggiA== +graphql-ws@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.16.0.tgz#849efe02f384b4332109329be01d74c345842729" + integrity sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A== -graphql@^16.8.0: +graphql@^16.8.1: version "16.8.1" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==