From 2b80efd37a55c6afa579d2ebc30c8d80d1f29c7a Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Fri, 19 Jan 2024 15:02:34 +0300 Subject: [PATCH 01/39] Subsquid prod endpoint --- env.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.json b/env.json index a629bee5e..a8a3b0840 100644 --- a/env.json +++ b/env.json @@ -15,7 +15,7 @@ "soraCard": false }, "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod-sub4", - "SUBSQUID_ENDPOINT": "", + "SUBSQUID_ENDPOINT": "https://squid.subsquid.io/sora/v/v4/graphql", "DEFAULT_NETWORKS": [ { "chain": "SORA", From 1382928d5d36f503178d483e1bce0bf33598d3c9 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Mon, 22 Jan 2024 14:17:59 +0300 Subject: [PATCH 02/39] Update wallet --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4917ec348..2b2596871 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.28.0", + "@soramitsu/soraneo-wallet-web": "1.28.1-beta.1", "@walletconnect/ethereum-provider": "^2.11.0", "@walletconnect/modal": "^2.6.2", "core-js": "^3.33.2", diff --git a/yarn.lock b/yarn.lock index a5dee1806..2cd75823b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2443,10 +2443,10 @@ vue-property-decorator "^9.1.2" vuex "^3.6.2" -"@soramitsu/soraneo-wallet-web@1.28.0": - version "1.28.0" - resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.28.0.tgz#a0bbc34aecd369aba3259e322eb9e0b23734d726" - integrity sha512-+n8Y3FpeG511FaszYpqeIziSTtFKOfYg7WjAvZ1TxtKCk14zuRijcYnR8awd4aJA2v5+SOBvg2h/Tw2s6VF9TQ== +"@soramitsu/soraneo-wallet-web@1.28.1-beta.1": + version "1.28.1-beta.1" + resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.28.1-beta.1.tgz#df0325dc45e2a06a0d6131ca6b0017ea2264ac73" + integrity sha512-nVynNxsdWJI4KZOVBxInP0XjzryTRT2f1sB6zwllZ19t2wM7O2H6E6sG59mpRV3ddRgZ8MEL4Yyvqkwo3sxe2A== dependencies: "@polkadot/vue-identicon" "2.12.1" "@sora-substrate/util" "1.28.0" From 0713b19aa5eeb915eedcbd1e27967752da306bee Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Tue, 23 Jan 2024 12:41:19 +0300 Subject: [PATCH 03/39] Use 1000 page size for subsquid --- src/components/pages/Swap/Chart.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/pages/Swap/Chart.vue b/src/components/pages/Swap/Chart.vue index 860058f80..1bf5d2b61 100644 --- a/src/components/pages/Swap/Chart.vue +++ b/src/components/pages/Swap/Chart.vue @@ -62,6 +62,7 @@ From 7573ede1ff7a0f9dccd9ee76e7509f2e3da0ad3e Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Fri, 22 Mar 2024 16:01:13 +0100 Subject: [PATCH 13/39] Fix quote rpc (#1356) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 84 ++++++++++++++++++++++++++-------------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index bfe4e651f..cbead91b9 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.32.4", + "@soramitsu/soraneo-wallet-web": "1.32.5", "@walletconnect/ethereum-provider": "^2.11.2", "@walletconnect/modal": "^2.6.2", "core-js": "^3.36.0", diff --git a/yarn.lock b/yarn.lock index 1b68947cb..a83157b94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2349,68 +2349,68 @@ 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.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/api/-/api-1.32.7.tgz#5cb0b80642bb0cfae3319fec282d6e7f1d07fb39" - integrity sha512-vqmI91D3EVkc6fJEvWbgqoBxpWHfUhnIW/Hl4YlQbLZFJk5SvhB1hgmGYQAF7vH25Q0VeKKn4Fdzn2AC5N7yzA== +"@sora-substrate/api@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/api/-/api-1.32.9.tgz#73bec73462d285b8d877b67de09989a63f045c4e" + integrity sha512-QQaUxyPrzh6GyZ/GdAgeOBC+ie/GtalnadrGNc136wYJAFK5ncZLsKNPOePrHCe4f/od7noLnzO0P5mMHRWHMQ== dependencies: "@open-web3/orml-api-derive" "1.1.4" "@polkadot/api" "9.14.2" - "@sora-substrate/types" "1.32.7" + "@sora-substrate/types" "1.32.9" -"@sora-substrate/connection@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/connection/-/connection-1.32.7.tgz#b617d1f9b7575f178d4fb8ad3c87035d939f83e5" - integrity sha512-xWndmli4H/162yRWi57XCVOOkGvnkox9lq4bY86QsUmYD+LEX+goi0eIA/NAUo5Edtmn7/jgRfvjWTK4+XCuxA== +"@sora-substrate/connection@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/connection/-/connection-1.32.9.tgz#53d816fad802ab566c4969174f1a3386ad1fd447" + integrity sha512-E4UahadF0UpARxLSalErp17MrwVAKD+XMkQDURzZxTw68rIwmcgsWo6LOFIXJEvLCSHswOujfuzJ/hevhIoaSg== dependencies: - "@sora-substrate/api" "1.32.7" + "@sora-substrate/api" "1.32.9" -"@sora-substrate/liquidity-proxy@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/liquidity-proxy/-/liquidity-proxy-1.32.7.tgz#605c08ad03977317116384005c445d886b9a5e67" - integrity sha512-CTZdtF8B4GvN56uElJZXZCrYPXOIRs96WRaZUofh37pFrz8ylWY3r75EzNg/DHPxgQzV3Vd4Iw1VqBZSO9MREg== +"@sora-substrate/liquidity-proxy@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/liquidity-proxy/-/liquidity-proxy-1.32.9.tgz#c9e1643fea7a86520bc597aed28fff7db9f760be" + integrity sha512-QoLWveu8F9zk6I9GrgPUTwIosoiVuspktV8o9jOgXqR0ERsufv9B4mCgEbxOR6LaVWDtrnma/8x3m141+nMWug== dependencies: - "@sora-substrate/math" "1.32.7" + "@sora-substrate/math" "1.32.9" -"@sora-substrate/math@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/math/-/math-1.32.7.tgz#6beeb5e7dcd51a9031d6a5731427df9c2a022585" - integrity sha512-2ps8s5ZAgj6DIMJtYXxxtFs1I72xlJYI7MbAEDFAYonONjqcfO+OYYWIk5EwkkKHKrer49LsDB36qlIyqxqDWg== +"@sora-substrate/math@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/math/-/math-1.32.9.tgz#bd4a37d91206b7c13477a2735fd5ab64a1b8c26d" + integrity sha512-OCpiiYzU0EkQl0tLNPWT5VCTOwzIAJU5p3B+Xpyo9vKueaW0OfCRRHqfqwoLN9MGcZT502ygn9XqbP5171i3LQ== dependencies: "@polkadot/types" "9.14.2" bignumber.js "^9.1.2" lodash "^4.17.21" -"@sora-substrate/type-definitions@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/type-definitions/-/type-definitions-1.32.7.tgz#91757e50c89ce32bb12fd70efee94ac5f43bb278" - integrity sha512-zFUXj9QA7XAiEp60PCkOp0Hgo3U1R+7lTscgLoylsftQW8TAz5vj8rtVQjtbhOxIAd4jEcFlBtuvpgCp7SywpQ== +"@sora-substrate/type-definitions@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/type-definitions/-/type-definitions-1.32.9.tgz#2edcdafe37dd7b68de656d8177ca2a379a2ec5ec" + integrity sha512-o/MY1ooQULwyp80x9eIsZOxL8rH+zYOcgrhnslsAb5CCW0wgZxnzMnC7GrtXuphyFFfxKB3E13EyqbOfXN1SUA== dependencies: "@open-web3/orml-type-definitions" "1.1.4" -"@sora-substrate/types@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/types/-/types-1.32.7.tgz#9dc98442d333aa07d4eaf8b770bfe0cd1a5a4e8a" - integrity sha512-7BoPvbfEBFndJz6YxS0NnBaasfd2ObaBoNKDbiFDnp4JUFOCmwJoND3x78WuSo7jp6qL4HtgUK4kihbQxUpRFA== +"@sora-substrate/types@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/types/-/types-1.32.9.tgz#93554462861a7fd337156d40bba38400fd79a2a1" + integrity sha512-lYlLAwlurlQRknyu1xGuW5vZX/QjxLEI1Pc7MorZHB3KHFXNldmP+RuN0saTz568wYTY3BpYTmUcsXBJagtcbQ== 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.7" + "@sora-substrate/type-definitions" "1.32.9" -"@sora-substrate/util@1.32.7": - version "1.32.7" - resolved "https://registry.yarnpkg.com/@sora-substrate/util/-/util-1.32.7.tgz#a556730afe954613328cb50bf2403ea5266f6aaa" - integrity sha512-THjeHA04Kj6Yd4HjEaNZT1pwAxrW7bXwe2vSB+MySlPP9yLFsuFAPoJV4irXcz8vltAuFe1nlfxZnjHoPXTksA== +"@sora-substrate/util@1.32.9": + version "1.32.9" + resolved "https://registry.yarnpkg.com/@sora-substrate/util/-/util-1.32.9.tgz#ac9e1afbbf4fb2c87cbd63a49668dbaa989d0f09" + integrity sha512-hffi7Hl0UT0vB3xNyGqkEG6Z9/Ws9OWjNyvhbOW9PzoNrtDR98sa2NTwjUhtA/pm6T9jQmaDQBB78xms2PdiRw== dependencies: "@polkadot/ui-keyring" "2.12.1" - "@sora-substrate/api" "1.32.7" - "@sora-substrate/connection" "1.32.7" - "@sora-substrate/liquidity-proxy" "1.32.7" - "@sora-substrate/math" "1.32.7" - "@sora-substrate/types" "1.32.7" + "@sora-substrate/api" "1.32.9" + "@sora-substrate/connection" "1.32.9" + "@sora-substrate/liquidity-proxy" "1.32.9" + "@sora-substrate/math" "1.32.9" + "@sora-substrate/types" "1.32.9" axios "^1.6.7" crypto-js "^4.2.0" lodash "^4.17.21" @@ -2443,13 +2443,13 @@ vue-property-decorator "^9.1.2" vuex "^3.6.2" -"@soramitsu/soraneo-wallet-web@1.32.4": - version "1.32.4" - resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.4.tgz#0a82fbf24d748ed9645fd0a01d8df891c1b41ea7" - integrity sha512-JGHDOkse0LQL0s1RXUNZ84s3C8+OowEdMeItwkKm/6eLgv+e9hntPIjz2JcQ2h6VgXO+mUuyhvYtMrNChM/ilg== +"@soramitsu/soraneo-wallet-web@1.32.5": + version "1.32.5" + resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.5.tgz#335267c02cca234b0d6b35a23024612c5bb24b33" + integrity sha512-YJLHlap1ceA+RAqEoIOM6jYISkH4/FFefzVjyGvPiy12hnfzRH7PVQ0UVrVow2213JsGIER2I3hROOEDKip+sQ== dependencies: "@polkadot/vue-identicon" "2.12.1" - "@sora-substrate/util" "1.32.7" + "@sora-substrate/util" "1.32.9" "@sora-test/wallet-connect" "^0.0.9" "@soramitsu-ui/ui-vue2" "^1.1.1" "@urql/core" "^4.1.2" From cdd3777d62a11dd66de27f85fc749b171bfbf826 Mon Sep 17 00:00:00 2001 From: Aleksandr Iakimov Date: Mon, 25 Mar 2024 14:52:28 +0300 Subject: [PATCH 14/39] Remove new stake page (#1343) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --- src/consts/index.ts | 1 - src/lang/en.json | 4 - src/lang/messages.ts | 4 - src/modules/staking/sora/consts.ts | 1 - src/modules/staking/sora/views/NewStake.vue | 198 -------------------- src/modules/staking/sora/views/Overview.vue | 2 +- src/router/index.ts | 5 - 7 files changed, 1 insertion(+), 214 deletions(-) delete mode 100644 src/modules/staking/sora/views/NewStake.vue diff --git a/src/consts/index.ts b/src/consts/index.ts index c2fd7259d..51baaad35 100644 --- a/src/consts/index.ts +++ b/src/consts/index.ts @@ -451,7 +451,6 @@ export const RewardsChildPages = [ export const StakingChildPages = [ StakingPageNames.Staking, SoraStakingPageNames.Overview, - SoraStakingPageNames.NewStake, SoraStakingPageNames.ValidatorsType, SoraStakingPageNames.SelectValidators, ]; diff --git a/src/lang/en.json b/src/lang/en.json index ac69b1c95..3ed6062a0 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1303,10 +1303,6 @@ "title": "{Sora} Staking", "description": "Stake {XOR} tokens on {Sora} Network as a nominator to validate transactions and earn {VAL} token rewards." }, - "newStake": { - "title": "Start staking", - "minStakeWarning": "The minimum stake to receive the reward is {min} {symbol}" - }, "validators": { "save": "Save changes", "selected": "{selected}\/{total} selected", diff --git a/src/lang/messages.ts b/src/lang/messages.ts index 254e110c1..92e1829af 100644 --- a/src/lang/messages.ts +++ b/src/lang/messages.ts @@ -836,10 +836,6 @@ export default { description: 'Stake {XOR} tokens on {Sora} Network as a nominator to validate transactions and earn {VAL} token rewards.', }, - newStake: { - title: 'Start staking', - minStakeWarning: 'The minimum stake to receive the reward is {min} {symbol}', - }, validators: { save: 'Save changes', selected: '{selected}/{total} selected', diff --git a/src/modules/staking/sora/consts.ts b/src/modules/staking/sora/consts.ts index fc64a4c5b..63d0663e8 100644 --- a/src/modules/staking/sora/consts.ts +++ b/src/modules/staking/sora/consts.ts @@ -7,7 +7,6 @@ export const DAY_HOURS = 24; export enum SoraStakingPageNames { Overview = 'Overview', - NewStake = 'NewStake', ValidatorsType = 'ValidatorsType', SelectValidators = 'SelectValidators', DataContainer = 'DataContainer', diff --git a/src/modules/staking/sora/views/NewStake.vue b/src/modules/staking/sora/views/NewStake.vue deleted file mode 100644 index 84f987b1d..000000000 --- a/src/modules/staking/sora/views/NewStake.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - - - diff --git a/src/modules/staking/sora/views/Overview.vue b/src/modules/staking/sora/views/Overview.vue index 9a6f91c02..a0663c36f 100644 --- a/src/modules/staking/sora/views/Overview.vue +++ b/src/modules/staking/sora/views/Overview.vue @@ -342,7 +342,7 @@ export default class Overview extends Mixins(StakingMixin, mixins.LoadingMixin, } stakeNew() { - router.push({ name: SoraStakingPageNames.NewStake }); + router.push({ name: SoraStakingPageNames.SelectValidators }); } stakeMore() { diff --git a/src/router/index.ts b/src/router/index.ts index b4b12eaec..da112be60 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -147,11 +147,6 @@ const routes: Array = [ name: SoraStakingPageNames.Overview, component: soraStakingLazyView(SoraStakingPageNames.Overview), }, - { - path: '/staking/sora/new', - name: SoraStakingPageNames.NewStake, - component: soraStakingLazyView(SoraStakingPageNames.NewStake), - }, { path: '/staking/sora/validators/type', name: SoraStakingPageNames.ValidatorsType, From 348ffefac84ab5a1025bc3c02b3fe3028a24c532 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Mon, 25 Mar 2024 18:03:00 +0300 Subject: [PATCH 15/39] Add swap last transactions widget (#1342) * add BaseWidget component * replace StatsCard for BaseWidget * create SwapFormWidget * refactoring base widget * wip transactions table * table demo data * update transactions widget data * add links dropdown, improve paddings * update table styles * add fromTimestamp to limit query results * add withParentLoading to ScrollableTable * swap page custom layout * add distribution as widget, style fixes * swap layout fixes * change swap widgets folder structure * fix sonar issues * fix icon hover & dropdown focus * remove fixed table * set dropdown foruc rounded * update table head titles * mixin fix * fix transactions loading * update table column order --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --- src/App.vue | 13 +- src/components/mixins/ExplorePageMixin.ts | 4 - src/components/mixins/ScrollableTableMixin.ts | 6 +- src/components/pages/Moonpay/Moonpay.vue | 4 +- .../pages/Moonpay/MoonpayHistory.vue | 5 +- .../pages/OrderBook/BookChartsWidget.vue | 4 +- src/components/pages/OrderBook/BookWidget.vue | 58 +- .../pages/OrderBook/HistoryOrderWidget.vue | 91 +-- .../pages/OrderBook/MarketTradesWidget.vue | 42 +- .../pages/OrderBook/SetLimitOrderWidget.vue | 5 +- .../pages/SoraCard/steps/ToSDialog.vue | 4 +- src/components/pages/Stats/BarChart.vue | 13 +- src/components/pages/Stats/NetworkStats.vue | 9 +- src/components/pages/Stats/SupplyChart.vue | 13 +- src/components/pages/Stats/TvlChart.vue | 13 +- .../pages/Swap/TransactionDetails.vue | 6 - src/components/pages/Swap/Widget/Chart.vue | 24 + .../pages/Swap/{ => Widget}/Distribution.vue | 17 +- src/components/pages/Swap/Widget/Form.vue | 630 ++++++++++++++++ .../pages/Swap/Widget/Transactions.vue | 346 +++++++++ src/components/shared/Button/SortButton.vue | 2 + src/components/shared/Chart/ChartSkeleton.vue | 21 +- .../Bridge => shared}/LinksDropdown.vue | 9 +- src/components/shared/Stats/StatsCard.vue | 63 -- src/components/shared/TransactionDetails.vue | 11 +- src/components/shared/Widget/Base.vue | 131 ++++ .../shared/{Widget.vue => Widget/IFrame.vue} | 2 +- .../Widget/PriceChart.vue} | 8 +- src/consts/index.ts | 22 +- src/modules/staking/sora/views/Overview.vue | 2 +- .../staking/sora/views/ValidatorsType.vue | 2 +- src/store/swap/mutations.ts | 14 +- src/styles/_layout.scss | 1 - src/styles/_mixins.scss | 97 ++- src/utils/index.ts | 45 +- src/views/BridgeTransaction.vue | 59 +- src/views/Explore/Books.vue | 3 +- src/views/Explore/Demeter.vue | 2 +- src/views/Explore/Pools.vue | 3 +- src/views/Explore/Tokens.vue | 2 +- src/views/OrderBook.vue | 10 +- src/views/Swap.vue | 672 ++---------------- 42 files changed, 1454 insertions(+), 1034 deletions(-) create mode 100644 src/components/pages/Swap/Widget/Chart.vue rename src/components/pages/Swap/{ => Widget}/Distribution.vue (93%) create mode 100644 src/components/pages/Swap/Widget/Form.vue create mode 100644 src/components/pages/Swap/Widget/Transactions.vue rename src/components/{pages/Bridge => shared}/LinksDropdown.vue (86%) delete mode 100644 src/components/shared/Stats/StatsCard.vue create mode 100644 src/components/shared/Widget/Base.vue rename src/components/shared/{Widget.vue => Widget/IFrame.vue} (96%) rename src/components/{pages/Swap/Chart.vue => shared/Widget/PriceChart.vue} (99%) diff --git a/src/App.vue b/src/App.vue index 81c282ffe..ba0839c3e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -269,10 +269,6 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) window.addEventListener('resize', this.setResponsiveClassDebounced); } - private get isSwapPageWithCharts(): boolean { - return this.$route.name === PageNames.Swap && this.chartsEnabled; - } - private get mobileCssClasses(): string[] | undefined { return getMobileCssClasses(); } @@ -281,10 +277,6 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) return this.$route.name === PageNames.About; } - get isCurrentPageTooWide(): boolean { - return this.isAboutPage || this.isSwapPageWithCharts || this.$route.name === PageNames.Tokens; - } - get dsProviderClasses(): string[] | BreakpointClass { return this.mobileCssClasses?.length ? [...this.mobileCssClasses, this.responsiveClass] : this.responsiveClass; } @@ -295,9 +287,6 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) if (this.$route.name) { cssClasses.push(`${baseClass}--${this.$route.name.toLowerCase()}`); } - if (this.isSwapPageWithCharts) { - cssClasses.push(`${baseClass}--has-charts`); - } return cssClasses; } @@ -569,7 +558,7 @@ i.icon-divider { @include desktop { .app-main { - &.app-main--swap.app-main--has-charts { + &.app-main--swap { .app-menu { &:not(.collapsed) { position: relative; diff --git a/src/components/mixins/ExplorePageMixin.ts b/src/components/mixins/ExplorePageMixin.ts index 236874e65..f9a1a5f21 100644 --- a/src/components/mixins/ExplorePageMixin.ts +++ b/src/components/mixins/ExplorePageMixin.ts @@ -25,10 +25,6 @@ export default class ExplorePageMixin extends Mixins(ScrollableTableMixin, Trans order = SortDirection.DESC; property = 'tvl'; - get loadingState(): boolean { - return this.parentLoading || this.loading; - } - get allowedAssets(): Array { // if whitelist is not available, use KnownAssets if (!this.whitelistAssets.length) { diff --git a/src/components/mixins/ScrollableTableMixin.ts b/src/components/mixins/ScrollableTableMixin.ts index 8ca6e6aee..e9a9b9728 100644 --- a/src/components/mixins/ScrollableTableMixin.ts +++ b/src/components/mixins/ScrollableTableMixin.ts @@ -33,8 +33,10 @@ export default class ScrollableTableMixin extends Mixins( } async mounted(): Promise { - await this.$nextTick(); - this.initScrollbar(); + await this.withParentLoading(async () => { + await this.$nextTick(); + this.initScrollbar(); + }); } public handlePaginationClick(button: WALLET_CONSTS.PaginationButton): void { diff --git a/src/components/pages/Moonpay/Moonpay.vue b/src/components/pages/Moonpay/Moonpay.vue index cf30b63e5..6f72a6fc4 100644 --- a/src/components/pages/Moonpay/Moonpay.vue +++ b/src/components/pages/Moonpay/Moonpay.vue @@ -3,7 +3,7 @@ - + @@ -28,7 +28,7 @@ import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; components: { DialogBase: components.DialogBase, MoonpayLogo, - Widget: lazyComponent(Components.Widget), + IFrameWidget: lazyComponent(Components.IFrameWidget), }, }) export default class Moonpay extends Mixins(MoonpayBridgeInitMixin) { diff --git a/src/components/pages/Moonpay/MoonpayHistory.vue b/src/components/pages/Moonpay/MoonpayHistory.vue index e4b52ebeb..f924c4a84 100644 --- a/src/components/pages/Moonpay/MoonpayHistory.vue +++ b/src/components/pages/Moonpay/MoonpayHistory.vue @@ -54,7 +54,7 @@ /> +
{{ t('orderBook.price') }}
{{ t('orderBook.amount') }}
@@ -64,7 +59,7 @@
{{ t('orderBook.book.noBids') }}
- + diff --git a/src/components/pages/OrderBook/MarketTradesWidget.vue b/src/components/pages/OrderBook/MarketTradesWidget.vue index 6fa6688ba..044d3baf4 100644 --- a/src/components/pages/OrderBook/MarketTradesWidget.vue +++ b/src/components/pages/OrderBook/MarketTradesWidget.vue @@ -1,17 +1,10 @@ diff --git a/src/components/pages/Swap/Distribution.vue b/src/components/pages/Swap/Widget/Distribution.vue similarity index 93% rename from src/components/pages/Swap/Distribution.vue rename to src/components/pages/Swap/Widget/Distribution.vue index 0a1c15d27..2a91d4ce7 100644 --- a/src/components/pages/Swap/Distribution.vue +++ b/src/components/pages/Swap/Widget/Distribution.vue @@ -1,5 +1,5 @@ - - diff --git a/src/components/pages/Swap/Widget/Transactions.vue b/src/components/pages/Swap/Widget/Transactions.vue new file mode 100644 index 000000000..aae32b2b3 --- /dev/null +++ b/src/components/pages/Swap/Widget/Transactions.vue @@ -0,0 +1,346 @@ + + + + + + + diff --git a/src/components/shared/Button/SortButton.vue b/src/components/shared/Button/SortButton.vue index 520725304..2d8d6816f 100644 --- a/src/components/shared/Button/SortButton.vue +++ b/src/components/shared/Button/SortButton.vue @@ -75,5 +75,7 @@ export default class SortButton extends Vue { &--descending { transform: rotate(180deg); } + + @include icon-styles($hoverColor: var(--s-color-theme-accent-hover)); } diff --git a/src/components/shared/Chart/ChartSkeleton.vue b/src/components/shared/Chart/ChartSkeleton.vue index ae77d553a..9f3d0ed95 100644 --- a/src/components/shared/Chart/ChartSkeleton.vue +++ b/src/components/shared/Chart/ChartSkeleton.vue @@ -68,12 +68,14 @@ export default class ChartSkeleton extends Mixins(mixins.TranslationMixin) { $skeleton-label-width: 34px; .charts-container { - .chart { - height: 293px; + display: flex; + flex-flow: column nowrap; + flex: 1; + width: 100%; - @include tablet { - height: 336px; - } + .chart { + flex: 1; + min-height: 327px; &-price { display: flex; @@ -85,9 +87,18 @@ $skeleton-label-width: 34px; line-height: var(--s-line-height-extra-small); } } + + .el-skeleton { + display: flex; + flex: 1; + } } .charts-skeleton { + display: flex; + flex-flow: column nowrap; + flex: 1; + $margin-right: #{$inner-spacing-tiny}; $skeleton-label-width-mobile: calc((100% - #{$margin-right} * 10) / 11); $skeleton-spacing: 18px; diff --git a/src/components/pages/Bridge/LinksDropdown.vue b/src/components/shared/LinksDropdown.vue similarity index 86% rename from src/components/pages/Bridge/LinksDropdown.vue rename to src/components/shared/LinksDropdown.vue index e95a489a4..03d77ff44 100644 --- a/src/components/pages/Bridge/LinksDropdown.vue +++ b/src/components/shared/LinksDropdown.vue @@ -30,17 +30,13 @@ import { Component, Mixins, Prop } from 'vue-property-decorator'; import TranslationMixin from '@/components/mixins/TranslationMixin'; @Component -export default class BridgeLinksDropdown extends Mixins(TranslationMixin) { +export default class LinksDropdown extends Mixins(TranslationMixin) { @Prop({ default: () => [], type: Array }) readonly links!: Array; } diff --git a/src/components/shared/TransactionDetails.vue b/src/components/shared/TransactionDetails.vue index baaeb3bee..1b1ead8fb 100644 --- a/src/components/shared/TransactionDetails.vue +++ b/src/components/shared/TransactionDetails.vue @@ -27,14 +27,20 @@ export default class TransactionDetails extends Mixins(TranslationMixin) { + + diff --git a/src/components/shared/Widget.vue b/src/components/shared/Widget/IFrame.vue similarity index 96% rename from src/components/shared/Widget.vue rename to src/components/shared/Widget/IFrame.vue index 0a461e2ea..32711405d 100644 --- a/src/components/shared/Widget.vue +++ b/src/components/shared/Widget/IFrame.vue @@ -8,7 +8,7 @@ import { Component, Vue, Prop, Watch } from 'vue-property-decorator'; @Component -export default class Widget extends Vue { +export default class IFrameWidget extends Vue { @Prop({ default: '', type: String }) readonly src!: string; @Prop({ default: false, type: Boolean }) readonly withBorder!: boolean; diff --git a/src/components/pages/Swap/Chart.vue b/src/components/shared/Widget/PriceChart.vue similarity index 99% rename from src/components/pages/Swap/Chart.vue rename to src/components/shared/Widget/PriceChart.vue index c396b9720..9d3844006 100644 --- a/src/components/pages/Swap/Chart.vue +++ b/src/components/shared/Widget/PriceChart.vue @@ -1,5 +1,5 @@ - + @@ -138,12 +138,13 @@ $max-ad-width: 330px; border-radius: var(--s-border-radius-medium); background-repeat: no-repeat; background-position: right 20px top; + background-size: contain; background-color: var(--s-color-theme-accent); // by default text-decoration: none; color: var(--s-color-base-on-accent); } &-text { - flex: 3; + flex: 4; align-self: center; font-size: 18px; font-weight: 700; From 79bd1f8ba7431bbe7de5f227ceddaf5a081c1eb6 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Fri, 29 Mar 2024 16:34:31 +0300 Subject: [PATCH 23/39] improve external links (#1367) --- .../mixins/BridgeTransactionMixin.ts | 19 ++++--- .../mixins/NetworkFormatterMixin.ts | 49 ++++++++++++------- src/utils/bridge/sub/classes/history.ts | 24 ++++++--- src/utils/bridge/sub/classes/reducers.ts | 40 ++++++++------- src/utils/bridge/sub/utils.ts | 15 +++--- src/views/BridgeTransaction.vue | 17 ++++--- 6 files changed, 99 insertions(+), 65 deletions(-) diff --git a/src/components/mixins/BridgeTransactionMixin.ts b/src/components/mixins/BridgeTransactionMixin.ts index 4a225074f..9a2fbce09 100644 --- a/src/components/mixins/BridgeTransactionMixin.ts +++ b/src/components/mixins/BridgeTransactionMixin.ts @@ -51,12 +51,16 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin return this.txSoraHash || this.txSoraBlockId || this.txSoraId; } - get txExternalHash(): string { - return this.tx?.externalHash ?? this.txExternalBlockId; + get txExternalEventIndex(): number | undefined { + return this.tx?.payload?.eventIndex; } - get txExternalBlockId(): string { - return this.tx?.externalBlockId ?? ''; + get txExternalHash(): string | undefined { + return this.tx?.externalHash; + } + + get txExternalBlockNumber(): number | undefined { + return this.tx?.externalBlockHeight; } get externalNetworkType(): Nullable { @@ -78,8 +82,8 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin this.externalNetworkType, this.externalNetworkId, this.txExternalHash, - this.txExternalBlockId, - this.EvmLinkType.Transaction + this.txExternalBlockNumber, + this.txExternalEventIndex ); } @@ -94,7 +98,8 @@ export default class BridgeTransactionMixin extends Mixins(NetworkFormatterMixin this.externalNetworkType, this.externalNetworkId, this.txExternalAccount, - this.txExternalBlockId, + undefined, + undefined, this.EvmLinkType.Account ); } diff --git a/src/components/mixins/NetworkFormatterMixin.ts b/src/components/mixins/NetworkFormatterMixin.ts index 9f2a0de6f..dddc9cf45 100644 --- a/src/components/mixins/NetworkFormatterMixin.ts +++ b/src/components/mixins/NetworkFormatterMixin.ts @@ -22,15 +22,16 @@ const { ETH_BRIDGE_STATES } = WALLET_CONSTS; const getSubNetworkLinks = ( networkData: NetworkData, type: EvmLinkType, - value: string, - blockHash: string + value?: string, // tx hash or account address + blockNumber?: number, + eventIndex?: number ): WALLET_CONSTS.ExplorerLink[] => { const links: Array = []; const explorerUrl = networkData.blockExplorerUrls[0]; switch (type) { case EvmLinkType.Account: { - if (explorerUrl) { + if (explorerUrl && value) { links.push({ type: WALLET_CONSTS.ExplorerType.Subscan, value: `${explorerUrl}/account/${value}`, @@ -40,19 +41,31 @@ const getSubNetworkLinks = ( } case EvmLinkType.Transaction: { if (explorerUrl) { - const path = value === blockHash ? 'block' : 'extrinsic'; - links.push({ - type: WALLET_CONSTS.ExplorerType.Subscan, - value: `${explorerUrl}/${path}/${value}`, - }); + 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 (blockHash) { + 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}/${blockHash}`, + value: `${polkadotBaseLink}/${blockNumber}`, }; links.push(polkadotLink); @@ -67,13 +80,12 @@ const getSubNetworkLinks = ( const getEvmNetworkLinks = ( networkData: NetworkData, type: EvmLinkType, - value: string, - _blockHash: string + value?: string ): WALLET_CONSTS.ExplorerLink[] => { const links: Array = []; const explorerUrl = networkData.blockExplorerUrls[0]; - if (explorerUrl) { + if (explorerUrl && value) { const path = type === EvmLinkType.Transaction ? 'tx' : 'address'; const etherscanLink = { type: 'etherscan' as WALLET_CONSTS.ExplorerType, @@ -173,12 +185,11 @@ export default class NetworkFormatterMixin extends Mixins(TranslationMixin) { getNetworkExplorerLinks( networkType: BridgeNetworkType, networkId: BridgeNetworkId, - value: string, - blockHash = '', + value?: string, + blockNumber?: number, + eventIndex?: number, type = EvmLinkType.Transaction ): Array { - if (!value) return []; - const networkData = this.availableNetworks[networkType][networkId]?.data; if (!networkData) { @@ -187,8 +198,8 @@ export default class NetworkFormatterMixin extends Mixins(TranslationMixin) { } return networkType === BridgeNetworkType.Sub - ? getSubNetworkLinks(networkData, type, value, blockHash) - : getEvmNetworkLinks(networkData, type, value, blockHash); + ? getSubNetworkLinks(networkData, type, value, blockNumber, eventIndex) + : getEvmNetworkLinks(networkData, type, value); } isOutgoingTx(item: Nullable): boolean { diff --git a/src/utils/bridge/sub/classes/history.ts b/src/utils/bridge/sub/classes/history.ts index 2db862c06..9ce7736a8 100644 --- a/src/utils/bridge/sub/classes/history.ts +++ b/src/utils/bridge/sub/classes/history.ts @@ -163,6 +163,7 @@ class SubBridgeHistory extends SubNetworksConnector { to: tx.externalAccount, soraNetworkFee: ZeroStringValue, // overrides in Outgoing externalNetworkFee: ZeroStringValue, // overrides in Incoming + payload: {}, }; const networkApi = this.getIntermediateApi(history); @@ -277,7 +278,13 @@ class SubBridgeHistory extends SubNetworksConnector { if (!this.parachainApi) throw new Error('[processOutgoingToSoraParachain] Parachain Api is not exists'); try { - const receivedAmount = getDepositedBalance(extrinsicEvents, history.to as string, this.parachainApi); + const [receivedAmount, eventIndex] = getDepositedBalance( + extrinsicEvents, + history.to as string, + this.parachainApi + ); + // balances.Deposit event index + history.payload.eventIndex = eventIndex; const { amount, transferFee } = getReceivedAmount( history.amount as string, @@ -317,11 +324,12 @@ class SubBridgeHistory extends SubNetworksConnector { try { const blockId = await api.system.getBlockHash(relaychainBlockHeight, this.externalApi); const blockEvents = await api.system.getBlockEvents(blockId, this.externalApi); - const blockEventsReversed = [...blockEvents].reverse(); - const messageQueueEventIndex = blockEventsReversed.findIndex(({ event }) => { + const messageQueueEventIndex = blockEvents.findIndex(({ event }) => { if (this.externalApi.events.messageQueue.Processed.is(event)) { - return event.data[0].toString() === messageHash; + const messageHashMatches = event.data[0].toString() === messageHash; + + return messageHashMatches; } return false; }); @@ -333,11 +341,14 @@ class SubBridgeHistory extends SubNetworksConnector { history.to = formatSubAddress(history.to as string, this.externalApi.registry.chainSS58 as number); // Native token for network - const receivedAmount = getDepositedBalance( - blockEventsReversed.slice(messageQueueEventIndex), + const [receivedAmount, eventIndex] = getDepositedBalance( + blockEvents.slice(0, messageQueueEventIndex), history.to as string, this.externalApi ); + // balances.Deposit event index + history.payload.eventIndex = eventIndex; + const { amount, transferFee } = getReceivedAmount( history.amount as string, receivedAmount, @@ -503,6 +514,7 @@ class SubBridgeHistory extends SubNetworksConnector { history.externalNetworkFee = feeEvent.event.data[1].toString(); history.externalBlockId = blockId; history.externalBlockHeight = relaychainBlockHeight; + history.externalHash = extrinsic.hash.toString(); history.to = formatSubAddress(signer, this.externalApi.registry.chainSS58 as number); return history; diff --git a/src/utils/bridge/sub/classes/reducers.ts b/src/utils/bridge/sub/classes/reducers.ts index ed220c54d..82ba290aa 100644 --- a/src/utils/bridge/sub/classes/reducers.ts +++ b/src/utils/bridge/sub/classes/reducers.ts @@ -73,6 +73,11 @@ export class SubBridgeReducer extends BridgeReducer { }; } + updateTransactionPayload(id: string, params: Record) { + const { payload: prevPayload } = this.getTransaction(id); + this.updateTransactionParams(id, { ...prevPayload, ...params }); + } + async saveParachainBlock(id: string): Promise { const soraParachainApi = this.connector.soraParachain?.api; @@ -81,11 +86,7 @@ export class SubBridgeReducer extends BridgeReducer { // get current sora parachain block number const parachainStartBlock = (await soraParachainApi.query.system.number()).toNumber(); // update history data - this.updateTransactionParams(id, { - payload: { - parachainStartBlock, - }, - }); + this.updateTransactionPayload(id, { parachainStartBlock }); } } @@ -289,13 +290,11 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { } } - const { payload: prevPayload } = this.getTransaction(id); - const received = FPNumber.fromCodecValue(recipientAmount, this.asset.externalDecimals); const amount2 = received.toString(); - const payload = { ...prevPayload, messageNonce, batchNonce }; - this.updateTransactionParams(id, { amount2, payload }); + this.updateTransactionPayload(id, { messageNonce, batchNonce }); + this.updateTransactionParams(id, { amount2 }); } private async waitForSoraInboundMessageNonce(id: string): Promise { @@ -395,7 +394,7 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { await this.waitForSendingExecution(id); await this.waitForIntermediateExecution(id); - await this.waitForDestinationExecution(id); + await this.waitForRelaychainExecution(id); await this.onComplete(id); } finally { @@ -460,8 +459,7 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { this.updateTransactionParams(id, { hash }); const [batchNonce, messageNonce] = getMessageAcceptedNonces(transactionEvents, subBridgeApi.api); - const payload = { ...tx.payload, batchNonce, messageNonce }; - this.updateTransactionParams(id, { payload }); + this.updateTransactionPayload(id, { batchNonce, messageNonce }); } private async waitForIntermediateExecution(id: string): Promise { @@ -508,7 +506,7 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { if (isLastStep) { // Standalone has not comission (Liberland) if (!isStandalone) { - amountReceived = getDepositedBalance( + [amountReceived] = getDepositedBalance( events.slice(substrateDispatchEventIndex), tx.to as string, adapter.api @@ -550,12 +548,11 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { if (isLastStep) { this.updateReceivedAmount(id, amountReceived); } else { - const payload = { ...tx.payload, messageHash }; - this.updateTransactionParams(id, { payload }); + this.updateTransactionPayload(id, { messageHash }); } } - private async waitForDestinationExecution(id: string): Promise { + private async waitForRelaychainExecution(id: string): Promise { if (this.transferType !== SubTransferType.Relaychain) return; const tx = this.getTransaction(id); @@ -566,6 +563,7 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { let subscription!: Subscription; let blockNumber!: number; let amount!: string; + let eventIndex!: number; const adapter = this.connector.network; @@ -579,7 +577,7 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { subscription = combineLatest([eventsObservable, blockNumberObservable]).subscribe( ([eventsVec, blockHeight]) => { try { - const events = [...eventsVec.toArray()].reverse(); + const events = eventsVec.toArray(); const messageQueueProcessedEventIndex = events.findIndex( (e) => adapter.api.events.messageQueue.Processed.is(e.event) && e.event.data[0].toString() === messageHash @@ -588,7 +586,12 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { if (messageQueueProcessedEventIndex === -1) return; blockNumber = blockHeight; - amount = getDepositedBalance(events.slice(messageQueueProcessedEventIndex), tx.to as string, adapter.api); + + [amount, eventIndex] = getDepositedBalance( + events.slice(0, messageQueueProcessedEventIndex), + tx.to as string, + adapter.api + ); resolve(); } catch (error) { @@ -614,5 +617,6 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { } this.updateReceivedAmount(id, amount); + this.updateTransactionPayload(id, { eventIndex }); } } diff --git a/src/utils/bridge/sub/utils.ts b/src/utils/bridge/sub/utils.ts index a23bd12be..4c1c3b70f 100644 --- a/src/utils/bridge/sub/utils.ts +++ b/src/utils/bridge/sub/utils.ts @@ -49,21 +49,20 @@ export const getBridgeProxyHash = (events: Array, api: ApiPromise): string return bridgeProxyEvent.event.data[0].toString(); }; -const getNativeTokenDepositedBalance = (events: Array, to: string, api: ApiPromise): string => { - // Native token for network - const balancesDepositEvent = events.find( +// 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) ); - if (!balancesDepositEvent) throw new Error(`Unable to find "balances.Deposit" event`); + if (index === -1) throw new Error(`Unable to find "balances.Deposit" event`); - return balancesDepositEvent.event.data.amount.toString(); -}; + const event = events[index]; + const balance = event.event.data.amount.toString(); -export const getDepositedBalance = (events: Array, to: string, api: ApiPromise): string => { - return getNativeTokenDepositedBalance(events, to, api); + return [balance, index]; }; export const getReceivedAmount = (sendedAmount: string, receivedAmount: CodecString, decimals?: number) => { diff --git a/src/views/BridgeTransaction.vue b/src/views/BridgeTransaction.vue index 67eb293f6..a2d068374 100644 --- a/src/views/BridgeTransaction.vue +++ b/src/views/BridgeTransaction.vue @@ -328,14 +328,18 @@ export default class BridgeTransaction extends Mixins( return this.asset ? this.getFiatAmountByCodecString(this.txExternalTransferFee, this.asset) : null; } - get txId(): Nullable { - return this.isOutgoing ? this.txSoraId : this.txExternalHash; + get txExternalBlockId(): string { + return this.tx?.externalBlockId ?? ''; } get txParachainBlockId(): string { return (this.historyItem as SubHistory)?.parachainBlockId ?? ''; } + get txParachainBlockNumber(): number | undefined { + return (this.historyItem as SubHistory)?.parachainBlockHeight; + } + get txDate(): string { return this.formatDatetime(this.historyItem); } @@ -459,9 +463,8 @@ export default class BridgeTransaction extends Mixins( return this.getNetworkExplorerLinks( this.externalNetworkType, this.parachainNetworkId, - this.txParachainBlockId, - this.txParachainBlockId, - this.EvmLinkType.Transaction + '', + this.txParachainBlockNumber ); } @@ -530,9 +533,9 @@ export default class BridgeTransaction extends Mixins( this.parachainNetworkId ); const external = this.getLinkData( - this.txExternalHash, + this.txExternalHash ?? this.txExternalBlockId, this.externalExplorerLinks, - this.historyItem?.externalHash ? txHashName : txBlockName, + this.txExternalHash ? txHashName : txBlockName, this.externalNetworkId ); From a1604f46b7eb8825b2c97ca590d887c851e85ca1 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Sat, 30 Mar 2024 00:14:21 +0300 Subject: [PATCH 24/39] Improve bridge sora links (#1370) * improve external links * add tokens.Deposited handler * fix sub blocks left & account formatting * improve sora links --- public/env.json | 2 +- .../mixins/BridgeTransactionMixin.ts | 35 ++++++---- .../mixins/NetworkFormatterMixin.ts | 47 +++++--------- .../pages/Bridge/TransferNotification.vue | 2 +- src/store/bridge/getters.ts | 10 ++- src/utils/bridge/sub/classes/history.ts | 32 +++++---- src/utils/bridge/sub/classes/reducers.ts | 41 ++++++++---- src/utils/bridge/sub/utils.ts | 15 +++++ src/utils/index.ts | 65 +++++++++++-------- src/views/BridgeTransaction.vue | 19 +++--- 10 files changed, 153 insertions(+), 115 deletions(-) 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/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/NetworkFormatterMixin.ts b/src/components/mixins/NetworkFormatterMixin.ts index dddc9cf45..dc6433693 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 { getSubscanTxLink, getPolkadotTxLink } from '@/utils'; import { isOutgoingTransaction } from '@/utils/bridge/common/utils'; import { isUnsignedToPart } from '@/utils/bridge/eth/utils'; @@ -23,7 +24,7 @@ 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 = []; @@ -41,40 +42,26 @@ const getSubNetworkLinks = ( } 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, - }); - } + links.push({ + type: WALLET_CONSTS.ExplorerType.Subscan, + value: getSubscanTxLink(explorerUrl, value, blockId, eventIndex), + }); } - 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}`, - }; + 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: getPolkadotTxLink(polkadotBaseLink, value, blockId, eventIndex), + }; + + links.push(polkadotLink); - links.push(polkadotLink); - } break; } } - return links; + return links.filter((link) => !!link.value); }; const getEvmNetworkLinks = ( @@ -186,7 +173,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 +185,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/store/bridge/getters.ts b/src/store/bridge/getters.ts index e5fa65ae6..982fc8a6d 100644 --- a/src/store/bridge/getters.ts +++ b/src/store/bridge/getters.ts @@ -98,14 +98,12 @@ const getters = defineGetters()({ }, 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/utils/bridge/sub/classes/history.ts b/src/utils/bridge/sub/classes/history.ts index 9ce7736a8..9e1db668d 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, + getTokensDepositedBalance, 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 { @@ -176,22 +176,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 }); + const [_, eventIndex] = getTokensDepositedBalance(soraBlockEvents, history.from as string, this.soraApi); + // tokens.Deposited event index + history.payload.eventIndex = eventIndex; + + return await this.processIncomingTxExternalData({ history, events: soraTxEvents }); } } catch (error) { console.error(`[${id}]`, error); @@ -212,17 +216,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 +380,13 @@ class SubBridgeHistory extends SubNetworksConnector { private async processIncomingTxExternalData({ history, - soraEvents, + events, }: { history: SubHistory; - soraEvents: any[]; + events: any[]; }): Promise> { // find SORA hash event index - const requestStatusUpdateEventIndex = soraEvents.findIndex((e) => { + const requestStatusUpdateEventIndex = events.findIndex((e) => { if (!this.soraApi.events.bridgeProxy.RequestStatusUpdate.is(e.event)) return false; const hash = e.event.data[0].toString(); @@ -391,7 +395,7 @@ class SubBridgeHistory extends SubNetworksConnector { }); // Received on SORA nonces const [soraBatchNonce, soraMessageNonce] = getMessageDispatchedNonces( - soraEvents.slice(requestStatusUpdateEventIndex), + events.slice(requestStatusUpdateEventIndex), this.soraApi ); // api for Standalone network or SORA parachain diff --git a/src/utils/bridge/sub/classes/reducers.ts b/src/utils/bridge/sub/classes/reducers.ts index 82ba290aa..3744e59e4 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, + getTokensDepositedBalance, 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,10 @@ 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] = getTokensDepositedBalance(foundedEvents, tx.from as string, subBridgeApi.api); resolve(); } catch (error) { @@ -336,9 +350,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..873cb7db6 100644 --- a/src/utils/bridge/sub/utils.ts +++ b/src/utils/bridge/sub/utils.ts @@ -64,6 +64,21 @@ export const getDepositedBalance = (events: Array, to: string, api: ApiProm return [balance, index]; }; +// for SORA +export const getTokensDepositedBalance = (events: Array, to: string, api: ApiPromise): [string, number] => { + const index = events.findIndex( + (e) => + api.events.tokens.Deposited.is(e.event) && + subBridgeApi.formatAddress(e.event.data.who.toString()) === subBridgeApi.formatAddress(to) + ); + + if (index === -1) throw new Error(`Unable to find "tokens.Deposited" event`); + + const event = events[index]; + const balance = event.event.data.amount.toString(); + + return [balance, index]; +}; export const getReceivedAmount = (sendedAmount: string, receivedAmount: CodecString, decimals?: number) => { const sended = new FPNumber(sendedAmount, decimals); diff --git a/src/utils/index.ts b/src/utils/index.ts index 70caa2726..453bbb26e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -384,10 +384,39 @@ export const sortPools = (a: PoolAssets, b: PoolAssets) = export const calcElScrollGutter: () => number = scrollbarWidth; +export const getSubscanTxLink = ( + baseUrl: string, + txId?: string, + blockId?: number | string, + eventIndex?: number +): string => { + if (Number.isFinite(eventIndex) && Number.isFinite(blockId)) { + return `${baseUrl}/block/${blockId}?tab=event&event=${blockId}-${eventIndex}`; + } else if (txId) { + return `${baseUrl}/extrinsic/${txId}`; + } else if (blockId) { + return `${baseUrl}/block/${blockId}`; + } + return ''; +}; + +export const getPolkadotTxLink = ( + baseUrl: string, + txId?: string, + blockId?: number | string, + eventIndex?: number +): string => { + if (blockId) { + return `${baseUrl}/${blockId}`; + } + return ''; +}; + export const soraExplorerLinks = ( soraNetwork: Nullable, - txValue: Nullable, - blockHash: Nullable, + txValue?: string, + blockId?: number | string, + eventIndex?: number, isAccount = false ): Array => { if (!soraNetwork) return []; @@ -402,35 +431,17 @@ export const soraExplorerLinks = ( .map(({ type, value }) => ({ type, value: `${value}/account/${txValue}` })); } - const txId = txValue ?? blockHash; - - if (!txId) 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; - }); - } - 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, txValue, blockId, eventIndex); + } else if (type === WALLET_CONSTS.ExplorerType.Polkadot) { + link.value = getPolkadotTxLink(value, txValue, blockId, eventIndex); } + return link; }) - .filter((value) => !!value.value); // Polkadot explorer won't be shown without block + .filter((value) => !!value.value); }; 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, From c45b4321eebbf1ad223d9a545a3735cc57d60ba5 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:14:08 +0300 Subject: [PATCH 25/39] improve sora links & refactoring (#1371) --- .../mixins/NetworkFormatterMixin.ts | 55 ++++++---------- src/utils/bridge/sub/classes/history.ts | 25 ++++--- src/utils/bridge/sub/classes/reducers.ts | 8 ++- src/utils/bridge/sub/utils.ts | 31 +++++---- src/utils/index.ts | 65 ++++++++++--------- 5 files changed, 93 insertions(+), 91 deletions(-) diff --git a/src/components/mixins/NetworkFormatterMixin.ts b/src/components/mixins/NetworkFormatterMixin.ts index dc6433693..342410f2b 100644 --- a/src/components/mixins/NetworkFormatterMixin.ts +++ b/src/components/mixins/NetworkFormatterMixin.ts @@ -9,7 +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 { getSubscanTxLink, getPolkadotTxLink } from '@/utils'; +import { getSubstrateExplorerLinks } from '@/utils'; import { isOutgoingTransaction } from '@/utils/bridge/common/utils'; import { isUnsignedToPart } from '@/utils/bridge/eth/utils'; @@ -27,41 +27,28 @@ const getSubNetworkLinks = ( 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) { - links.push({ - type: WALLET_CONSTS.ExplorerType.Subscan, - value: getSubscanTxLink(explorerUrl, value, blockId, eventIndex), - }); - } - - 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: getPolkadotTxLink(polkadotBaseLink, value, blockId, eventIndex), - }; - - 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.filter((link) => !!link.value); + return getSubstrateExplorerLinks(baseLinks, type === EvmLinkType.Account, value, blockId, eventIndex); }; const getEvmNetworkLinks = ( diff --git a/src/utils/bridge/sub/classes/history.ts b/src/utils/bridge/sub/classes/history.ts index 9e1db668d..f98ddb16a 100644 --- a/src/utils/bridge/sub/classes/history.ts +++ b/src/utils/bridge/sub/classes/history.ts @@ -10,7 +10,7 @@ import { subBridgeApi } from '@/utils/bridge/sub/api'; import { SubNetworksConnector, subBridgeConnector } from '@/utils/bridge/sub/classes/adapter'; import { getDepositedBalance, - getTokensDepositedBalance, + getParachainBridgeAppMintedBalance, getMessageAcceptedNonces, getMessageDispatchedNonces, isMessageDispatchedNonces, @@ -191,11 +191,11 @@ class SubBridgeHistory extends SubNetworksConnector { events: soraTxEvents, }); } else { - const [_, eventIndex] = getTokensDepositedBalance(soraBlockEvents, history.from as string, this.soraApi); - // tokens.Deposited event index - history.payload.eventIndex = eventIndex; - - return await this.processIncomingTxExternalData({ history, events: soraTxEvents }); + return await this.processIncomingTxExternalData({ + history, + txEvents: soraTxEvents, + blockEvents: soraBlockEvents, + }); } } catch (error) { console.error(`[${id}]`, error); @@ -380,13 +380,15 @@ class SubBridgeHistory extends SubNetworksConnector { private async processIncomingTxExternalData({ history, - events, + txEvents, + blockEvents, }: { history: SubHistory; - events: any[]; + txEvents: any[]; + blockEvents: any[]; }): Promise> { // find SORA hash event index - const requestStatusUpdateEventIndex = events.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(); @@ -395,7 +397,7 @@ class SubBridgeHistory extends SubNetworksConnector { }); // Received on SORA nonces const [soraBatchNonce, soraMessageNonce] = getMessageDispatchedNonces( - events.slice(requestStatusUpdateEventIndex), + txEvents.slice(requestStatusUpdateEventIndex), this.soraApi ); // api for Standalone network or SORA parachain @@ -433,6 +435,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; diff --git a/src/utils/bridge/sub/classes/reducers.ts b/src/utils/bridge/sub/classes/reducers.ts index 3744e59e4..7d2a8da19 100644 --- a/src/utils/bridge/sub/classes/reducers.ts +++ b/src/utils/bridge/sub/classes/reducers.ts @@ -13,7 +13,7 @@ import { SubTransferType } from '@/utils/bridge/sub/types'; import { getBridgeProxyHash, getDepositedBalance, - getTokensDepositedBalance, + getParachainBridgeAppMintedBalance, getMessageAcceptedNonces, isMessageDispatchedNonces, isAssetAddedToChannel, @@ -338,7 +338,11 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { const foundedEvents = events.slice(substrateDispatchEventIndex); soraHash = getBridgeProxyHash(foundedEvents, subBridgeApi.api); - [amount, eventIndex] = getTokensDepositedBalance(foundedEvents, tx.from as string, subBridgeApi.api); + [amount, eventIndex] = getParachainBridgeAppMintedBalance( + foundedEvents, + tx.from as string, + subBridgeApi.api + ); resolve(); } catch (error) { diff --git a/src/utils/bridge/sub/utils.ts b/src/utils/bridge/sub/utils.ts index 873cb7db6..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`); @@ -64,18 +63,22 @@ export const getDepositedBalance = (events: Array, to: string, api: ApiProm return [balance, index]; }; -// for SORA -export const getTokensDepositedBalance = (events: Array, to: string, api: ApiPromise): [string, number] => { - const index = events.findIndex( - (e) => - api.events.tokens.Deposited.is(e.event) && - subBridgeApi.formatAddress(e.event.data.who.toString()) === subBridgeApi.formatAddress(to) - ); - if (index === -1) throw new Error(`Unable to find "tokens.Deposited" event`); +// 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.amount.toString(); + const balance = event.event.data[4].toString(); return [balance, index]; }; diff --git a/src/utils/index.ts b/src/utils/index.ts index 453bbb26e..70f9dfaae 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -384,51 +384,42 @@ export const sortPools = (a: PoolAssets, b: PoolAssets) = export const calcElScrollGutter: () => number = scrollbarWidth; -export const getSubscanTxLink = ( - baseUrl: string, - txId?: string, - blockId?: number | string, - eventIndex?: number -): string => { +const getSubscanTxLink = (baseUrl: string, txId?: string, blockId?: number | string, eventIndex?: number): string => { + if (!(txId || blockId)) return ''; + + let link = txId ? `${baseUrl}/extrinsic/${txId}` : `${baseUrl}/block/${blockId}`; + if (Number.isFinite(eventIndex) && Number.isFinite(blockId)) { - return `${baseUrl}/block/${blockId}?tab=event&event=${blockId}-${eventIndex}`; - } else if (txId) { - return `${baseUrl}/extrinsic/${txId}`; - } else if (blockId) { - return `${baseUrl}/block/${blockId}`; + link += `?event=${blockId}-${eventIndex}`; + + if (!txId) { + link += '&tab=event'; + } } - return ''; + + return link; }; -export const getPolkadotTxLink = ( - baseUrl: string, - txId?: string, - blockId?: number | string, - eventIndex?: number -): string => { +const getPolkadotTxLink = (baseUrl: string, txId?: string, blockId?: number | string, eventIndex?: number): string => { if (blockId) { return `${baseUrl}/${blockId}`; } return ''; }; -export const soraExplorerLinks = ( - soraNetwork: Nullable, - txValue?: string, +export const getSubstrateExplorerLinks = ( + baseLinks: WALLET_CONSTS.ExplorerLink[], + isAccount = false, + id?: string, // tx hash or account address blockId?: number | string, - eventIndex?: number, - isAccount = false -): Array => { - if (!soraNetwork) return []; - - const baseLinks = getExplorerLinks(soraNetwork); - + eventIndex?: number +) => { if (!baseLinks.length) return []; if (isAccount) { return baseLinks .filter(({ type }) => type !== WALLET_CONSTS.ExplorerType.Polkadot) - .map(({ type, value }) => ({ type, value: `${value}/account/${txValue}` })); + .map(({ type, value }) => ({ type, value: `${value}/account/${id}` })); } return baseLinks @@ -436,12 +427,24 @@ export const soraExplorerLinks = ( const link = { type } as WALLET_CONSTS.ExplorerLink; if (type === WALLET_CONSTS.ExplorerType.Subscan) { - link.value = getSubscanTxLink(value, txValue, blockId, eventIndex); + link.value = getSubscanTxLink(value, id, blockId, eventIndex); } else if (type === WALLET_CONSTS.ExplorerType.Polkadot) { - link.value = getPolkadotTxLink(value, txValue, blockId, eventIndex); + link.value = getPolkadotTxLink(value, id, blockId, eventIndex); } return link; }) .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); +}; From 7adfa36a49ed5b2096930488a18774529a47e045 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Mon, 1 Apr 2024 16:28:33 +0300 Subject: [PATCH 26/39] update network & xcm fees (#1373) --- src/consts/sub.ts | 4 ++-- src/utils/bridge/sub/classes/adapters/relaychain.ts | 10 +++++----- src/utils/bridge/sub/classes/history.ts | 11 +++++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/consts/sub.ts b/src/consts/sub.ts index 936799c3d..411a7aca8 100644 --- a/src/consts/sub.ts +++ b/src/consts/sub.ts @@ -160,13 +160,13 @@ export const SUB_TRANSFER_FEES: SubNetworksFees = { }, [SubNetworkId.Kusama]: { KSM: { - [BridgeTxDirection.Outgoing]: '92003956', + [BridgeTxDirection.Outgoing]: '78327426', [BridgeTxDirection.Incoming]: '0', }, }, [SubNetworkId.Polkadot]: { DOT: { - [BridgeTxDirection.Outgoing]: '21062795', + [BridgeTxDirection.Outgoing]: '19978738', [BridgeTxDirection.Incoming]: '0', }, }, diff --git a/src/utils/bridge/sub/classes/adapters/relaychain.ts b/src/utils/bridge/sub/classes/adapters/relaychain.ts index 0c23edff2..0409320bd 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.02236 DOT + return new FPNumber(0.02236, 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 f98ddb16a..081398350 100644 --- a/src/utils/bridge/sub/classes/history.ts +++ b/src/utils/bridge/sub/classes/history.ts @@ -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; @@ -573,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); } From 69f964a13a221ab8f9a343987ecf941c2e1f279d Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:16:39 +0300 Subject: [PATCH 27/39] Add ability to hide swap widgets (#1374) * add ability to hide swap widgets * add WidgetsVisibilityModel * Collapsed menu background overlaps neighbor fix * align chart header with swap widget * update customise widget * update translations * style fixes --------- Co-authored-by: shlavik --- src/App.vue | 1 - src/components/App/Footer/Indexer/utils.ts | 5 - .../App/Footer/StatisticsDialog.vue | 4 +- src/components/App/Menu/AppMenu.vue | 7 +- src/components/mixins/ChartSpecMixin.ts | 3 +- .../pages/Swap/StatusActionBadge.vue | 2 +- src/components/pages/Swap/Widget/Form.vue | 17 --- .../shared/Settings/SlippageTolerance.vue | 1 + src/components/shared/TokensRow.vue | 6 +- src/components/shared/Widget/Base.vue | 9 +- src/components/shared/Widget/Customise.vue | 122 ++++++++++++++++++ src/components/shared/Widget/PriceChart.vue | 3 +- src/consts/index.ts | 1 + src/lang/cs.json | 4 +- src/lang/de.json | 4 +- src/lang/en.json | 4 +- src/lang/es.json | 4 +- src/lang/fr.json | 4 +- src/lang/hr.json | 4 +- src/lang/hu.json | 4 +- src/lang/hy.json | 4 +- src/lang/id.json | 4 +- src/lang/it.json | 4 +- src/lang/nl.json | 4 +- src/lang/no.json | 4 +- src/lang/pl.json | 4 +- src/lang/ru.json | 4 +- src/lang/sk.json | 4 +- src/lang/sr.json | 4 +- src/lang/sv.json | 4 +- src/lang/vi.json | 4 +- src/lang/yo.json | 4 +- src/lang/zh_CN.json | 4 +- src/store/settings/getters.ts | 8 -- src/store/settings/mutations.ts | 4 - src/store/settings/state.ts | 2 - src/store/settings/types.ts | 1 - src/types/layout.ts | 1 + src/utils/index.ts | 2 + src/utils/storage.ts | 4 + src/views/Swap.vue | 54 +++++++- 41 files changed, 265 insertions(+), 72 deletions(-) delete mode 100644 src/components/App/Footer/Indexer/utils.ts create mode 100644 src/components/shared/Widget/Customise.vue create mode 100644 src/types/layout.ts 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/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/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 9d3844006..e7173cf24 100644 --- a/src/components/shared/Widget/PriceChart.vue +++ b/src/components/shared/Widget/PriceChart.vue @@ -9,6 +9,7 @@ ()({ 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/index.ts b/src/utils/index.ts index 70f9dfaae..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)}`; }; 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/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; } } } From 830a1661f0b00b5808c8f38c0b133f6c3c23a305 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:15:17 +0300 Subject: [PATCH 28/39] update wallet 1.32.7 (#1376) --- package.json | 2 +- .../bridge/sub/classes/adapters/relaychain.ts | 4 +- yarn.lock | 145 +++++++++--------- 3 files changed, 78 insertions(+), 73 deletions(-) diff --git a/package.json b/package.json index 4c7afa31e..e2168b010 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,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/src/utils/bridge/sub/classes/adapters/relaychain.ts b/src/utils/bridge/sub/classes/adapters/relaychain.ts index 0409320bd..f691f79f0 100644 --- a/src/utils/bridge/sub/classes/adapters/relaychain.ts +++ b/src/utils/bridge/sub/classes/adapters/relaychain.ts @@ -69,8 +69,8 @@ export class RelaychainAdapter extends SubAdapter { // Hardcoded value for Kusama - 0.002 KSM return new FPNumber(0.002, asset.externalDecimals).toCodecString(); case SubNetworkId.Polkadot: - // Hardcoded value for Polkadot - 0.02236 DOT - return new FPNumber(0.02236, asset.externalDecimals).toCodecString(); + // Hardcoded value for Polkadot - 0.059 DOT + return new FPNumber(0.059, asset.externalDecimals).toCodecString(); default: return '0'; } 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== From 9aca1f144d32defdccf8c8337ded0b0185430e38 Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Thu, 4 Apr 2024 08:03:07 +0200 Subject: [PATCH 29/39] Fix liberland adapter balance for custom tokens (#1378) * Fix liberland adapter balance for custom tokens * liberland fixes * update min balance amount & update config --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Nikita-Polyakov --- env.json | 2 +- src/store/bridge/actions.ts | 6 +-- src/store/web3/getters.ts | 8 +--- .../bridge/sub/classes/adapters/liberland.ts | 9 +++-- src/utils/bridge/sub/classes/reducers.ts | 39 +++++++++---------- src/utils/bridge/sub/utils.ts | 18 +++++++++ 6 files changed, 44 insertions(+), 38 deletions(-) diff --git a/env.json b/env.json index 45a003a44..c9422348c 100644 --- a/env.json +++ b/env.json @@ -56,7 +56,7 @@ "KusamaSora": true, "Polkadot": true, "PolkadotSora": true, - "Liberland": true + "Liberland": false }, "EVM_NETWORKS_IDS": [56, 8217], "ETH_BRIDGE": { diff --git a/src/store/bridge/actions.ts b/src/store/bridge/actions.ts index 7695de142..35d6fad51 100644 --- a/src/store/bridge/actions.ts +++ b/src/store/bridge/actions.ts @@ -302,11 +302,7 @@ async function updateExternalMinBalance(context: ActionContext): Promi let minBalance = ZeroStringValue; if (getters.isSubBridge && getters.asset && !state.isSoraToEvm) { - const minDepositCodec = await subBridgeConnector.network.getAssetMinDeposit(getters.asset.externalAddress); - // is greater than the minimum non-zero value - if (minDepositCodec > '1') { - minBalance = minDepositCodec; - } + minBalance = await subBridgeConnector.network.getAssetMinDeposit(getters.asset.externalAddress); } commit.setExternalMinBalance(minBalance); diff --git a/src/store/web3/getters.ts b/src/store/web3/getters.ts index b8fb190fc..0a4c233ef 100644 --- a/src/store/web3/getters.ts +++ b/src/store/web3/getters.ts @@ -1,6 +1,4 @@ import { BridgeNetworkType } from '@sora-substrate/util/build/bridgeProxy/consts'; -import { SubNetworkId } from '@sora-substrate/util/build/bridgeProxy/sub/consts'; -import { WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; import { defineGetters } from 'direct-vuex'; import { EVM_NETWORKS } from '@/consts/evm'; @@ -47,11 +45,7 @@ const getters = defineGetters()({ const data = SUB_NETWORKS[id]; if (data) { - let disabled = !(nodesOrFlag && state.supportedApps?.[BridgeNetworkType.Sub]?.includes(id as SubNetwork)); - - if (id === SubNetworkId.Liberland && rootState.wallet.settings.soraNetwork === WALLET_CONSTS.SoraNetwork.Prod) { - disabled = true; // TODO: [Liberland] Remove it when needed ready - } + const disabled = !(nodesOrFlag && state.supportedApps?.[BridgeNetworkType.Sub]?.includes(id as SubNetwork)); // override from config if (Array.isArray(nodesOrFlag)) { diff --git a/src/utils/bridge/sub/classes/adapters/liberland.ts b/src/utils/bridge/sub/classes/adapters/liberland.ts index cdf894e35..87cb19d8d 100644 --- a/src/utils/bridge/sub/classes/adapters/liberland.ts +++ b/src/utils/bridge/sub/classes/adapters/liberland.ts @@ -30,8 +30,9 @@ export class LiberlandAdapter extends SubAdapter { if (result.isEmpty) return ZeroStringValue; const data = result.unwrap(); + const minBalance = data.minBalance.toString(); - return data.minBalance.toString(); + return minBalance > '1' ? minBalance : ZeroStringValue; }, ZeroStringValue); } @@ -46,7 +47,7 @@ export class LiberlandAdapter extends SubAdapter { const data = result.unwrap(); - if (data.isFrozen.isTrue) return ZeroStringValue; + if (!data.status.isLiquid) return ZeroStringValue; return data.balance.toString(); }, ZeroStringValue); @@ -75,8 +76,8 @@ export class LiberlandAdapter extends SubAdapter { try { return await super.getNetworkFee(asset, sender, recipient); } catch (error) { - // Hardcoded value for Liberland - 0.011153 - return '11153000000'; + // Hardcoded value for Liberland - 0.0106 + return '10600000000'; } } } diff --git a/src/utils/bridge/sub/classes/reducers.ts b/src/utils/bridge/sub/classes/reducers.ts index 7d2a8da19..3fc4dda8a 100644 --- a/src/utils/bridge/sub/classes/reducers.ts +++ b/src/utils/bridge/sub/classes/reducers.ts @@ -14,6 +14,7 @@ import { getBridgeProxyHash, getDepositedBalance, getParachainBridgeAppMintedBalance, + getSubstrateBridgeAppMintedBalance, getMessageAcceptedNonces, isMessageDispatchedNonces, isAssetAddedToChannel, @@ -79,15 +80,17 @@ export class SubBridgeReducer extends BridgeReducer { this.updateTransactionParams(id, { payload: { ...prevPayload, ...params } }); } - async saveParachainBlock(id: string): Promise { - const adapter = this.connector.soraParachain; + async saveStartBlock(id: string): Promise { + const adapter = + this.transferType === SubTransferType.Standalone ? this.connector.network : this.connector.soraParachain; - if (!adapter) throw new Error(`[${this.constructor.name}]: Sora Parachain Adapter is not exists`); + if (!adapter) throw new Error(`[${this.constructor.name}]: Adapter is not exists`); + await adapter.connect(); // get current sora parachain block number - const parachainStartBlock = await adapter.getBlockNumber(); + const startBlock = await adapter.getBlockNumber(); // update history data - this.updateTransactionPayload(id, { parachainStartBlock }); + this.updateTransactionPayload(id, { startBlock }); } } @@ -141,11 +144,8 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { await this.connector.start(); // sign transaction await this.connector.network.transfer(asset, tx.to as string, tx.amount as string, id); - - if (this.transferType !== SubTransferType.Standalone) { - // store sora parachain block number when tx was signed - await this.saveParachainBlock(id); - } + // save start block when tx was signed + await this.saveStartBlock(id); } private async updateTxSigningData(id: string): Promise { @@ -214,7 +214,7 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { if (!adapter) throw new Error(`[${this.constructor.name}] adapter is not defined`); - const startBlockHeight: number = isStandalone ? tx.externalBlockHeight : tx.payload.parachainStartBlock; + const startBlockHeight: number = tx.payload.startBlock; if (!startBlockHeight) throw new Error(`[${this.constructor.name}] startBlockHeight is not defined`); @@ -322,6 +322,9 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { let amount!: string; let eventIndex!: number; + const isStandalone = this.transferType === SubTransferType.Standalone; + const getMintedBalance = isStandalone ? getSubstrateBridgeAppMintedBalance : getParachainBridgeAppMintedBalance; + try { await new Promise((resolve, reject) => { const eventsObservable = api.system.getEventsObservable(subBridgeApi.apiRx); @@ -338,11 +341,8 @@ export class SubBridgeIncomingReducer extends SubBridgeReducer { const foundedEvents = events.slice(substrateDispatchEventIndex); soraHash = getBridgeProxyHash(foundedEvents, subBridgeApi.api); - [amount, eventIndex] = getParachainBridgeAppMintedBalance( - foundedEvents, - tx.from as string, - subBridgeApi.api - ); + + [amount, eventIndex] = getMintedBalance(foundedEvents, tx.from as string, subBridgeApi.api); resolve(); } catch (error) { @@ -458,11 +458,8 @@ export class SubBridgeOutgoingReducer extends SubBridgeReducer { await this.connector.start(); // sign transaction await subBridgeApi.transfer(asset, tx.to as string, tx.amount as string, tx.externalNetwork as SubNetwork, id); - - if (this.transferType !== SubTransferType.Standalone) { - // store sora parachain block number when tx was signed - await this.saveParachainBlock(id); - } + // save start block when tx was signed + await this.saveStartBlock(id); } private async waitForSendingExecution(id: string): Promise { diff --git a/src/utils/bridge/sub/utils.ts b/src/utils/bridge/sub/utils.ts index 18ef1abba..a0f6d313d 100644 --- a/src/utils/bridge/sub/utils.ts +++ b/src/utils/bridge/sub/utils.ts @@ -82,6 +82,24 @@ export const getParachainBridgeAppMintedBalance = ( return [balance, index]; }; +// for SORA from Liberland +export const getSubstrateBridgeAppMintedBalance = ( + events: Array, + to: string, + api: ApiPromise +): [string, number] => { + const index = events.findIndex((e) => { + if (!api.events.substrateBridgeApp.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); From d59ca49dece1ace1ecd56cde6371404294fd47c6 Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Fri, 5 Apr 2024 11:34:30 +0200 Subject: [PATCH 30/39] Reduce network icons svg size (#1380) --- src/assets/img/networks/avalanche.svg | 7 +- .../img/networks/binance-smart-chain.svg | 13 +- src/assets/img/networks/ethereum-classic.svg | 14 +- src/assets/img/networks/ethereum.svg | 19 +-- src/assets/img/networks/karura.svg | 21 +-- src/assets/img/networks/klaytn.svg | 49 +++--- src/assets/img/networks/kusama.svg | 7 +- src/assets/img/networks/liberland.svg | 3 +- src/assets/img/networks/polkadot.svg | 15 +- src/assets/img/networks/polygon.svg | 17 +-- src/assets/img/networks/rococo.svg | 24 ++- src/assets/img/networks/sora-kusama.svg | 9 +- src/assets/img/networks/sora-polkadot.svg | 7 +- src/assets/img/networks/sora.svg | 142 +++++------------- 14 files changed, 160 insertions(+), 187 deletions(-) diff --git a/src/assets/img/networks/avalanche.svg b/src/assets/img/networks/avalanche.svg index 55473a0f2..a1b5758fd 100644 --- a/src/assets/img/networks/avalanche.svg +++ b/src/assets/img/networks/avalanche.svg @@ -1,4 +1,5 @@ - - - + + + + diff --git a/src/assets/img/networks/binance-smart-chain.svg b/src/assets/img/networks/binance-smart-chain.svg index 6013da5c7..f48307940 100644 --- a/src/assets/img/networks/binance-smart-chain.svg +++ b/src/assets/img/networks/binance-smart-chain.svg @@ -1,7 +1,8 @@ - - - - - - + + + + + + + diff --git a/src/assets/img/networks/ethereum-classic.svg b/src/assets/img/networks/ethereum-classic.svg index 789e6e223..12c434086 100644 --- a/src/assets/img/networks/ethereum-classic.svg +++ b/src/assets/img/networks/ethereum-classic.svg @@ -1 +1,13 @@ -e \ No newline at end of file + + + + + +e + + + + + + + diff --git a/src/assets/img/networks/ethereum.svg b/src/assets/img/networks/ethereum.svg index ccf8091ee..b3601a6f6 100644 --- a/src/assets/img/networks/ethereum.svg +++ b/src/assets/img/networks/ethereum.svg @@ -1,10 +1,11 @@ - - - - - - - - - + + + + + + + + + + diff --git a/src/assets/img/networks/karura.svg b/src/assets/img/networks/karura.svg index 38b9efe9f..61b0e84b3 100644 --- a/src/assets/img/networks/karura.svg +++ b/src/assets/img/networks/karura.svg @@ -1,15 +1,16 @@ - + + - - + + - - - + + + - - - + + + - \ No newline at end of file + diff --git a/src/assets/img/networks/klaytn.svg b/src/assets/img/networks/klaytn.svg index f24aa6c01..2eee14ebe 100644 --- a/src/assets/img/networks/klaytn.svg +++ b/src/assets/img/networks/klaytn.svg @@ -1,31 +1,32 @@ - - - - - - + + + + + + + - - - - - + + + + + - - - + + + - - - - - - - + + + + + + + - - - + + + diff --git a/src/assets/img/networks/kusama.svg b/src/assets/img/networks/kusama.svg index 7c5d10ccd..e6b36ef73 100644 --- a/src/assets/img/networks/kusama.svg +++ b/src/assets/img/networks/kusama.svg @@ -1,4 +1,5 @@ - - - + + + + diff --git a/src/assets/img/networks/liberland.svg b/src/assets/img/networks/liberland.svg index 9fa8aa6a8..c3a537859 100644 --- a/src/assets/img/networks/liberland.svg +++ b/src/assets/img/networks/liberland.svg @@ -1 +1,2 @@ - \ No newline at end of file + + diff --git a/src/assets/img/networks/polkadot.svg b/src/assets/img/networks/polkadot.svg index a698aaa42..6c6de81a2 100644 --- a/src/assets/img/networks/polkadot.svg +++ b/src/assets/img/networks/polkadot.svg @@ -1,9 +1,10 @@ - + + - - - - - - + + + + + + diff --git a/src/assets/img/networks/polygon.svg b/src/assets/img/networks/polygon.svg index a5bb6124f..82df3cc0a 100644 --- a/src/assets/img/networks/polygon.svg +++ b/src/assets/img/networks/polygon.svg @@ -1,16 +1,9 @@ - - - + + - - - + + + diff --git a/src/assets/img/networks/rococo.svg b/src/assets/img/networks/rococo.svg index a17e506f5..e94221bbb 100644 --- a/src/assets/img/networks/rococo.svg +++ b/src/assets/img/networks/rococo.svg @@ -1 +1,23 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/networks/sora-kusama.svg b/src/assets/img/networks/sora-kusama.svg index 0fb4484ca..da75c1fd3 100644 --- a/src/assets/img/networks/sora-kusama.svg +++ b/src/assets/img/networks/sora-kusama.svg @@ -1,5 +1,6 @@ - - - - + + + + + diff --git a/src/assets/img/networks/sora-polkadot.svg b/src/assets/img/networks/sora-polkadot.svg index d531d5832..7e1da7af6 100644 --- a/src/assets/img/networks/sora-polkadot.svg +++ b/src/assets/img/networks/sora-polkadot.svg @@ -1,5 +1,6 @@ - - - + + + + diff --git a/src/assets/img/networks/sora.svg b/src/assets/img/networks/sora.svg index b68824c82..4773e6e88 100644 --- a/src/assets/img/networks/sora.svg +++ b/src/assets/img/networks/sora.svg @@ -1,34 +1,26 @@ - - - + + - + - - + + - - - + + + @@ -37,87 +29,31 @@ - + - + - - + + - - - - + + + + - - - - - - - - - + + + + + - - - - - - - - - + + + + + + + From eada56660fce8d26913fe7384503490fa4735424 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:10:09 +0300 Subject: [PATCH 31/39] Improve bridge locked amount check (#1381) * check bridge locked amount usinf asset kind * return bridge history search field * fix first connection logic * improve bridge history search --- src/App.vue | 6 +-- src/components/mixins/BridgeMixin.ts | 11 ++--- .../pages/Moonpay/BridgeInitMixin.ts | 3 +- src/store/bridge/actions.ts | 42 +++++++--------- src/store/bridge/getters.ts | 17 +++++++ src/utils/bridge/eth/classes/history.ts | 3 +- src/utils/bridge/eth/utils.ts | 4 +- src/views/BridgeTransactionsHistory.vue | 48 +++++++++++++------ 8 files changed, 79 insertions(+), 55 deletions(-) diff --git a/src/App.vue b/src/App.vue index dd3bfee13..9cc9abdd7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -378,13 +378,13 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) onReconnect: this.handleNodeConnect, }), ]); - + } catch (error) { + // we handled error using callback, do nothing + } finally { // Wallet node connection dependent logic if (!this.isWalletLoaded) { await initWallet(walletOptions); } - } catch (error) { - // we handled error using callback, do nothing } } } diff --git a/src/components/mixins/BridgeMixin.ts b/src/components/mixins/BridgeMixin.ts index 782c0e552..3d72d17a1 100644 --- a/src/components/mixins/BridgeMixin.ts +++ b/src/components/mixins/BridgeMixin.ts @@ -6,11 +6,9 @@ import WalletConnectMixin from '@/components/mixins/WalletConnectMixin'; import { PageNames } from '@/consts'; import router from '@/router'; import { getter, state } from '@/store/decorators'; -import { subBridgeApi } from '@/utils/bridge/sub/api'; import type { CodecString } from '@sora-substrate/util'; import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types'; -import type { SubNetwork } from '@sora-substrate/util/build/bridgeProxy/sub/types'; @Component export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConnectMixin) { @@ -31,6 +29,7 @@ export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConne @getter.bridge.recipient recipient!: string; @getter.bridge.externalNetworkFee externalNetworkFee!: CodecString; @getter.bridge.isNativeTokenSelected isNativeTokenSelected!: boolean; + @getter.bridge.isSidechainAsset isSidechainAsset!: boolean; @getter.assets.xor xor!: RegisteredAccountAsset; get nativeTokenSymbol(): string { @@ -45,14 +44,10 @@ export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConne return FPNumber.fromCodecValue(this.externalTransferFee, this.asset?.externalDecimals); } - get assetLockedOnSora(): boolean { - return !subBridgeApi.isSoraParachain(this.networkSelected as SubNetwork); - } - get outgoingMaxAmount(): FPNumber | null { const locks = [this.outgoingMaxLimit]; - if (this.assetLockedOnSora) locks.push(this.assetLockedBalance); + if (this.isSidechainAsset) locks.push(this.assetLockedBalance); const filtered = locks.filter((item) => !!item) as FPNumber[]; @@ -71,7 +66,7 @@ export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConne } get incomingMaxAmount(): FPNumber | null { - if (this.assetLockedOnSora) return null; + if (this.isSidechainAsset) return null; return this.assetLockedBalance ?? null; } diff --git a/src/components/pages/Moonpay/BridgeInitMixin.ts b/src/components/pages/Moonpay/BridgeInitMixin.ts index 3ab8610f0..97e3bba0b 100644 --- a/src/components/pages/Moonpay/BridgeInitMixin.ts +++ b/src/components/pages/Moonpay/BridgeInitMixin.ts @@ -17,7 +17,6 @@ import { MoonpayEVMTransferAssetData, MoonpayApi } from '@/utils/moonpay'; import type { CodecString } from '@sora-substrate/util'; import type { RegisteredAccountAsset, AccountBalance } from '@sora-substrate/util/build/assets/types'; -import type { EthAssetKind } from '@sora-substrate/util/build/bridgeProxy/eth/consts'; import type { EthHistory } from '@sora-substrate/util/build/bridgeProxy/eth/types'; import type { EvmNetwork } from '@sora-substrate/util/build/bridgeProxy/evm/types'; import type { BridgeNetworkId } from '@sora-substrate/util/build/bridgeProxy/types'; @@ -157,7 +156,7 @@ export default class MoonpayBridgeInitMixin extends Mixins(BridgeHistoryMixin, W const evmNetworkFee: CodecString = await getEthNetworkFee( asset, - registeredAsset.kind as EthAssetKind, + registeredAsset.kind, this.contractAddress, ethTransferData.amount, false, diff --git a/src/store/bridge/actions.ts b/src/store/bridge/actions.ts index 35d6fad51..d53047b90 100644 --- a/src/store/bridge/actions.ts +++ b/src/store/bridge/actions.ts @@ -3,7 +3,6 @@ import { FPNumber } from '@sora-substrate/util'; import { getAssetBalance } from '@sora-substrate/util/build/assets'; import { DAI } from '@sora-substrate/util/build/assets/consts'; import { BridgeTxStatus, BridgeTxDirection, BridgeNetworkType } from '@sora-substrate/util/build/bridgeProxy/consts'; -import { EthAssetKind } from '@sora-substrate/util/build/bridgeProxy/eth/consts'; import { DexId } from '@sora-substrate/util/build/dex/consts'; import { api, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; import { defineActions } from 'direct-vuex'; @@ -142,7 +141,7 @@ async function getEvmNetworkFee(context: ActionContext): Promise fee = await getEthNetworkFee( asset, - bridgeRegisteredAsset.kind as EthAssetKind, + bridgeRegisteredAsset.kind, contractAddress, value, state.isSoraToEvm, @@ -235,33 +234,28 @@ async function updateEthHistory(context: ActionContext, clearHistory = async function updateEthLockedBalance(context: ActionContext): Promise { const { commit, getters, rootGetters, rootState } = bridgeActionContext(context); - const { address, decimals, externalAddress } = getters.asset ?? {}; + const { isRegisteredAsset, isSidechainAsset, asset } = getters; + const { address, decimals, externalAddress, externalDecimals } = asset ?? {}; const { networkSelected } = rootState.web3; const { isValidNetwork, contractAddress } = rootGetters.web3; const bridgeContractAddress = contractAddress(KnownEthBridgeAsset.Other); - if (address && networkSelected && isValidNetwork && externalAddress && bridgeContractAddress) { - const registeredAsset = rootState.assets.registeredAssets[address]; - - if (registeredAsset) { - const { kind, decimals: externalDecimals } = registeredAsset; - - if (kind === EthAssetKind.Sidechain) { - const [lockedValue, bridgeValue] = await Promise.all([ - ethBridgeApi.getLockedAssets(networkSelected as number, address), - ethersUtil.getAccountAssetBalance(bridgeContractAddress, externalAddress), - ]); - const balance = FPNumber.min( - FPNumber.fromCodecValue(lockedValue, decimals), - FPNumber.fromCodecValue(bridgeValue, externalDecimals) - ); - commit.setAssetLockedBalance(balance); - return; - } - } - } + const hasNetworkData = !!networkSelected && isValidNetwork && !!bridgeContractAddress; + const hasAssetData = !!address && !!externalAddress && isRegisteredAsset; - commit.setAssetLockedBalance(); + if (hasNetworkData && hasAssetData && isSidechainAsset) { + const [lockedValue, bridgeValue] = await Promise.all([ + ethBridgeApi.getLockedAssets(networkSelected as number, address), + ethersUtil.getAccountAssetBalance(bridgeContractAddress, externalAddress), + ]); + const balance = FPNumber.min( + FPNumber.fromCodecValue(lockedValue, decimals), + FPNumber.fromCodecValue(bridgeValue, externalDecimals) + ); + commit.setAssetLockedBalance(balance); + } else { + commit.setAssetLockedBalance(); + } } async function updateBridgeProxyLockedBalance(context: ActionContext): Promise { diff --git a/src/store/bridge/getters.ts b/src/store/bridge/getters.ts index 982fc8a6d..cb7216d26 100644 --- a/src/store/bridge/getters.ts +++ b/src/store/bridge/getters.ts @@ -1,5 +1,7 @@ import { Operation } from '@sora-substrate/util'; import { BridgeNetworkType } from '@sora-substrate/util/build/bridgeProxy/consts'; +import { EthAssetKind } from '@sora-substrate/util/build/bridgeProxy/eth/consts'; +import { SubAssetKind } from '@sora-substrate/util/build/bridgeProxy/sub/consts'; import { defineGetters } from 'direct-vuex'; import { ZeroStringValue } from '@/consts'; @@ -77,6 +79,21 @@ const getters = defineGetters()({ return !!asset?.externalAddress; }, + isSidechainAsset(...args): boolean { + const { getters, rootState } = bridgeGetterContext(args); + const { asset, isSubBridge } = getters; + const { registeredAssets } = rootState.assets; + + if (!asset) return false; + if (!(asset.address in registeredAssets)) return false; + + const registered = registeredAssets[asset.address]; + const kind = registered.kind; + const sidechainKind = isSubBridge ? SubAssetKind.Sidechain : EthAssetKind.Sidechain; + + return kind === sidechainKind; + }, + autoselectedAssetAddress(...args): Nullable { const { rootState } = bridgeGetterContext(args); const assetIds = Object.keys(rootState.assets.registeredAssets); diff --git a/src/utils/bridge/eth/classes/history.ts b/src/utils/bridge/eth/classes/history.ts index 48392b66e..c122fa706 100644 --- a/src/utils/bridge/eth/classes/history.ts +++ b/src/utils/bridge/eth/classes/history.ts @@ -102,7 +102,8 @@ const getReceiptData = async (externalHash: string) => { }; const getEvmBlockNumber = (ethereumTx: ethers.TransactionResponse | null) => { - return ethereumTx?.blockNumber; + const blockNumber = ethereumTx?.blockNumber; // could be a string + return blockNumber ? +blockNumber : null; }; const getEvmBlockId = (ethereumTx: ethers.TransactionResponse | null) => { diff --git a/src/utils/bridge/eth/utils.ts b/src/utils/bridge/eth/utils.ts index 8fc63cb1d..a3378532f 100644 --- a/src/utils/bridge/eth/utils.ts +++ b/src/utils/bridge/eth/utils.ts @@ -246,7 +246,7 @@ const getEthBridgeIncomingGasLimit = (assetEvmAddress: string): bigint => { export async function getEthNetworkFee( asset: RegisteredAccountAsset, - assetKind: EthAssetKind, + assetKind: string, getContractAddress: (symbol: KnownEthBridgeAsset) => Nullable, value: string, isOutgoing: boolean, @@ -256,7 +256,7 @@ export async function getEthNetworkFee( let gasLimitTotal!: bigint; if (isOutgoing) { - gasLimitTotal = getEthBridgeOutgoingGasLimit(asset.externalAddress, assetKind); + gasLimitTotal = getEthBridgeOutgoingGasLimit(asset.externalAddress, assetKind as EthAssetKind); } else { const bridgeContractAddress = getContractAddress(KnownEthBridgeAsset.Other) as string; const allowance = await ethersUtil.getAllowance(evmAccount, bridgeContractAddress, asset.externalAddress); diff --git a/src/views/BridgeTransactionsHistory.vue b/src/views/BridgeTransactionsHistory.vue index 60eb20d1c..79f32edb3 100644 --- a/src/views/BridgeTransactionsHistory.vue +++ b/src/views/BridgeTransactionsHistory.vue @@ -12,7 +12,7 @@ ): Array { - if (this.query) { - const query = this.query.toLowerCase().trim(); - return history.filter( - (item) => - `${item.assetAddress}`.toLowerCase().includes(query) || - `${this.registeredAssets[item.assetAddress as string]?.address}`.toLowerCase().includes(query) || - `${item.symbol}`.toLowerCase().includes(query) - ); - } + if (!this.query) return history; + + const query = this.query.toLowerCase().trim(); - return history; + return history.filter((item) => { + const bridgeRegisteredAsset = this.registeredAssets[item.assetAddress as string]; + const criterias = [bridgeRegisteredAsset?.address]; + + SearchAttrs.forEach((attr) => { + if (attr in item) criterias.push(item[attr]); + }); + + return criterias.some((criteria) => String(criteria).toLowerCase().includes(query)); + }); } - formatAmount(historyItem: IBridgeTransaction, received = false): string { - const amount = received ? historyItem.amount2 ?? historyItem.amount : historyItem.amount; + formatAmount(item: IBridgeTransaction, received = false): string { + const amount = received ? item.amount2 ?? item.amount : item.amount; - if (!historyItem.assetAddress || !amount) return ''; + if (!item.assetAddress || !amount) return ''; - const decimals = this.registeredAssets?.[historyItem.assetAddress]?.decimals; + const bridgeRegisteredAsset = this.registeredAssets[item.assetAddress]; + const decimals = bridgeRegisteredAsset?.decimals; return this.formatStringValue(amount, decimals); } From 270626d5bdc3ed640b2efef19f09454c413f959c Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Mon, 8 Apr 2024 08:38:04 +0200 Subject: [PATCH 32/39] Set Tokens as default tab for Explore page (#1383) --- src/router/index.ts | 2 +- src/views/Explore/Container.vue | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/router/index.ts b/src/router/index.ts index da112be60..22f1f62f3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -163,7 +163,7 @@ const routes: Array = [ path: '/explore', name: PageNames.ExploreContainer, component: lazyView(PageNames.ExploreContainer), - redirect: { name: PageNames.ExploreFarming }, + redirect: { name: PageNames.ExploreTokens }, children: [ { path: 'demeter', diff --git a/src/views/Explore/Container.vue b/src/views/Explore/Container.vue index 8ebd9270c..b71295bff 100644 --- a/src/views/Explore/Container.vue +++ b/src/views/Explore/Container.vue @@ -86,6 +86,10 @@ export default class ExploreContainer extends Mixins(mixins.LoadingMixin, Transl get tabs(): Array<{ name: string; label: string; icon: string }> { return [ + { + name: PageNames.ExploreTokens, + icon: 'file-file-text-24', + }, { name: PageNames.ExploreFarming, icon: 'various-toy-horse-24', @@ -98,10 +102,6 @@ export default class ExploreContainer extends Mixins(mixins.LoadingMixin, Transl name: PageNames.ExploreStaking, icon: 'basic-layers-24', }, - { - name: PageNames.ExploreTokens, - icon: 'file-file-text-24', - }, { name: PageNames.ExploreBooks, icon: 'music-CD-24', From c12e5d979887477e4475cf7a69d317a67ec3db40 Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Tue, 9 Apr 2024 11:52:34 +0200 Subject: [PATCH 33/39] Use PSWAP token instead of file-file-text-24 (#1384) * Use PSWAP token instead of file-file-text-24 * Update wallet lib --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --- package.json | 2 +- src/components/pages/Referrals/ConfirmInviteUser.vue | 2 +- src/consts/index.ts | 2 +- src/views/Explore/Container.vue | 2 +- yarn.lock | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index e2168b010..353bb5975 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.32.7", + "@soramitsu/soraneo-wallet-web": "1.32.8", "@walletconnect/ethereum-provider": "^2.11.2", "@walletconnect/modal": "^2.6.2", "core-js": "^3.36.0", diff --git a/src/components/pages/Referrals/ConfirmInviteUser.vue b/src/components/pages/Referrals/ConfirmInviteUser.vue index a57b6ef6c..8105756d5 100644 --- a/src/components/pages/Referrals/ConfirmInviteUser.vue +++ b/src/components/pages/Referrals/ConfirmInviteUser.vue @@ -47,7 +47,7 @@ export default class ReferralsConfirmInviteUser extends Mixins(mixins.Transactio } get iconName(): string { - return this.hasReferrer ? 'notifications-alert-triangle-24' : 'file-file-text-24'; + return this.hasReferrer ? 'notifications-alert-triangle-24' : 'finance-PSWAP-24'; } get iconSize(): number { diff --git a/src/consts/index.ts b/src/consts/index.ts index 453f4d00a..6b7e604db 100644 --- a/src/consts/index.ts +++ b/src/consts/index.ts @@ -380,7 +380,7 @@ const OtherPagesMenu: Array = [ href: '/#/card', }, { - icon: 'file-file-text-24', + icon: 'finance-PSWAP-24', title: PageNames.About, href: '/#/about', }, diff --git a/src/views/Explore/Container.vue b/src/views/Explore/Container.vue index b71295bff..ada80564f 100644 --- a/src/views/Explore/Container.vue +++ b/src/views/Explore/Container.vue @@ -88,7 +88,7 @@ export default class ExploreContainer extends Mixins(mixins.LoadingMixin, Transl return [ { name: PageNames.ExploreTokens, - icon: 'file-file-text-24', + icon: 'finance-PSWAP-24', }, { name: PageNames.ExploreFarming, diff --git a/yarn.lock b/yarn.lock index ab17e8329..1ac44657a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2443,10 +2443,10 @@ vue-property-decorator "^9.1.2" vuex "^3.6.2" -"@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== +"@soramitsu/soraneo-wallet-web@1.32.8": + version "1.32.8" + resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.8.tgz#5c6c1e69fe77d15f7d50e6e684f2f906b9f9b27e" + integrity sha512-/AMsyybfySrI8Xg0U5OuW0dxHTg/h6yYl/A0hLtmeeoMYu9fuTISMDYqIAWZP6PKxtUlaZIEo0U+sXTcLVU5hA== dependencies: "@polkadot/vue-identicon" "2.12.1" "@sora-substrate/util" "1.33.2" From 47bfa50dce0b43b89bf2c36cad77e9c164fd8ae5 Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Tue, 9 Apr 2024 14:46:44 +0200 Subject: [PATCH 34/39] Fix default explore page (#1386) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --- src/components/App/Menu/AppMenu.vue | 2 +- src/consts/index.ts | 6 +++--- src/router/index.ts | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/App/Menu/AppMenu.vue b/src/components/App/Menu/AppMenu.vue index 9212cf85f..5694f60ef 100644 --- a/src/components/App/Menu/AppMenu.vue +++ b/src/components/App/Menu/AppMenu.vue @@ -175,7 +175,7 @@ export default class AppMenu extends Mixins(TranslationMixin) { return StakingPageNames.Staking; } if (ExploreChildPages.includes(currentName)) { - return PageNames.ExploreFarming; + return PageNames.ExploreTokens; } return currentName as string; } diff --git a/src/consts/index.ts b/src/consts/index.ts index 6b7e604db..9ef9d52f7 100644 --- a/src/consts/index.ts +++ b/src/consts/index.ts @@ -362,7 +362,7 @@ const OtherPagesMenu: Array = [ icon: 'various-items-24', title: PageNames.ExploreContainer, href: '/#/explore', - index: PageNames.ExploreFarming, + index: PageNames.ExploreTokens, }, { icon: 'various-planet-24', @@ -462,10 +462,10 @@ export const StakingChildPages = [ SoraStakingPageNames.SelectValidators, ]; export const ExploreChildPages = [ - PageNames.ExploreFarming, // By default + PageNames.ExploreTokens, // By default PageNames.ExploreStaking, PageNames.ExplorePools, - PageNames.ExploreTokens, + PageNames.ExploreFarming, PageNames.ExploreBooks, ]; diff --git a/src/router/index.ts b/src/router/index.ts index 22f1f62f3..940cc39ad 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -165,6 +165,11 @@ const routes: Array = [ component: lazyView(PageNames.ExploreContainer), redirect: { name: PageNames.ExploreTokens }, children: [ + { + path: 'tokens', + name: PageNames.ExploreTokens, + component: lazyView(PageNames.ExploreTokens), + }, { path: 'demeter', component: demeterStakingLazyView(DemeterStakingPageNames.DataContainer), @@ -194,11 +199,6 @@ const routes: Array = [ }, ], }, - { - path: 'tokens', - name: PageNames.ExploreTokens, - component: lazyView(PageNames.ExploreTokens), - }, { path: 'books', name: PageNames.ExploreBooks, From 13baf0062c5be832ab46771b3f37a48f3eabfc0e Mon Sep 17 00:00:00 2001 From: Rustem Date: Wed, 17 Apr 2024 14:52:42 +0300 Subject: [PATCH 35/39] bump wallet (#1389) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 353bb5975..2fc1c642d 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.32.8", + "@soramitsu/soraneo-wallet-web": "1.33.0", "@walletconnect/ethereum-provider": "^2.11.2", "@walletconnect/modal": "^2.6.2", "core-js": "^3.36.0", diff --git a/yarn.lock b/yarn.lock index 1ac44657a..df00f824b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2443,10 +2443,10 @@ vue-property-decorator "^9.1.2" vuex "^3.6.2" -"@soramitsu/soraneo-wallet-web@1.32.8": - version "1.32.8" - resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.32.8.tgz#5c6c1e69fe77d15f7d50e6e684f2f906b9f9b27e" - integrity sha512-/AMsyybfySrI8Xg0U5OuW0dxHTg/h6yYl/A0hLtmeeoMYu9fuTISMDYqIAWZP6PKxtUlaZIEo0U+sXTcLVU5hA== +"@soramitsu/soraneo-wallet-web@1.33.0": + version "1.33.0" + resolved "https://nexus.iroha.tech/repository/npm-group/@soramitsu/soraneo-wallet-web/-/soraneo-wallet-web-1.33.0.tgz#d66f137e68c86006b5f0a3b99552dd5d6c68741c" + integrity sha512-PZTRoVrZ6BCH4erFZxP5OZWl8m84KJkr+/giemPv2TgOsdtY8gA8BXwmyGexbJUel+1sAgsPbmvEV+mTl2hHgg== dependencies: "@polkadot/vue-identicon" "2.12.1" "@sora-substrate/util" "1.33.2" From 256821311466adefea786cff9f8bc63735a8163f Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Fri, 19 Apr 2024 16:04:15 +0700 Subject: [PATCH 36/39] Change SUBSQUID_ENDPOINT --- env.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/env.json b/env.json index c9422348c..e94cc794e 100644 --- a/env.json +++ b/env.json @@ -16,7 +16,7 @@ "orderBook": true }, "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod", - "SUBSQUID_ENDPOINT": "https://squid.subsquid.io/sora/v/v4/graphql", + "SUBSQUID_ENDPOINT": "https://squid.subsquid.io/sora/graphql", "DEFAULT_NETWORKS": [ { "chain": "SORA", From 249b6287c29be1083b91bfc8a77dec34ec41268c Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Fri, 7 Jun 2024 18:52:55 +0300 Subject: [PATCH 37/39] Added subsquid queries --- src/indexer/queries/burnXor.ts | 48 ++++++++++++++++-- src/indexer/queries/kensetsu.ts | 87 ++++++++++++++++++++++++++++++--- src/modules/vault/types.ts | 15 +++++- 3 files changed, 138 insertions(+), 12 deletions(-) diff --git a/src/indexer/queries/burnXor.ts b/src/indexer/queries/burnXor.ts index 75e5f8886..3b511d2fd 100644 --- a/src/indexer/queries/burnXor.ts +++ b/src/indexer/queries/burnXor.ts @@ -1,6 +1,6 @@ import { FPNumber } from '@sora-substrate/util'; import { getCurrentIndexer, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; -import { SubqueryIndexer } from '@soramitsu/soraneo-wallet-web/lib/services/indexer'; +import { SubqueryIndexer, SubsquidIndexer } from '@soramitsu/soraneo-wallet-web/lib/services/indexer'; import { gql } from '@urql/core'; import type { @@ -92,8 +92,8 @@ const dataBeforeIndexing: XorBurn[] = [ }, ]; -const XorBurnQuery = gql>` - query ($start: Int = 0, $end: Int = 0, $after: Cursor = "", $first: Int = 100) { +const SubqueryXorBurnQuery = gql>` + query XorBurnQuery($start: Int = 0, $end: Int = 0, $after: Cursor = "", $first: Int = 100) { data: historyElements( first: $first after: $after @@ -122,6 +122,37 @@ const XorBurnQuery = gql>` } `; +const SubsquidXorBurnQuery = gql>` + query XorBurnQuery($start: Int = 0, $end: Int = 0, $after: String = null, $first: Int = 100) { + data: historyElementsConnection( + orderBy: id_ASC + first: $first + after: $after + where: { + AND: [ + { blockHeight_gte: $start } + { blockHeight_lte: $end } + { module_eq: "assets" } + { method_eq: "burn" } + { data_jsonContains: { assetId: "0x0200000000000000000000000000000000000000000000000000000000000000" } } + ] + } + ) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + address + data + blockHeight + } + } + } + } +`; + const parse = (item: HistoryElement): XorBurn => { const data = item.data as HistoryElementAssetBurn; @@ -139,11 +170,18 @@ export async function fetchData(start: number, end: number): Promise case IndexerType.SUBQUERY: { const variables = { start, end }; const subqueryIndexer = indexer as SubqueryIndexer; - const items = await subqueryIndexer.services.explorer.fetchAllEntities(XorBurnQuery, variables, parse); + const items = await subqueryIndexer.services.explorer.fetchAllEntities(SubqueryXorBurnQuery, variables, parse); return [...(items ?? []), ...dataBeforeIndexing]; } case IndexerType.SUBSQUID: { - return []; + const variables = { start, end }; + const subsquidIndexer = indexer as SubsquidIndexer; + const items = await subsquidIndexer.services.explorer.fetchAllEntitiesConnection( + SubsquidXorBurnQuery, + variables, + parse + ); + return [...(items ?? []), ...dataBeforeIndexing]; } } diff --git a/src/indexer/queries/kensetsu.ts b/src/indexer/queries/kensetsu.ts index 2785d6507..a09184899 100644 --- a/src/indexer/queries/kensetsu.ts +++ b/src/indexer/queries/kensetsu.ts @@ -1,17 +1,18 @@ import { FPNumber } from '@sora-substrate/util'; import { VaultTypes } from '@sora-substrate/util/build/kensetsu/consts'; import { getCurrentIndexer, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; -import { SubqueryIndexer } from '@soramitsu/soraneo-wallet-web/lib/services/indexer'; +import { SubqueryIndexer, SubsquidIndexer } from '@soramitsu/soraneo-wallet-web/lib/services/indexer'; +import { SubsquidQueryResponse } from '@soramitsu/soraneo-wallet-web/lib/services/indexer/subsquid/types'; import { gql } from '@urql/core'; -import type { IndexerVault, ClosedVault, VaultEvent, IndexerVaultEvent } from '@/modules/vault/types'; +import type { SubqueryVault, SubsquidVault, ClosedVault, VaultEvent, IndexerVaultEvent } from '@/modules/vault/types'; import type { FetchVariables } from '@/types/indexers'; import type { ConnectionQueryResponse } from '@soramitsu/soraneo-wallet-web/lib/services/indexer/types'; const { IndexerType } = WALLET_CONSTS; -const SubqueryClosedVaultsQuery = gql>` +const SubqueryClosedVaultsQuery = gql>` query ClosedVaultsQuery($account: String, $after: Cursor = "", $first: Int = 100) { data: vaults( first: $first @@ -37,7 +38,37 @@ const SubqueryClosedVaultsQuery = gql>` } `; -const parseVaults = (vault: IndexerVault): ClosedVault => { +const SubsquidClosedVaultsQuery = gql>` + query ClosedVaultsQuery($account: String, $after: String = null, $first: Int = 100) { + data: vaultsConnection( + first: $first + after: $after + where: { AND: [{ owner: { id_eq: $account } }, { status_in: [Closed, Liquidated] }] } + orderBy: updatedAtBlock_DESC + ) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + id + type + status + collateralAsset { + id + } + debtAsset { + id + } + collateralAmountReturned + } + } + } + } +`; + +const parseSubqueryVault = (vault: SubqueryVault): ClosedVault => { return { id: +vault.id, vaultType: vault.type === 'Type1' ? VaultTypes.V1 : VaultTypes.V2, @@ -48,6 +79,17 @@ const parseVaults = (vault: IndexerVault): ClosedVault => { }; }; +const parseSubsquidVault = (vault: SubsquidVault): ClosedVault => { + return { + id: +vault.id, + vaultType: vault.type === 'Type1' ? VaultTypes.V1 : VaultTypes.V2, + status: vault.status, + returned: new FPNumber(vault.collateralAmountReturned), + lockedAssetId: vault.collateralAsset.id, + debtAssetId: vault.debtAsset.id, + }; +}; + export async function fetchClosedVaults(account: string): Promise { const indexer = getCurrentIndexer(); @@ -58,12 +100,19 @@ export async function fetchClosedVaults(account: string): Promise const items = await subqueryIndexer.services.explorer.fetchAllEntities( SubqueryClosedVaultsQuery, variables, - parseVaults + parseSubqueryVault ); return items ?? []; } case IndexerType.SUBSQUID: { - return []; + const variables = { account }; + const subsquidIndexer = indexer as SubsquidIndexer; + const items = await subsquidIndexer.services.explorer.fetchAllEntitiesConnection( + SubsquidClosedVaultsQuery, + variables, + parseSubsquidVault + ); + return items ?? []; } } @@ -90,6 +139,20 @@ const SubqueryVaultDetailsQuery = gql } `; +const SubsquidVaultDetailsQuery = gql>` + query VaultDetailsQuery($first: Int = null, $offset: Int = null, $filter: VaultEventWhereInput) { + info: vaultEventsConnection(first: 0, where: $filter, orderBy: [timestamp_DESC, id_DESC]) { + totalCount + } + nodes: vaultEvents(limit: $first, offset: $offset, where: $filter, orderBy: [timestamp_DESC, id_DESC]) { + id + amount + type + timestamp + } + } +`; + const subqueryVaultEventsFilter = (vaultId: string | number, fromTimestamp?: number) => { const filter: any = { vaultId: { equalTo: String(vaultId) } }; @@ -128,6 +191,18 @@ export async function fetchVaultEvents(variables: FetchVariables): Promise<{ totalCount = response.totalCount; items = response.edges.map((edge) => parseVaultEvents(edge.node)); } + break; + } + case IndexerType.SUBSQUID: { + const filter = subqueryVaultEventsFilter(id, fromTimestamp); + const variables = { first, offset, filter }; + const subsquidIndexer = indexer as SubsquidIndexer; + const response = await subsquidIndexer.services.explorer.fetchEntities(SubsquidVaultDetailsQuery, variables); + if (response) { + totalCount = response.totalCount; + items = response.nodes.map((edge) => parseVaultEvents(edge)); + } + break; } } diff --git a/src/modules/vault/types.ts b/src/modules/vault/types.ts index 54296fdba..023be6558 100644 --- a/src/modules/vault/types.ts +++ b/src/modules/vault/types.ts @@ -17,7 +17,7 @@ export type IndexerVaultEvent = { type: VaultEventType; }; -export type IndexerVault = { +export type SubqueryVault = { id: string; type: 'Type1' | 'Type2'; status: VaultStatus; @@ -26,6 +26,19 @@ export type IndexerVault = { collateralAmountReturned: string; }; +export type SubsquidVault = { + id: string; + type: 'Type1' | 'Type2'; + status: VaultStatus; + collateralAsset: { + id: string; + }; + debtAsset: { + id: string; + }; + collateralAmountReturned: string; +}; + export type ClosedVault = Omit & { status: VaultStatus; returned: FPNumber; From 2336ed59c24d19e758616d1794ec109bb4adc6e9 Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Fri, 7 Jun 2024 19:11:33 +0300 Subject: [PATCH 38/39] Test --- src/consts/snapshots.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/consts/snapshots.ts b/src/consts/snapshots.ts index 197ef19cf..18550472a 100644 --- a/src/consts/snapshots.ts +++ b/src/consts/snapshots.ts @@ -82,6 +82,7 @@ export const NETWORK_STATS_FILTERS: SnapshotFilter[] = [ QUARTER_IN_DAYS_FILTER, HALF_YEAR_IN_DAYS_FILTER, YEAR_IN_MONTHS_FILTER, + ALL_IN_DAYS_FILTER, ]; export const ASSET_SUPPLY_LINE_FILTERS: SnapshotFilter[] = [ @@ -91,4 +92,5 @@ export const ASSET_SUPPLY_LINE_FILTERS: SnapshotFilter[] = [ QUARTER_IN_DAYS_FILTER, HALF_YEAR_IN_DAYS_FILTER, YEAR_IN_DAYS_FILTER, + ALL_IN_DAYS_FILTER, ]; From 7192677182b5e63c5185035c506d611f87b87adc Mon Sep 17 00:00:00 2001 From: RDMStreet Date: Thu, 13 Jun 2024 18:11:21 +0300 Subject: [PATCH 39/39] Remove all filter --- src/consts/snapshots.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/consts/snapshots.ts b/src/consts/snapshots.ts index 18550472a..197ef19cf 100644 --- a/src/consts/snapshots.ts +++ b/src/consts/snapshots.ts @@ -82,7 +82,6 @@ export const NETWORK_STATS_FILTERS: SnapshotFilter[] = [ QUARTER_IN_DAYS_FILTER, HALF_YEAR_IN_DAYS_FILTER, YEAR_IN_MONTHS_FILTER, - ALL_IN_DAYS_FILTER, ]; export const ASSET_SUPPLY_LINE_FILTERS: SnapshotFilter[] = [ @@ -92,5 +91,4 @@ export const ASSET_SUPPLY_LINE_FILTERS: SnapshotFilter[] = [ QUARTER_IN_DAYS_FILTER, HALF_YEAR_IN_DAYS_FILTER, YEAR_IN_DAYS_FILTER, - ALL_IN_DAYS_FILTER, ];