From 695c84e438963d0719f66566ddc271be010e1b71 Mon Sep 17 00:00:00 2001 From: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Date: Wed, 22 May 2024 21:24:57 +0300 Subject: [PATCH] Enable Liberland (#1414) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix release 1.21 issues (#1160) * Update address book input props * Replace toPromise * Update wallet lib * Update translations * Update referral system strings --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Remove synths blockers from Add LP (#1162) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add synthetic switcher to select asset (#1161) * add synthetic switcher to select asset * fix check in create alert * update add liquidity select token --------- Co-authored-by: Stefan Popov * Improve ads (#1163) * Add first version of dynamic ads * Add responsive * Fix sora card progress bar styles * Add screenBreakpointClass * Make header responsive * Make FiatDeposit view responsive * Fix names & remove unused svg-s * Update AppAd.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add debounce to resize event (#1164) * Add debounce to resize event * Fix names * Fix images size --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix content bottom margin (#1165) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update App.vue (#1167) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Merge master (#1168) * Release 0.1.2 (#80) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * Release 0.1.3 (#97) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * Release 0.1.3 (#100) * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Release 0.1.4 (#126) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Add namespace & types for swap (#101) * Fix price and swap info (#104) * Fix price calculations * Update SwapInfo.vue * Update wallet & api (#105) * Fix swap links (#106) * Fix swap links * Update wallet * Update api (#111) * up wallet version (#112) * Updated wallet version to 0.6.3 (#113) * Updated wallet version to 0.6.4. (#114) * Polkaswap layout redesign (#98) (#102) * Polkaswap layout redesign (#98) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * fix sidebar item hover css * fix disabled item css * Move bridge functionality (#103) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality Co-authored-by: Nikita-Polyakov * Update wallet & api * PSS-524: Bridge (#107) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality * Bridge: Updated unauthorized routes. * Updated Generic Page Header, updated Bridge screens. * Fixed token icons. * Bridge: Updated styles. * Updated tooltips. * Removed unused token images. * Refactored due to PR comments. Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov * Fix/pss 539 metamsk lock issue (#108) * improve subscribers * add check account is connected * Fix/balance flickering (#109) * wip update balance flow * refactoring views and store modules * remove unused code * fixes after review * Update yarn.lock * Updated wallet version. * Updated wallet version to 0.6.4. * Updated wallet version to 0.6.5. * PSS-540: Add Pending Transactions to Bridge History (#115) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality * Bridge: Updated unauthorized routes. * Updated Generic Page Header, updated Bridge screens. * Fixed token icons. * Bridge: Updated styles. * Updated tooltips. * Removed btc icon. * Updated due to PR comments. * Updated due to PR comments. * Reverted formatAddress changes. * Added pending state. * Updated wallet version. * Fix bridge functionality Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov Co-authored-by: Alex Natalia * Select dialog updates (#118) * Modify select dialog * Remove all symbol dependencies * PSS-502: Swap And Pool Redesign (#117) * Separated Swap and Pool. * Changed assets filter from symbol to address. * Updated wallet version to 0.7.1. * Fixed assets addresses behaviour for bridge. * Reverted previous version of the wallet, fixed some places due to PR comments. Co-authored-by: Alex Natalia * Update styles and icons (#119) * Fix styles and icons * Update BrandedTooltip.vue * Update wallet & ui library versions * Update LICENSE * Update package.json * Fix issues Co-authored-by: Stefan Popov Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Alex Natalia * Redesign Updates (#120) * Refactored buttons styles, changed some translation to common one. * Updated tooltips, screens info area. * Updated info blocks. * Updated info blocks in confirmation and pool screens. * Combined input area styles. * Update About.vue * GenericPageHeader: Changed default prop of tooltip placement. Signed-off-by: alexnatalia Co-authored-by: Stefan Popov * update wallet to 0.7.4 (#121) * remove getAssets from select-token dialog (#123) * PSS-573 WEB UI. MAX button for bridge work incorrect. (#124) * fix calc max value * remove console.log * update wallet 0.7.7 & hide farming in menu * refactoring (#122) * Fix issues (#125) * Remove default values from props * Fix issues Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Alex Natalia * Release 0.1.5 (#158) * Release 0.1.5 (#161) * Release 0.1.6 (#170) * Release 0.1.6 (#174) * Release 0.1.7 (#190) * Release 0.1.8 (#200) * Release 0.1.9 (#206) * Release 1.0.0 (#208) * Update styles * Update wallet * Fix wait message for bridge eth->sora flow * Fix page amount for bridge * Fix bridge icons * Fix swap checks for XOR output without XOR or with XOR balance < network fee * Release 1.0.0 (#212) * Release 1.0.0 (#215) * Release 1.0.0 (#219) * Release 1.0.1 (#226) * Release 1.0.2 (#234) * Release 1.1.0 (#244) * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Add namespace & types for swap (#101) * Fix price and swap info (#104) * Fix price calculations * Update SwapInfo.vue * Update wallet & api (#105) * Fix swap links (#106) * Fix swap links * Update wallet * Update api (#111) * up wallet version (#112) * Updated wallet version to 0.6.3 (#113) * Updated wallet version to 0.6.4. (#114) * Polkaswap layout redesign (#98) (#102) * Polkaswap layout redesign (#98) * pss-498 header redesign * w… * fix (#1172) * Fix release 1.21 issues (#1175) * Bump version * Demeter dialog remove extra padding * Update yarn.lock --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: shlavik * Enable supply chart for all tokens (#1170) * Enable supply chart for all tokens * Update package.json --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * [Bridge] Add Min & Max limits (#1151) * remove vue-svg-loader * remove cache-loader from vue-loader * rewrite vue.config.js * update wallet * css fixes * remove sass warnings * fix spacing * add alt attrs to RoadMap * remove some todo * update ethers usage * refactoring ethers utils * add type annotaions * small fixes * wip external fee * refactoring adapter to remove hardcoded networks usage * add prefix for external fee * history restoration console info * fix sub bridge max btn * remove external network fee getter * refactoring * fix sonar issues * refactoring bridge utils * update api.query usage * improve tracking * refactoring sub reducers * improve sub history restoration * sonar issue refactoring * wip external fiat values * add nativeTOken getter to bridge * fix BridgeTransaction address * refactoring balance utils * remove bridgeApi from getters * fix transaction view prefix * update wallet 1.21.2 * add asset limit subscription * rework asset transfer limit update * update bridge subscription logic * bridge view computed * remove unused variable * prepare for subscription update * asset max limit subscription * update bridge transaction view * add min limit fetching * add getters to bridge views * add bridge limit card * update translations * replace relayChainBlockNumber call * bridge ui fixes * reset bridge form, fix network change * connection additional checks * await isReady promises * open sora parachain connection after select network * refactoring sub networks connector * refactoring web3 store * improve loading states & refactoring actions * fix bridge loading logix * refactoring bridge balances fetching * fix sub network fee & bridge container * update bridge quote * update bridge quote * fix bridge loading state * fix bridge actions promise.all reject * fix connection open * fix locked balance calc * rename web3 method * change CodecString to FPNumber in store balances * refactoring sonar issues * fix bridge amount decimals in form * update eth bridge locked balance * update wallet 1.22.0 * refactoring sonar issues * update filter fn * Fix sub bridge address issues (#1180) * fix address format checks * format sub bridge account address in ss58 * improve externalAccount usage * update wallet 1.22.1 * add xcm fee info * Remove ~ sign (#1179) * Remove ~ sign * Remove not used component * fix address format in hsitory restoration --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Nikita-Polyakov * Fix assets sorting order in swap and bridge (#1181) * fix assets sorting order in swap and bridge * improve sortByBalance * Add scroll into view (#1182) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix sub bridge sora fee & fix eth history restoration (#1183) * update bridge sora fee & history restoration * update message, remove bad util fn * sore fee update optimization * update translations * Add XCM fee to transaction details & some fixes (#1185) * get xcm fee in history * await connection * show xcm fee transaction details * refactoring sub adapter connection * improve connection logs * fix clear history * improve api connections reuse * improve connector check * Update marketing.json (#1186) * Update marketing.json * Update package.json * Update marketing images * Fix long asset names * Improve tokens page --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Subsquid support implementation (#1049) * Subsquid support implementation * Update yarn.lock * Indexer selector * Changed indexer names * Changed icon for indexer selection * Fixes after merge * Update package,json * Fixes * Update sora2-wallet-web version * Remove graphql-ws * Update wallet version * Update wallet version * Empty commit * Updated indexer selector * Updated wallet-web * Update wallet * Status * Update wallet * Fix statistics dialog * Some fixes * Some fixes * Update wallet version * Fix queries * Update yarn.lock * fix tokens page * update dev env.json * remove unused import --------- Co-authored-by: Nikita-Polyakov * card balance appearance (#1173) * add balance fetching logic * prework * make reject reason * add fees * Update Payment.vue * add translations * Update ConfirmationInfo.vue * Update Payment.vue * referenceNumber duplcation * reference number duplication remove * Update Dashboard.vue * fix referenceNumber duplication * make explicit conversion * fix sonar issues * fix css --------- Co-authored-by: safinsaf <45899673+safinsaf@users.noreply.github.com> * UI improvements (#1189) * update SyntheticSwitcher & ExternalLink components * update wallet * update indexer translations * update address book input translation * remove incorrect price from chart * update SelectIndexer modal (#1190) * add walletconnect verification txt file (#1193) * Fix assets query (#1196) * Remove assets liquidity filter * Fix subsquid assets query * Fix assets parse * Update Jenkinsfile (#1197) * fix subquery bridge history (#1200) * Add xorless transfer history support (#1203) * add xorless transfer history support * update translations * remove misleading option (#1204) * remove misleading option * add iban missing feature * Update Dashboard.vue * add focused css * add langs (#1205) * SORA Card: Add country selector (#1206) * SORA CARD: Add country selector * Translate placeholder * Fix lokalise * show balance when iban available only * Update Dashboard.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: RustemYuzlibaev * remove css and if-statement (#1207) * Sustrate bridge prod prepare (#1211) * Release 0.1.2 (#80) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * Release 0.1.3 (#97) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * Release 0.1.3 (#100) * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Release 0.1.4 (#126) * Add base project files * Add About page * Add unit tests * Remove unused files * Update library version * Moved images to img folder. * Refactored some styles, added normalize css. * Fixed article card header font weight. * Fix About snapshot * Fix styles and its imports * PSS-132: Token list store * Add env.json and readme * PSS-134 DevOps: Develop CI and CD processes for Polkaswap web project (#5) * add ci cd Signed-off-by: Bulat Saifullin * fix Dockerfile Signed-off-by: Bulat Saifullin * add pull_request_template.md Signed-off-by: Bulat Saifullin * fix template Signed-off-by: Bulat Saifullin * PSS-132: Select token screen * PSS-132: Refactoring * PSS-132: Change short name to symbol * PSS-132: Add i18n to select token * PSS-132: Add unit tests * PSS-132: Remove elements from tests * Added Swap Interface draft (#4) * Swap Interface: Added screen, Unit Tests, Updated UI Lib version. * PSS-132: Create pair * PSS-132: Fixes for select token * PSS-132: Fix title style * PSS-132: UPdate snaphots * PSS-132: Fix shadow * PSS-132: Fix variable style using * Swap Interface Confirmation Screens (#8) * Added Transaction Submit dialog. * Swap Interface: Moved some variables to store for better relations between different screens and dialogs. * Confirm Swap Dialog: Fixed dialog opening, added confirmation flag to the store. * Added token default logo image, refactored translation call for liquidity. * Added SelectToken dialog on click. * PSS-126: Confirm supply modal * Confirmation screens for create pair * Design fixes * Update ui lib * PSS-126: Logo component * Update tests * Wallet integration and styles issues (#10) * Wallet integration * Fix routing issues * Update UI library version * Refactor all styles * Fix wallet connected state * Update tests * Update test * Update Dockerfile (#12) * PSS-129: Add and remove liquidity page * Design fixes * Token logo check fixes * Refactoring and fixes * Add pair token logo for add liquidity * Settings implementation (#15) * Add settings dialog * Add tests * Update tests * Fix titles for info card * Pool Interface Start Screens (#11) * Pool Interface: Added Start Screen. * Refactored components due to UI Lib updates: set size and border-radius of elements. * Created Dialog wrapper component, refactored dialogs, added fixed top position, fixed close behaviour. * Refactored components imports. * Converted logo icon to link to the home page. * Fixed error in console for Create pair component. * Added Back link behaviour for several components. * Updated unit tests. * PSS-172: Dynamic Page Title (#14) * Added dynamic page title. * PSS-128: Add confirmation screens for pool (#16) * PSS-128: Add confirmation screens for pool Co-authored-by: alexnatalia * Mocks for pool screen * Refactoring * Update tests * Add liquidity button for pairs * Design Fixes and Refactoring (#17) * Refactored TokenLogo and PairTokenLogo components, fixed some bugs, updated unit tests. Refactored components headers. * Added Popper class for info tooltips. Fixed default prop value for Object types. Updated Unit tests. * Design Issues Fix (#19) * Updated configuration variables and Exchange tabs styles. * Updated About page images and styles, Header styles and Menu colors settings. Hid unused links and buttons in header. * Updeted typography variables and Font Styles: Updated Font Size, Line Height and Font Weight Configuration. * Updated Create Pair button styles. Updated Ui Lib version. * Fixed tokens icons for Pool screen. * Updated tooltips to one consistent style. Fixed Pool screen bug. * Refactored: Created special component for Generic Header. Fixed Back icon. * Updated some fonts and Pool screen styles. * Added Empty icon for Select token popup. * Added First Liquidity Provider message to Create a Pair screen. * Hid tooltip for Slider element on Settings screen, hid tooltips for Swap Confirmation. * Updated unit tests. * PSS-205: Remove liquidity: everything should be clickable and with recalculation * Update tests * Fix set remove part to 0 * Inpur for remove part * Fixes * Price container fixes * Update tests * PS-223: Fix remove liquidity in safari * PSS-205: Design Review Issues (#21) * Fixed titles case. Updated buttons with text and icons. Updated typography styles. * Update wallet version & add blockchain integration (#23) * Update wallet version & add blockchain integration * Commented out unit tests. Co-authored-by: alexnatalia * PSS-123: Select token integration * Fix async behavior for dexApi (#25) * Fix async behavior for dexApi * Update .eslintrc.js * PSS-247: Custom Slippage Tolerance Fix (#27) * Updated STab styles. * Updated UI Lib and Wallet versions and styles according to UI Lib fixes. * PSS-129: Add liquiditiy integration * PSS-74 Swap Interface Integration (#26) * Hid swap info for not connected wallet. * Updated SelectToken search by name, added check for translation existance. * Added Swap Integration. * Refactored formatNumber calls. * Hid swap info under buttons for zero amount. * Fixed Header Menu colors. * Fixed swap from Wallet assets. * Updated tooltips. * Updated About page text and Main menu links order. * Fixed Card title color for About page. * Updated Default token setting. * Updated Wallet version. * Hid Transaction Deadline area for Settings. * Removed unneeded tooltip from Settings dialog. * Added validation for Settings. * Added validation for Insufficient Amount error from server. * Added loading while not conencted, changed store to not strict mode, updated tokens setting in store. * Fixed focused behaviour for Swap input fields. * Fix wallet connection & select token behavior * Fixed Min Received format. Co-authored-by: Stefan Popov * Swap result calculation for non connected mode (#28) * Fixed Swap result calculation for non connected mode. * Fixed About page text and styles. * Fix i18n (#30) * Updated Swap input width and Max swap behaviour. Updated Swap Info styles. (#29) * PSS-271: Medium and GitHub links (#31) * Added Github and Medium links for About page. * Upated the Wallet version. * Fixed wallet button color on hover. * Calculate total suply * PSS-216: Design Issues Fixing (#32) * Updated content primary color. * Fixed Price and Token areas horizontal alignment. * Updated tooltips. * Updated Generic Header tooltip. * Updated Token item height for Select Token dialog. * Added Token icons. * Updated token icons names. * PSS-129: Create pair integration * Remove mocks * Refactoring * Add network fee calculation * Fixes * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Add namespace & types for swap (#101) * Fix price and swap info (#104) * Fix price calculations * Update SwapInfo.vue * Update wallet & api (#105) * Fix swap links (#106) * Fix swap links * Update wallet * Update api (#111) * up wallet version (#112) * Updated wallet version to 0.6.3 (#113) * Updated wallet version to 0.6.4. (#114) * Polkaswap layout redesign (#98) (#102) * Polkaswap layout redesign (#98) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * fix sidebar item hover css * fix disabled item css * Move bridge functionality (#103) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality Co-authored-by: Nikita-Polyakov * Update wallet & api * PSS-524: Bridge (#107) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality * Bridge: Updated unauthorized routes. * Updated Generic Page Header, updated Bridge screens. * Fixed token icons. * Bridge: Updated styles. * Updated tooltips. * Removed unused token images. * Refactored due to PR comments. Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov * Fix/pss 539 metamsk lock issue (#108) * improve subscribers * add check account is connected * Fix/balance flickering (#109) * wip update balance flow * refactoring views and store modules * remove unused code * fixes after review * Update yarn.lock * Updated wallet version. * Updated wallet version to 0.6.4. * Updated wallet version to 0.6.5. * PSS-540: Add Pending Transactions to Bridge History (#115) * pss-498 header redesign * wip pss-496 * style fixes * add HelpDialog component * reexport package.json * exchange routing fix * add Rewards stub with coming soon text * refactoring SidebarItemContent * refactoring styles * add FAUCET_URL to env.json * fixes after review * Move bridge functionality * Bridge: Updated unauthorized routes. * Updated Generic Page Header, updated Bridge screens. * Fixed token icons. * Bridge: Updated styles. * Updated tooltips. * Removed btc icon. * Updated due to PR comments. * Updated due to PR comments. * Reverted formatAddress changes. * Added pending state. * Updated wallet version. * Fix bridge functionality Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov Co-authored-by: Alex Natalia * Select dialog updates (#118) * Modify select dialog * Remove all symbol dependencies * PSS-502: Swap And Pool Redesign (#117) * Separated Swap and Pool. * Changed assets filter from symbol to address. * Updated wallet version to 0.7.1. * Fixed assets addresses behaviour for bridge. * Reverted previous version of the wallet, fixed some places due to PR comments. Co-authored-by: Alex Natalia * Update styles and icons (#119) * Fix styles and icons * Update BrandedTooltip.vue * Update wallet & ui library versions * Update LICENSE * Update package.json * Fix issues Co-authored-by: Stefan Popov Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Alex Natalia * Redesign Updates (#120) * Refactored buttons styles, changed some translation to common one. * Updated tooltips, screens info area. * Updated info blocks. * Updated info blocks in confirmation and pool screens. * Combined input area styles. * Update About.vue * GenericPageHeader: Changed default prop of tooltip placement. Signed-off-by: alexnatalia Co-authored-by: Stefan Popov * update wallet to 0.7.4 (#121) * remove getAssets from select-token dialog (#123) * PSS-573 WEB UI. MAX button for bridge work incorrect. (#124) * fix calc max value * remove console.log * update wallet 0.7.7 & hide farming in menu * refactoring (#122) * Fix issues (#125) * Remove default values from props * Fix issues Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Nikita-Polyakov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Alex Natalia * Release 0.1.5 (#158) * Release 0.1.5 (#161) * Release 0.1.6 (#170) * Release 0.1.6 (#174) * Release 0.1.7 (#190) * Release 0.1.8 (#200) * Release 0.1.9 (#206) * Release 1.0.0 (#208) * Update styles * Update wallet * Fix wait message for bridge eth->sora flow * Fix page amount for bridge * Fix bridge icons * Fix swap checks for XOR output without XOR or with XOR balance < network fee * Release 1.0.0 (#212) * Release 1.0.0 (#215) * Release 1.0.0 (#219) * Release 1.0.1 (#226) * Release 1.0.2 (#234) * Release 1.1.0 (#244) * PSS-281: Recalculate Input Values On Select Token (#33) * Added util method to check isNumber value. Removed Max button from token To area. * Added Max sold for reversed swap. * Updated Swap Integration. * Updated UI Lib version. * Added recalc on Select Token. * Fixed Swap for Polkadot.js * Updated isExchangeB param in methods. * Hid Node Address area for Settings popup. * Added Network Fee field to Swap component. * Updated Custom slippage tolerance for Settings. * Fixed paste string value to Swap fields. * Updated Network Fee calls, updated Wallet version, fixed swap tokens balance. * Added isExchangeB parameter to swap call. * Refactoring * fix total supply * PSS-129: Share of pool * Remove share of pool mock * Fix get asset symbol * Hide add liquidity Fix slippage tolerance for add liquidity Fix share of pool Fix unsupprted assets error message * Disable max button for add liquidity Reset values after change tokens * Fixes * Updated Tokens Icons, added PAL icon. (#35) * Wallet connection issues (#38) * Fix wallet connection issues * Fix styles * Update wallet version * Update favicon.ico * PSS-297: check fee on max amount * PSS-295: Added Insufficient Balance Checking (#37) * Added Insufficient balance checking. * Updated FPNumber parameters. * Removed formatNumber usage from Swap screens. * Fixed focus and placeholders values for Swap. * Updated some styles for huge number values. * Refactored due to PR comments. * Result Dialog Styles Fix (#41) * Fixed Result Dialog button styles. * Renamed USD icon. * Update library * Fix swap, liquidity behavior * Update index.ts * TODO: Revert this commit after PSS-309 * Updated wallet version. Co-authored-by: Stefan Popov * PSS-273: WEB UI: Connect Wallet - Close button leads always on Exchange page, not to the previous page (#42) * Fix routing issue * Update wallet version * PSS-295: Confirm Swap Insufficient Balance Checking (#43) * Fixed console error on tokens switch. * Added Is Insufficient Balance checking for Confirm Swap dialog. * Updated Confirm Swap styles. * Updated Swap info after Swap, added max button to init screen. (#44) * Update ui library version (#46) * Update ui library version * Update wallet * BP-312: Fixes for pool * Fix icons position (#47) * Fix icons position * Fix logo * PSS-287: Swap Amount Fields Formatting (#45) * Added Swap fields formatter. * Fixed Slippage Tolerance editing and Swap fields formatting. * Updated wallet version. * Change toString to toFixed * Change formatNumber to toFixed * Fix remove liquidity price * Move back toFixed to toString * Fixed estimated label existence for zero values (#50) * Refactored, added some comments, fixed estimated label existence for zero values. * Modify env config file (#49) Co-authored-by: Bulat Saifullin * Add custom notifications & notification tracking service (#51) * Add custom notifications & notification tracking service * Update notifications & strings according to latest changes * Update api * Update soramitsu-variables.scss * PSS-335: Designer Feedback Fixes FE (#53) * Fixed functionality and layout bugs. * Added draft component to fix layout behaviour. * Fixed Settings behaviour. * Swap: removed Result dialog, edited Network Fee tooltip. * Fixed translation bugs. * Account info implementation & fix loading state (#54) * Add account info * Fix styles * Hide test assets (#55) * Update connection * Remove usdt mock * Add liquidity issues & update notifications (#56) * Add missing notifications * Update RemoveLiquidity * Fix add liquidity screen * Add async loading of liquidity * Fix pool issues * Updated not connected pool interface message. (#60) * PSS-300: Swap confirmation dialog message update (#61) * Updated Swap confirmation dialog message. * Confirm Swap Dialog: Updated message for max sold behaviour. * Swap screen: Fixed Min Received/Max Sold area asset symbol. (#62) * PSS-379: WEB UI. Add liquidity. Click MAX button on 0 balance of XOR (#59) * Updated wallet version. Swap, Add Liquidity, Create Pair components: Updated Max button availability, refactored. * Refactored due to PR comments. * Swap, Add Liquidity: Fixed negative amount after max. Updated wallet version. * Create pair implementation & fix liquidity issues (#63) * Add create pair implementation & fix logic for add liquidity * PSS-297: WEB UI: Restrict Adding liquidity if balance is insufficient (#64) * Add Liquidity: Refactored Insufficient Balance. * Create Pair, Remove Liquidity: Updated Max functionality. * Add insufficient liquidity message for swap (#66) * link @soramitsu/soraneo-wallet-web 0.4.6 * return network address * use wallet routes in app.vue to correctly handle wallet icon click * set changePage method as private * removed local model for inputs: createPairModel * refactoring CreatePair methods * add input maxlength check * fix inputMaxLength method * improve formatNumberField method * refactoring inputMaxLength method * refactoring AddLiquidity view * create TokenPair mixin * wip refactoring * add maxlength to removeLiquidity view inputs * create TokenInputMixin * add input handlers on removeLiquidity view * handle swap inputs * return commented line * PSS-400: WEB UI. Minimum receive/Maximum sold token not changed (#69) * Fixed min received/max sold symbol. * Update wallet & api version (#70) * fixes after review * add store state interfaces * PSS-467: On the swap screen user should be able to select all tokens excecpt pool tokens (#71) * Update wallet & api version * Fix swap with assets created by user * Update wallet & api version * add watcher for slippageTolerance in Swap.vue * remove console lgos * use state types in store mutations & getters * apply transaction mixin changes from wallet * update @soramitsu/soraneo-wallet-web dependency * navigate to wallet connection view on wallet click (#75) * PSS-419: restrict precision in inputs (#74) * add TokenInput component * use TokenInput in Swap.vue * add ConfirmDialogMixin * prepare to refactoring modals * remove comments * remove unneccessary actions * add TODO comments * fix TokenInput handler * link js-ui-library with input fix * PSS-398: WEB UI. Multiple click on Confirm - create multiple transactions. (#76) * Fix multiple confirm for operations * Fix notifications view * Update env.json * PSS-364: reuse s-float-input component (#77) * prepare TokenInput component for export * use s-float-input instead of TokenInput * refactoring Settings component * refactoring RemoveLiquidity * Update wallet (#79) * SFloatInput Fixes (#82) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * PSS-378: WEB UI. Remove liquidity. Troubles with entering of amount manually (#83) * Reseted values and tokens for Add Liquidity and Create Pair components, added placeholders for all SFloatInput elements. * Remove liquidity: fixed fields editing and insufficient balance calculation. * Remove Liquidity: Fixed editing behaviour. * Updated due to PR comments. * PSS-486: reset vuex values after transaction (#81) * PSS-351: Show balance in select token dialog (#84) * wip assetList * fixes in swap * fix types * remove unused imports * Refactoring Modals: add ConfirmTokenPairDialog component (#78) * add ConfirmTokenPairDialog component * add modal props fix and throw error on create pair failure * fix openSelectTokenDialog method in Swap.vue(#86) * PSS-350: Add clear button to select token search input (#85) * add clear button * refactoring mixin * remove global style in SelectToken * use global style for input button * Update wallet (#87) * Update wallet * Change s-form-item to div in SelectToken dialog (#88) * remove s-form-item * change wrapper classname * Refactoring swap view (#89) * wip * remove formModel * add reset fields method * wip swap values * refactoring minMaxRecieved calls * wip refactoring * use exchangeB as source of truth * use isExchangeB instead of activeField * disable switch during values calculation * recounting check * use promise all for parallel calculation * update ui library * discarding env.json * fixes after revie * Hide balance in SelectToken dialog, if wallet not connected (#91) * Add license (#92) * PSS-248 Web UI: Settings - Problems with input in Custom field (#90) * allow type any value * fix error * add local model * PSS-418: Precision management (#93) * Create NumberFormatterMixin.ts * Improve precision management for pool * Improve precision management for swap operation * Improve precision management for select token dialog * Update AddLiquidity.vue * Improve precision management for remove liquidity operation * Update todo sections * Fix issues * Update wallet & api versions * Add balance updates * Add zero string const * update wallet (#94) * PSS-351 Select Token fixes (#95) * select-token fixes * show 0 balance as - * PSS-516: WEB UI. Can go to remove liquidity page without liquidity on account (#96) * Added Page Not Found Draft. * Fixed Add and Remove Liquidity router bags, hid some screens for unauthorized access. Added redirect to exchange for Page Not Found error. * Disabled selects for existed liquidity addition. * Update Swap.vue (#99) * Add namespace & types for swap (#101) * Fix price and swap info (#104) * Fix price calculations * Update SwapInfo.vue * Update wallet & api (#105) * Fix swap links (#106) * Fix swap links * Update wallet * Update api (#111) * up wallet version (#112) * Updated wallet version to 0.6.3 (#113) * Updated wallet version to 0.6.4. (#114) * Polkaswap layout redesign (#98) (#102) * Polkaswap layout redesign (#98) * pss-498 header… * Ceres fiat option (#1212) * prepare code * update wallet to 1.25.0 * update types * Update Jenkinsfile * Update Jenkinsfile * Fix circulating supply for VAL & PSWAP on prod env (#1215) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * [WIP] WalletConnect support (#1195) * update libs * refactoring evm provider connect * connect through walletconnect * add WallletConnect icon * add SelectProvider simple modal * refactoring namings * update wallet * update registered assets logic * update broken assets * add logout wallet button * remove metamask hardcoded translations * remove metamask from messages & mixin * improve eth bridge actions * add provider dialog to another pages * add provider icon to connect wallet panel * add disconnect btn * update SelectProvider dialog * update Rewards page * remove duplicated translation keys * fix connect wallet butoon loading state * fix provider select * remove duplicated translations * update translations * update broken translations * add alt attrs to img * deduplicate yarn.lock * update core-js * fix confirm transaction translation * fix change provider * fix selectEvmprovider * add trust wallet for select * check walletconnect availability * refactoring * handle disconnect corner cases * prepare for hashi bridge before walletconnect * disable chart btn while chart is loading * remove console.log --------- Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> * update wallet to 1.25.1 (#1216) * update wallet to 1.25.1 * fix formatted-amount balance * revert env.json * Add crowdloan banner (#1217) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update Payment.vue (#1220) * Update Payment.vue * fix * Update Payment.vue * Fix x1 enable/disable option * Update Payment.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update KycView.vue (#1224) * Update KycView.vue * add method to mixin * move * Update subquery request for Tokens page (#1201) * update subquery request for Tokens page * update subsquid request for Tokens page * improve asset entity type * update wallet * [Bridge] Add max prefix to external network fee (#1227) * add max prefix to network fee * change translation to const * Sora staking implementation * [Bridge] Enable WalletConnect (#1228) * enable wallet connect * add SubWallet * improve ethereum wallet error handler * [Bridge] UI improvements (#1222) * show account name instead of address * update select network modal * change bridge title to Hashi * add AccountPanel component * add address * enable wallet connect * add SubWallet * improve ethereum wallet error handler * update account panel * remove loading state from connect button * improve SelectProvider loading state * remove duplicated code * Fixes * Fixes * add sora parachain for network selection * prepare connector for refactoring * refactoring SubNetworksConnector * wip outgoing reducer * fix network fee * parachain tx tracking * refactoring connector * add sora parachain icon example * add scrollbar to networks list * sora parachain history restoration * small fixes * sonar refactoring * update short names * improve sub bridge history restoration * restore refunded transactions * improve history restoration parachain part * [fix] clean history only for selected network * revert env.json * refactoring history restoration * update wallet 1.26.3 * up version * set detectEthereumProvider arg mustBeMetaMask to true * Fixes * Bond and nominate in one action * Fix keys * SORA parachain bridge (#1231) * add sora parachain for network selection * prepare connector for refactoring * refactoring SubNetworksConnector * wip outgoing reducer * fix network fee * parachain tx tracking * refactoring connector * add sora parachain icon example * add scrollbar to networks list * sora parachain history restoration * small fixes * sonar refactoring * update short names * improve sub bridge history restoration * restore refunded transactions * improve history restoration parachain part * [fix] clean history only for selected network * revert env.json * refactoring history restoration * update wallet 1.26.3 * up version * set detectEthereumProvider arg mustBeMetaMask to true * review update * Show swap distribution (#1191) * add Distribution component * update distribution * update distribution component * path line style * popover position * distribution fiat difference * update markup * fix css with small screen width * Fix bridge issues (#1232) * restore history for relaychain & sora parachain in one flow * refactoring sub history restoration * fix transfer min & max amounts * update add token button * dont remove walletconnect session after provider change * fix evm address check * fix loLowerCase check * Whitelist usage rationalization (#1234) * refactoring whitelist usage; fix explore demeter colums * add DataRowSkeleton component * fix price alert price change * Fixes * SORA parachain bridge (#1231) * add sora parachain for network selection * prepare connector for refactoring * refactoring SubNetworksConnector * wip outgoing reducer * fix network fee * parachain tx tracking * refactoring connector * add sora parachain icon example * add scrollbar to networks list * sora parachain history restoration * small fixes * sonar refactoring * update short names * improve sub bridge history restoration * restore refunded transactions * improve history restoration parachain part * [fix] clean history only for selected network * revert env.json * refactoring history restoration * update wallet 1.26.3 * up version * set detectEthereumProvider arg mustBeMetaMask to true * review update * Show swap distribution (#1191) * add Distribution component * update distribution * update distribution component * path line style * popover position * distribution fiat difference * update markup * fix css with small screen width * Fix bridge issues (#1232) * restore history for relaychain & sora parachain in one flow * refactoring sub history restoration * fix transfer min & max amounts * update add token button * dont remove walletconnect session after provider change * fix evm address check * fix loLowerCase check * Whitelist usage rationalization (#1234) * refactoring whitelist usage; fix explore demeter colums * add DataRowSkeleton component * fix price alert price change * tokens page fallback & wallet 1.26.5 (#1238) * fix prices precision on chart (#1240) * Fix chart Y axis for assets with very low price (#1241) * set mix & max for y axis * add hideOverlap for y axis * Fix release 1.26.0 issues (#1239) * iOS dirty hack * Recenter alert dialog + fix menu + price autofocus * Re-center select node dialog and fix header styles * Fix styles * Fix issues based on test env PR * Fix About reactivity * Fix iOS double click issues * Add auto focus for editable/new nodes from select node dialog * Increase alerts limit * Upd wallet version * Update zh_CN.json * Update zh_CN.json * Update AlertList.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * Bridge sub account & token autoselects (#1242) * update chart precision * bridge token autoselect * autoselect sub account address * transfer token-select-button styles from mixin * add object.freeze --------- Co-authored-by: Stefan Popov * fix bridge max value precision (#1244) * Fix bridge fees issues (#1246) * update soraNetworkFee always * check xcm fee in max button * Some fixes * Chart, Bridge, Wallet, ADAR fixes (#1247) * update SubNetwork usage * disable bridge switch btn on loading state, calc type chart limits * update wallet 1.27.0 * remove resolutions * Update ValidatorsDialog.vue * Fix * Xor commission fix * Add vote on survey and new banner (#1251) * Add new banner * Add vote on survey & move SORA mobile link * Add survey image --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fixes * Fixes * Fixes * Translation fix * Editable fiat amount in input (#1250) * use token-input in bridge, remove outdates styles * add fiat input * improve fiat value calculations * fiat input fixes * Fix colors * Fix * Fixes * Fixes * Fix * Remove imports * fix chart current price (#1256) * refactoring * remove lib from resolutions * fix retry button visibility (#1254) * fix retry button visibility * Update package.json * return 1.27.0 version --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Sidebar hide button (#1249) * add collapse button to sidebar * add tooltip to icon * sidebar hover effect * update translations * update menu css * update wallet * Improve Eth bridge fees calculation (#1257) * fix retry button visibility * refactoring sign methods * calc incoming fee * transfer method to eth bridge utils * update BridgeInitMixin * add fallback calculation * update amount to calculate fee * fix sonar issues * Fix rewards destination * Fixes * Fixes * Revert env.json * Fixes * Remove tooltip * Translation fix * Remove utils * Rename function * Fix translation file * Remove all rewards info * Fix styles * Staking badge click (#1258) * Validators search input fix (#1262) * Staking badge click * Validators search input fix * Fix release issues 1.27 (#1261) * Make mx button hidden when hide balances is enabled * Fix issues --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Refactor staking (#1263) * Refactor * Fix validators list style * Fix commission format * Fix change validators disable * Fix styles * Fixes * Use stakingStakers * Fix staking lang keys * Update json files * Update messages.ts * Add comments * Update zh_CN.json * Update env.json --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: RDMStreet * Add staking routing in menu (#1265) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Correct staking balance formatting (#1267) * Correct staking balance formatting * Remove unused import * Add 6M filter for stats page (#1270) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add sora card maintenance page (#1269) (#1271) * Add maintenance page for SORA Card * Hide crowdloan ad --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Improve zh_CN keys (#1272) * Fix zh_CN keys * Update package.json --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update dojoProductType * [Bridge] Add Polkadot bridge support (#1277) * add polkadot consts usage * update config & icon * set network fee 0.02 DOT * subquery endpoint as in master * fix ui issue with sora hash for incomng tx * add polkadot xcm fee * update polkadot network fee * soraCard:false * [BRIDGE] check for asset valid address on bridge contract (#1283) * check for asset valid address on bridge contract * remove console.log * Prepare prod config (#1285) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * fix ss58 check (#1289) * set kusama incoming xcm fee 0.01KSM (#1290) * set kusama incoming xcm fee 0.01KSM * Update package.json --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * order book (#1089) * prework * prework * book list * prework for table popover * establish vuex store * write basic logic * create order history widget * add tables * start book widget * Update BookWidget.vue * make market widget * resolve conflicts * Update OrderBook.vue * embed charts * make api working * style table * filter books * make filters to amount and price * remove debug info * Update BuySell.vue * fix price constraints * Update Jenkinsfile * make aggregation * Update Jenkinsfile * add checks * make update * update * make sell market order * Update OpenOrders.vue * add change * fix * add market order, spread checks, confirm dialog * add confirm cancel dialog * fix dark mode * improve dark mode * hide native scrolls * add tooltips & improve UX * improve responsive * improve ux * fixes * improve mobile, tablet, desktop responsibility * fix market order * fix input/output * fix * fix errors * make huge screen usable * add missing data * Update OpenOrders.vue * add translations * upgrade lib & add translations * forbid cancelling when book is stopped * dynamic fee * enable market trades widget * hide market trades * fixes * allow whole row click * add pagination * Order book indexer requests (#1223) * wip queries * account orders request * add order book subscription * refactoring deals * update types & subscription * add orders table data & subscription to order book updates * fix order query * fix all orders table * add order books stats to popover * update stats on popover opening * add deals to market trades * fix deals * refactoring subscriptions & data architecture * add userLimitOrders type * update wallet * add last deal price * format buySell price * update table amount * order table component * fix filled * refactoring order table & mixins * add scaler * allow whitelist only * update orders request * fix cancel * fix ui issues * fix wallet version 1.26.2 * fix orders sort * fix column * improve adaptive ui * implement steps * Update OrderTable.vue * fix wiping out * fix * add checks * hide debug info * hide native scrollbar * improve adaptive design * up version * remove mixin * fix * Update index.ts * Update BookWidget.vue * fix not updating book issue * make small adjustments * align values * align book values * fixes * Update BookWidget.vue * fix input wiping out * round up styles * fixes * fixes * add margins * Update OrderBook.vue * Update package.json * fix assetsDataTable * fix scrollbar in orders table * Order book price chart (#1237) * transfer asset price query from wallet * add order book data to chart * prepare subscription * set chart subscription * fix sorting bug * fix max button fills wrong value * Update BuySell.vue * fix precision * Update BuySell.vue * warn user when error in input & aggregation logic * fill price when click on book * Update BuySell.vue * fixes * add feature flag & refactoring * hide expiry date for market * refactor * fix * [OrderBook] add volume chart (#1248) * add volume to dataset * add volume example * add color to bars * improve tooltip & labels localization * build spec depends on volume support * use filters from line chart * remove commented code * add typings * fix typings * Update orderBook.ts * add slider for amount * remove corridor checks * Update env.json * fix on slider * Update BuySell.vue * Update TokenInput.vue * resolve conflicts * Update _mixins.scss * inject slider * Update HistoryOrderWidget.vue * Revert "Merge branch 'develop' into feature/order-book" This reverts commit d02e1a65e7d2db20b07cd8055b2e171a61bee639, reversing changes made to 1f58ed6efe9c8d8d1cd54765382be1e5e26fc766. * fix chart * fix fee on place order * fix disappearance * Update BookWidget.vue * fix sonar issues * fix sonar * fix * fixes * fix issues * add slider focus * fix css values * move collapse logic to store * enable aggregation * trim when fiat is input * resolve conflicts * Spot limitations (#1255) * add consts * Update BuySell.vue * Update package.json * fix * add locked to transaction details * Update TransactionDetails.vue * customise prework * resolve typings * add limit for single price * Update package.json * bump --------- Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> * Order book refactoring (#1281) * refactoring BookWidget * book widget methods refactoring * BuySell refactoring * HistoryOrderWidget refactoring --------- Co-authored-by: Rustem * fix * recalculate orders & remove possible overlap * Update BuySell.vue * Update BookWidget.vue * fix with precision * fix tab freeze when switching * fix * Update BookWidget.vue * fix langs switch * fix for input with different locales * turn card off * Update deps * Update yarn.lock * Bump version * Fix lint warnings * Blur fiat el during slider usage for TokenInput * Update AppMenu.vue * Fix icons * Update index.ts * Fix shadow * Remove unused styles * Fix lint issues * Update BookWidget.vue * Update BuySell.vue * Update CustomisePage.vue * Resolve linter issues * Add duration in days for ordertable * Improve tables * Fix styles * Remove empty DatePicker * Update HistoryOrderWidget.vue * Restrict autofill from orderbook for mkt * Update index.ts * Fix font * Remove duplicated methods from util --------- Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> * Fix 1.29 release (#1292) * Update dot, ksm nodes * Improve SORA Card maintenance styles --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update BuySell.vue (#1295) * Single chart filter (#1293) * prework * prework * book list * prework for table popover * establish vuex store * write basic logic * create order history widget * add tables * start book widget * Update BookWidget.vue * make market widget * resolve conflicts * Update OrderBook.vue * embed charts * make api working * style table * filter books * make filters to amount and price * remove debug info * Update BuySell.vue * fix price constraints * Update Jenkinsfile * make aggregation * Update Jenkinsfile * add checks * make update * update * make sell market order * Update OpenOrders.vue * add change * fix * add market order, spread checks, confirm dialog * add confirm cancel dialog * fix dark mode * improve dark mode * hide native scrolls * add tooltips & improve UX * improve responsive * improve ux * fixes * improve mobile, tablet, desktop responsibility * fix market order * fix input/output * fix * fix errors * make huge screen usable * add missing data * Update OpenOrders.vue * add translations * upgrade lib & add translations * forbid cancelling when book is stopped * dynamic fee * enable market trades widget * hide market trades * fixes * allow whole row click * add pagination * Order book indexer requests (#1223) * wip queries * account orders request * add order book subscription * refactoring deals * update types & subscription * add orders table data & subscription to order book updates * fix order query * fix all orders table * add order books stats to popover * update stats on popover opening * add deals to market trades * fix deals * refactoring subscriptions & data architecture * add userLimitOrders type * update wallet * add last deal price * format buySell price * update table amount * order table component * fix filled * refactoring order table & mixins * add scaler * allow whitelist only * update orders request * fix cancel * fix ui issues * fix wallet version 1.26.2 * fix orders sort * fix column * improve adaptive ui * implement steps * Update OrderTable.vue * fix wiping out * fix * add checks * hide debug info * hide native scrollbar * improve adaptive design * up version * remove mixin * fix * Update index.ts * Update BookWidget.vue * fix not updating book issue * make small adjustments * align values * align book values * fixes * Update BookWidget.vue * fix input wiping out * round up styles * fixes * fixes * add margins * Update OrderBook.vue * Update package.json * fix assetsDataTable * fix scrollbar in orders table * Order book price chart (#1237) * transfer asset price query from wallet * add order book data to chart * prepare subscription * set chart subscription * fix sorting bug * fix max button fills wrong value * Update BuySell.vue * fix precision * Update BuySell.vue * warn user when error in input & aggregation logic * fill price when click on book * Update BuySell.vue * fixes * add feature flag & refactoring * hide expiry date for market * refactor * fix * [OrderBook] add volume chart (#1248) * add volume to dataset * add volume example * add color to bars * improve tooltip & labels localization * build spec depends on volume support * use filters from line chart * remove commented code * add typings * fix typings * Update orderBook.ts * add slider for amount * remove corridor checks * Update env.json * fix on slider * Update BuySell.vue * Update TokenInput.vue * resolve conflicts * Update _mixins.scss * inject slider * Update HistoryOrderWidget.vue * Revert "Merge branch 'develop' into feature/order-book" This reverts commit d02e1a65e7d2db20b07cd8055b2e171a61bee639, reversing changes made to 1f58ed6efe9c8d8d1cd54765382be1e5e26fc766. * fix chart * fix fee on place order * fix disappearance * Update BookWidget.vue * fix sonar issues * fix sonar * fix * fixes * fix issues * add slider focus * fix css values * move collapse logic to store * enable aggregation * trim when fiat is input * resolve conflicts * Spot limitations (#1255) * add consts * Update BuySell.vue * Update package.json * fix * add locked to transaction details * Update TransactionDetails.vue * customise prework * resolve typings * add limit for single price * Update package.json * bump --------- Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> * Order book refactoring (#1281) * refactoring BookWidget * book widget methods refactoring * BuySell refactoring * HistoryOrderWidget refactoring --------- Co-authored-by: Rustem * fix * recalculate orders & remove possible overlap * Update BuySell.vue * Update BookWidget.vue * fix with precision * fix tab freeze when switching * fix * Update BookWidget.vue * fix langs switch * fix for input with different locales * turn card off * set filters like in candle * set chart animation to false * remove merge conflicts * return default chart type * add order book queries for subsquid * change zoom after filter siwtch * reset zoom on filter tab * refactoring * update types & subsquid requests * update wallet to 1.29.1 --------- Co-authored-by: RustemYuzlibaev Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> Co-authored-by: NaghmeMohammadifar <45916098+Naghme98@users.noreply.github.com> * fix (#1296) * Feature/order book translations (#1284) * prework * prework * book list * prework for table popover * establish vuex store * write basic logic * create order history widget * add tables * start book widget * Update BookWidget.vue * make market widget * resolve conflicts * Update OrderBook.vue * embed charts * make api working * style table * filter books * make filters to amount and price * remove debug info * Update BuySell.vue * fix price constraints * Update Jenkinsfile * make aggregation * Update Jenkinsfile * add checks * make update * update * make sell market order * Update OpenOrders.vue * add change * fix * add market order, spread checks, confirm dialog * add confirm cancel dialog * fix dark mode * improve dark mode * hide native scrolls * add tooltips & improve UX * improve responsive * improve ux * fixes * improve mobile, tablet, desktop responsibility * fix market order * fix input/output * fix * fix errors * make huge screen usable * add missing data * Update OpenOrders.vue * add translations * upgrade lib & add translations * forbid cancelling when book is stopped * dynamic fee * enable market trades widget * hide market trades * fixes * allow whole row click * add pagination * Order book indexer requests (#1223) * wip queries * account orders request * add order book subscription * refactoring deals * update types & subscription * add orders table data & subscription to order book updates * fix order query * fix all orders table * add order books stats to popover * update stats on popover opening * add deals to market trades * fix deals * refactoring subscriptions & data architecture * add userLimitOrders type * update wallet * add last deal price * format buySell price * update table amount * order table component * fix filled * refactoring order table & mixins * add scaler * allow whitelist only * update orders request * fix cancel * fix ui issues * fix wallet version 1.26.2 * fix orders sort * fix column * improve adaptive ui * implement steps * Update OrderTable.vue * fix wiping out * fix * add checks * hide debug info * hide native scrollbar * improve adaptive design * up version * remove mixin * fix * Update index.ts * Update BookWidget.vue * fix not updating book issue * make small adjustments * align values * align book values * fixes * Update BookWidget.vue * fix input wiping out * round up styles * fixes * fixes * add margins * Update OrderBook.vue * Update package.json * fix assetsDataTable * fix scrollbar in orders table * Order book price chart (#1237) * transfer asset price query from wallet * add order book data to chart * prepare subscription * set chart subscription * fix sorting bug * fix max button fills wrong value * Update BuySell.vue * fix precision * Update BuySell.vue * warn user when error in input & aggregation logic * fill price when click on book * Update BuySell.vue * fixes * add feature flag & refactoring * hide expiry date for market * refactor * fix * [OrderBook] add volume chart (#1248) * add volume to dataset * add volume example * add color to bars * improve tooltip & labels localization * build spec depends on volume support * use filters from line chart * remove commented code * add typings * fix typings * Update orderBook.ts * add slider for amount * remove corridor checks * Update env.json * fix on slider * Update BuySell.vue * Update TokenInput.vue * resolve conflicts * Update _mixins.scss * inject slider * Update HistoryOrderWidget.vue * Revert "Merge branch 'develop' into feature/order-book" This reverts commit d02e1a65e7d2db20b07cd8055b2e171a61bee639, reversing changes made to 1f58ed6efe9c8d8d1cd54765382be1e5e26fc766. * fix chart * fix fee on place order * fix disappearance * Update BookWidget.vue * fix sonar issues * fix sonar * fix * fixes * fix issues * add slider focus * fix css values * move collapse logic to store * enable aggregation * trim when fiat is input * make translation prework * resolve conflicts * create translations * translations * fix merge issues * embed missing translations * add missing translations * fix * fix ru lang * add order status translations * make room for additional space * Update BuySell.vue * add descriptive message * add descriptive message for all langs * reset * cancel reset when market order --------- Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Nikita-Polyakov Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Explore order books (#1276) * prepare explore books data * fix issues * update price column * refactoring explore page mixin * add filter to order books query * update wallet 1.28.0 * fix price formatting * pools from indexer * remove unused method * add pool tokens column * rename quoteAsset to targetAsset for search * refactoring queries * refactoring * update translation key & fix tokens page search * Fix explore books sorting (#1299) * fix computed property for table * refactoring * fix changeSort type * Fix release 1.29 (#1294) * Remove unused import * Add notification and loading for stake dialog during TX sign * Fix staking extrinsics notifications and loading states * Fix redeemable VAL -> XOR * Update package.json * Make orderbook open orders reactive & fix cancel orders selection algo * Remove unused staking methods * Fix issue with horizontal & vertical scroll * Update StakingMixin.ts * Update actions.ts * Update OpenOrders.vue * Update OrderTable.vue * Improve styles * Fix sync issues * Fix empty page issues * Fix styles * Add Intl percent formatter * Improve global html styles * Fix scrollbar * Refactor source code for PlaceOrder component * Refactor place order logic * Fix cancel orders logic and styles * Update HistoryOrderWidget.vue * Fix translations for MarketTradesWidget * Fix connect account styles * Fix styles * Remove unused prop * Move user orders subscription to history widget * Update PlaceOrder.vue * Fix issues * Update SelectedTokensRouteMixin.ts * Add dynamic routing for orderbook * Refactor types * Update OrderBook.vue * Improve routes (common states for Swap and Orderbook) * fix translations * fix mismatch on cancel * Update deps --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: RustemYuzlibaev * Fix orderbook notifications and orders history (#1300) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix 1.29 issues (#1303) * Remove marketing research & add transition * Update wallet * Fix the flickering collapsed menu when hovering on expand button over the status bar --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: shlavik * Update AppMenu.vue (#1304) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix 1.29.0 issues (#1306) * Fix menu styles * Update AppMenu.vue * Fix click on tooltip for mobile devices * Update PairListPopover.vue * Revert "Update AppMenu.vue" This reverts commit 5147d349b2f15829cd54fd133ab6263d7aa011e3. * Update wallet * Fix styles --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Update subquery endpoint (#1308) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * update wallet 1.29.8 (#1309) * Fix explore menu navigation (#1310) * Fix explore menu navigation * update wallet 1.29.9 --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Nikita-Polyakov * Fix cancel all orders (#1313) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Replace explore tabs with dropdown * Update soramitsuUI.ts * Update Container.vue * Fix selected colors * Update BuySell.vue (#1301) * Update BuySell.vue * handle different side change * reduce watchers --------- Co-authored-by: Stefan Popov Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> * add missing balance to token (#1315) * Fix bridge tx sign with google & mint\burn translations (#1323) * add beforeSign call * update wallet & translations from localise * fix ts issues * add mint & burn translations * Add KEN distribution page (#1320) * validation refactoring (#1319) * validation refactoring * add generic component * log in * refactor * Update BookWidget.vue * hide scaler * fix zero appearance * remove commented code * improve validation * improve check for unique prices * add multiply translation * replace translation * aggregate conditions * Update en.json (#1327) * Fix ken title (#1330) * Fix KEN title * Enable orderbook on mainnet * Bump version --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * fix (#1331) * fix * add error handling for small balances * move to dev * Staking fixes (#1268) * Staking fixes * Fix * Fixes * Fix * Redeem dialogs * Fixes * Fix subscribeOnCurrentEraTotalStake * Withdraw * Fixes * Some fixes * Countdown * Fix countdown position * Fix countdown calc * Validators list * Sorting * Validator name * Revert env * Change default validators sort * Fixes * Max * focus * Countdown translation * unbondPeriodFormatted fix * Remove comments * Fix colors * Template fixes * Update translations * Fix blackout * Fix input styles * Update EraCountdown.vue * Fix Sonar issues * Fix notification for withdraw operation * Max validators * Validators list style fixes * Remove new stake network fee * Fix styles * Max fix * Update translations * Remove empty translations --------- Co-authored-by: Stefan Popov Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * expand total text (#1333) * [Bridge] fix insufficient balance check (#1329) * fix insufficient balance check * remove kusama hardcoded xcm * update Kusama fee to 0.002 KSM * update polkadot treasury fee * Fix orderbook styles * Fix lang --------- Co-authored-by: Rustem Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: Stefan Popov * update order book quote subscription (#1335) * [Tech] queries from wallet (#1336) * transfer pools queries * update referrals * update wallet & refactoring * Сhart volume update (#1332) * refactoring fetchData * update chart subscription to fetch last snapshot * update chart tooltip * update chart styles * save zoom level after chart type switch * sonar fixes * [Tech] update packages (#1337) * update types * update charts libs * update jwt-decode * update sass & package.json node version * update typescript * Fix SubsquidOrderBooksQuery * Fix chart volume update for XOR (#1348) * fix xor volume update * set interval polling for chart assets updates * fixes after review * update wallet 1.32.3 * deduplicate yarn.lock * Fix Eth bridge tx replacement (#1350) * refactoring eth utils methods * fix replaceable tx tracking * refactoring * Update package.json (#1353) * Update package.json * Update yarn.lock --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Demeter fixes (#1355) * fix selectedPool getter * translations from localise * add calculating text * Fix quote rpc (#1356) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Remove new stake page (#1343) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * 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> * Fix issues after PRs merge (#1360) * Fix * Remove not used styles --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * [Sub Bridge] add ability to select substrate node (#1346) * transfer to liberland * transfer from liberland * fix history fetch * refactoring adapters * update history restoration * change autoselectSubAddress * add asset outgoing minimum amount * update visible min limit * update config to sub network endpoint * multiple endpoints in adapter * update sup network apps & incoming transfer tracking * add props to SelectNodeDialog * simplify NodeErrorMixin * create connection class file * simplify trusted node check * remove nodeConnectionAllowance * remove some nodes getters * move action to class * refactoring connectToNode * transfer wallet init to App.vue * use appConnection for sora nodes * fix node info loading state * use NodesConnection in SubAdapter * sub node dialog demo * update node dialog texts * update network name in select node dialog * refactoring NodesConnection reactivity * simplify adapter * add BridgeNodeIcon * ui node name fixes * ts fixes * remove todo comments * fix failed sub tx status in history * add externalNativeMinBalance * improve connection wait logic * refactoring min deposit usage, add translation keys * check min balance in transferable amount * update bridge apps after reconnect * fix select-network disabled css * update external min balance fetch * hardcode liberland network fee * set dns regexp with exact start * add reload button to node list * refactoring after review * update translations --------- Co-authored-by: Stefan Popov Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add skeleton to swap distribution widget (#1361) * add distribution skeleton, set tx table columns width * fix distribution sources css * fix flex-cell * return sidebar collapsed css * Update substrate lib --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix 1.32 issues (#1363) * Add links to bridge transfer modal (#1362) * add links to modal, update BridgeTransactionMixin * fix sub tx recipientAmount in reducer * account links in BridgeTransactionView * refactoring transaction view links * add node connection allowance timeout * return app align center * remove rococo block explorer url * fix ts issue * refactoring sonar issues * remove isOutgoingType from mixin * remove unused code * Improve bridge icons (#1364) * Add orderbook research link (#1366) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * improve external links (#1367) * Improve bridge sora links (#1370) * improve external links * add tokens.Deposited handler * fix sub blocks left & account formatting * improve sora links * improve sora links & refactoring (#1371) * update network & xcm fees (#1373) * 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 * update wallet 1.32.7 (#1376) * 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 * Reduce network icons svg size (#1380) * 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 * Set Tokens as default tab for Explore page (#1383) * 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> * Fix default explore page (#1386) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * bump wallet (#1389) * Acala support (#1382) * add Alphanet to consts * save stage config * transfer subBridgeConnector to store * add moonbase alpha icon * address format research * refactoring * revert some changes * add Acala icon & sub config * fetch acala assets metadata * acala balance fetching * add acala min deposit for token * add acala extrinsic * incoming tx history restoration * refactoring outgoing process * refactoring outgoing * update reducer * refactoring * remove lib from resolutions * add moonbase xcm fee & util resolution * fixes & improvements for acala * update prod env.json to enable acala * update wallet 1.33.1 * update sub networks config in const * remove store dependency in reducer * only ACA as supported bridge token * history restoration updates * change liberland nodes order * fix adapter withConnection & selectNetwork action (#1391) * Fix bridge tx account address issues (#1393) * fix bridge tx account address issues * refactoring * update ethers & eth fee request (#1396) * improve eth fee calculation (#1397) * Account signature settings (#1394) * Burn page (#1401) * Add KARMA distribution page * Update translations * Remove subsquid * Update translations * Update package.json * Update zh_CN.json --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add changes from master (#1403) * Update Burn.vue * Remove Liberland Governance node --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix min max block for Burn page (#1404) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Remove orderbook research banner (#1405) * Add disabled state for Burn page items (#1406) * Hide SORA Card from menu (#1407) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * fix history restoration & balance deposit & transaction view account addresses (#1409) * Improve calc algo & loading state for Burn page (#1410) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * formatted amount & lp fixes (#1413) * kensetsu (#1352) * Draft * Update BasePageMixin.ts * Update BasePageMixin.ts * Update yarn.lock * Add asset owner page * Improve responsive class * Fix responsive issues related to charts * Add send token tx & fix styles * Add mint tx & fix styles during tx processing * Add burn tx & fix styles during tx processing * Fix disabled state for TokenInput with slider * Support new update-name event for AddressBookInput * Draft for token creation * Update vue.config.js * Improve asset owner page * Refactor Asset owner page * Add vault store * Update state.ts * Remove useless getter from vault * Update index.ts * Add bold prop for GenericPageHeader * Add filter fn prop to SelectToken * Add kensetsu draft * Update AppMenu.vue * Use multiple quote subscriptions * Update App.vue * Refactor CreateVaultDialog * Update Vaults page * Fix max button for borrow amount * Improve styles * Add getLiquidationPenalty * Improve UI * Fix * Update AssetOwnerDetails.vue * Update kusd * Fix LtvProgressBar styles * Fix negative value for XOR as collateral * Fix styles for Vaults page * Add draft for min deposit collateral * Fix formatted values on Vaults page * AddCollateralDialog draft * Update lib version * Add PrevNextInfoLine * Add minDeposit check to Vault creation dialog * Add slot to prev-next-info-line * Fix styles for CreateVaultDialog * Add logic for AddCollateralDialog * Update AddCollateralDialog.vue * Fix decimals issues * Add BorrowMoreDialog * Update CreateVaultDialog.vue * Add RepayDebtDialog * Improve dialogs error handling & reactivity * Add close vault dialog * Add missed non-centered classes * TokenInput: remove focus & add balanceText prop * Improve numbers format for CloseVault and AddCollateral * Fix error icon size * Improve LtvProgressBar * Add new icons * Update api * Add slippage tolerance component to Kensetsu * Add subscriptions * Fix data kensetsu subscriptions * Fix PW-1562 * Update CreateVaultDialog.vue * Fix PW-1564 * Add isAddCollateralUnavailable * Update deps * Remove ken distribution page * Update translation strings * Update en.json * Add translation keys * Fix ltv calc and add en strings * Add translation strings * Fix debt calc * Refactor templates * Update CloseVaultDialog.vue * Add history based translations * Update ru.json * Improve translation strings for Kensetsu * Fix header styles * Add stats draft * Update index.ts * Add stats * Adjust ltv with max ltv * Fix format percent functions * Add title divider for Vaults page * Add MAX LTV * Update ExploreCollaterals.vue * Add kensetsu overall stats * Fix percents * Handle price tools error * Fix styles * Make borrow required during the vault creation * Improve vault creation dialog behaviour * Check total available debt for collateral in Borrow More dialog * Fix * Improve hover icon * Add borrow tax to kusdAvailable for cdp creation * Update collaterals & reduce price subs updates * Improve styles of CreateVaultDialog * Add available check for explore collaterals * Prevent events if swap button is clicked * Exclude borrow tax from available to borrow * Update BorrowMoreDialog.vue * Add collaterals subscription per block * Add paddings for collateral stats * Add ResponsiveTabs component * Update ResponsiveTabs.vue * Update substrate-js * Update electron deps * Improve responsive layouts for Kensetsu * Add feature flags * Improve available debt checks for Explore collaterals * Fix borrow link in menu * Add --sidebar-width * Fix logout state for Explore collaterals * Improve responsive design for Explore components * Fix conflicts * Stability fee -> Interest * Update messages.ts * Improve CreateVault & CloseVault translations * Improve Vaults & VaultDetails translations * Update kensetsu translations (vault -> position)) * Download files from lokalise * Update ExploreCollaterals.vue * Add kensetsu subquery queries * Add Vault Details History * Update VaultDetailsHistory.vue * Add vaults history * Update package.json * Update package.json * Fix checks * Add missed translations * Update Vaults.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: NaghmeMohammadifar <45916098+Naghme98@users.noreply.github.com> Co-authored-by: Nikita-Polyakov * remove orderbook ad * add missing translation (#1415) * fix Burn page request * remove merge conflicts * Borrow -> Kensetsu (#1417) * Borrow -> Kensetsu * Update ru.json * Fix empty vaults state --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * cede payment integration (#1398) * Update FiatDepositOptions.vue * preload widget * add widget * remove legacy * change theme * Update CedeStoreWidget.vue * update widget * change wordings * provide colors * remove occurrences * add cede translations * debug * clear cached data * Update env.json * Add pagination to Vault history (#1416) * add pagination to Vault history * fix TransactionsWidget ts * update FetchVariables ts * fix accessor --------- Co-authored-by: Stefan Popov * fix bridge sora link (#1418) * Add KEN icon (#1420) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> --------- Signed-off-by: Nikita Zaporozhets Signed-off-by: BAStos525 Co-authored-by: Stefan Popov Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: alexnatalia Co-authored-by: Aleksandr Makhnev Co-authored-by: Bulat Saifullin Co-authored-by: Alex Natalia <38787212+alexnatalia@users.noreply.github.com> Co-authored-by: Dmitriy Creed Co-authored-by: alexnatalia Co-authored-by: Nikita Polyakov Co-authored-by: Alex Natalia Co-authored-by: Pavel Golovkin Co-authored-by: Pavel Co-authored-by: Pobepto Co-authored-by: Tarmo Vannas Co-authored-by: 武宮誠 Co-authored-by: Denis Nikiforov <45266099+DenisNikiforov@users.noreply.github.com> Co-authored-by: RustemYuzlibaev Co-authored-by: Ahmed Elkashef Co-authored-by: Nikita Zaporozhets Co-authored-by: Nikita Zaporozhets <95526886+f33r0@users.noreply.github.com> Co-authored-by: sunlucky163 Co-authored-by: sunlucky163 <44086186+sunlucky163@users.noreply.github.com> Co-authored-by: Bao Tran Co-authored-by: Bao Nguyen Tran Co-authored-by: Pavel Varfolomeev Co-authored-by: wpi86 <86880521+wpi86@users.noreply.github.com> Co-authored-by: Pavel Varfolomeev Co-authored-by: German Vechtomov <89127595+ox7a59@users.noreply.github.com> Co-authored-by: frodan Co-authored-by: Daniil Fronts Co-authored-by: Viacheslav Co-authored-by: BAStos525 Co-authored-by: BAStos525 <66615487+BAStos525@users.noreply.github.com> Co-authored-by: Aleksey Kazakov Co-authored-by: C4tWithShell Co-authored-by: Vladimir Shelkovnikov <99356504+C4tWithShell@users.noreply.github.com> Co-authored-by: William Richter <88400283+WRRicht3r@users.noreply.github.com> Co-authored-by: Timofey Trepalin Co-authored-by: Maksim Baranov <33489381+MaksimBaranov98@users.noreply.github.com> Co-authored-by: timofeytrepalin <97504184+timofeytrepalin@users.noreply.github.com> Co-authored-by: Aleksandr Iakimov Co-authored-by: safinsaf <45899673+safinsaf@users.noreply.github.com> Co-authored-by: Aleksandr Iakimov Co-authored-by: NaghmeMohammadifar <45916098+Naghme98@users.noreply.github.com> Co-authored-by: marat-biriushev <49524488+marat-biriushev@users.noreply.github.com> --- env.json | 8 +- package.json | 9 +- public/asset-owner/dark.png | Bin 0 -> 96089 bytes public/asset-owner/light.png | Bin 0 -> 70656 bytes public/env.json | 10 +- public/marketing.json | 5 - public/marketing/orderbook.png | Bin 8439 -> 0 bytes src/App.vue | 30 +- src/assets/fonts/polkaswap_icons.ttf | Bin 57652 -> 60328 bytes src/background.ts | 14 +- src/components/App/Alerts/AlertList.vue | 2 +- src/components/App/Menu/AppMenu.vue | 49 +- .../mixins/IndexerDataFetchMixin.ts | 127 ++++ src/components/pages/Bridge/SelectAccount.vue | 11 +- .../pages/CedeStore/CedeStoreWidget.vue | 60 ++ src/components/pages/Kensetsu/BurnDialog.vue | 228 ------ .../pages/Moonpay/MoonpayHistory.vue | 2 - src/components/pages/OrderBook/BuySell.vue | 2 +- .../pages/SoraCard/SoraCardIntroPage.vue | 3 - .../pages/SoraCard/steps/Payment.vue | 20 +- .../SoraCard/steps/TermsAndConditions.vue | 2 +- src/components/pages/Stats/NetworkStats.vue | 6 +- src/components/pages/Stats/SupplyChart.vue | 32 +- .../pages/Swap/Widget/Transactions.vue | 124 +--- src/components/pages/X1/X1Dialog.vue | 170 ----- src/components/pages/X1/X1History.vue | 36 - src/components/shared/Dialog/PaymentError.vue | 2 +- src/components/shared/GenericPageHeader.vue | 5 +- src/components/shared/Input/TokenInput.vue | 16 +- .../shared/Input/TokenSelectButton.vue | 4 +- src/components/shared/Logo/CedeStore.vue | 107 +++ src/components/shared/Logo/X1ex.vue | 121 --- src/components/shared/ResponsiveTabs.vue | 127 ++++ .../shared/SelectAsset/SelectToken.vue | 4 +- src/components/shared/TransactionDetails.vue | 2 +- src/components/shared/ValueStatusWrapper.vue | 8 +- src/consts/index.ts | 46 +- src/indexer/queries/kensetsu.ts | 198 ++--- src/lang/cs.json | 69 +- src/lang/de.json | 69 +- src/lang/en.json | 73 +- src/lang/es.json | 69 +- src/lang/fr.json | 69 +- src/lang/hr.json | 69 +- src/lang/hu.json | 69 +- src/lang/hy.json | 69 +- src/lang/id.json | 69 +- src/lang/it.json | 69 +- src/lang/messages.ts | 151 +++- src/lang/nl.json | 69 +- src/lang/no.json | 69 +- src/lang/pl.json | 69 +- src/lang/ru.json | 71 +- src/lang/sk.json | 69 +- src/lang/sr.json | 69 +- src/lang/sv.json | 69 +- src/lang/vi.json | 69 +- src/lang/yo.json | 69 +- src/lang/zh_CN.json | 69 +- .../dashboard/components/BurnDialog.vue | 197 +++++ .../dashboard/components/CreateNftToken.vue | 98 +++ .../components/CreateSimpleToken.vue | 98 +++ .../components/CreateTokenDialog.vue | 117 +++ .../dashboard/components/MintDialog.vue | 172 +++++ .../dashboard/components/SendTokenDialog.vue | 260 +++++++ src/modules/dashboard/consts.ts | 13 + src/modules/dashboard/router.ts | 12 + src/modules/dashboard/types/index.ts | 4 + src/modules/dashboard/views/AssetOwner.vue | 285 ++++++++ .../dashboard/views/AssetOwnerDetails.vue | 349 +++++++++ src/modules/staking/consts.ts | 9 + src/modules/staking/router.ts | 10 + .../components/ValidatorsFilterDialog.vue | 4 +- .../vault/components/AddCollateralDialog.vue | 333 +++++++++ .../vault/components/BorrowMoreDialog.vue | 304 ++++++++ .../vault/components/CloseVaultDialog.vue | 322 ++++++++ .../vault/components/CreateVaultDialog.vue | 504 +++++++++++++ .../vault/components/ExploreCollaterals.vue | 334 +++++++++ .../vault/components/ExploreOverallStats.vue | 153 ++++ .../vault/components/LtvProgressBar.vue | 108 +++ .../vault/components/PositionStatus.vue | 49 ++ .../vault/components/PrevNextInfoLine.vue | 58 ++ .../vault/components/RepayDebtDialog.vue | 301 ++++++++ .../vault/components/VaultDetailsHistory.vue | 221 ++++++ src/modules/vault/consts.ts | 39 + src/modules/vault/router.ts | 11 + src/modules/vault/types.ts | 32 + src/modules/vault/util.ts | 8 + src/modules/vault/views/VaultDetails.vue | 685 +++++++++++++++++ src/modules/vault/views/Vaults.vue | 690 ++++++++++++++++++ src/router/index.ts | 60 +- src/store/bridge/actions.ts | 4 +- src/store/consts.ts | 2 + src/store/dashboard/actions.ts | 39 + src/store/dashboard/getters.ts | 26 + src/store/dashboard/index.ts | 23 + src/store/dashboard/mutations.ts | 23 + src/store/dashboard/state.ts | 12 + src/store/dashboard/types.ts | 4 + src/store/index.ts | 4 + src/store/settings/getters.ts | 16 +- src/store/settings/mutations.ts | 26 +- src/store/settings/state.ts | 1 + src/store/settings/types.ts | 4 +- src/store/soraCard/getters.ts | 4 - src/store/types.ts | 20 +- src/store/vault/actions.ts | 236 ++++++ src/store/vault/getters.ts | 36 + src/store/vault/index.ts | 23 + src/store/vault/mutations.ts | 119 +++ src/store/vault/state.ts | 34 + src/store/vault/types.ts | 27 + src/styles/_layout.scss | 1 + src/styles/_mixins.scss | 7 +- src/styles/common.scss | 4 + src/types/indexers.ts | 8 + src/types/tabs.ts | 10 +- src/utils/bridge/sub/classes/history.ts | 16 +- src/utils/bridge/sub/classes/reducers.ts | 1 + src/utils/bridge/sub/utils.ts | 10 +- src/utils/card.ts | 2 - src/utils/x1.ts | 17 - src/views/AssetOwnerContainer.vue | 39 + src/views/BridgeTransaction.vue | 15 +- src/views/Burn.vue | 65 +- src/views/Explore/Books.vue | 8 +- src/views/Explore/Container.vue | 99 +-- src/views/Explore/Demeter.vue | 12 +- src/views/Explore/Pools.vue | 12 +- src/views/Explore/Tokens.vue | 15 +- src/views/FiatDepositOptions.vue | 45 +- src/views/FiatTxHistory.vue | 11 - src/views/Kensetsu.vue | 324 -------- src/views/ReferralBonding.vue | 2 +- src/views/VaultsContainer.vue | 53 ++ tsconfig.json | 2 +- vue.config.js | 9 + yarn.lock | 358 ++++++--- 138 files changed, 8763 insertions(+), 2032 deletions(-) create mode 100644 public/asset-owner/dark.png create mode 100644 public/asset-owner/light.png delete mode 100644 public/marketing/orderbook.png create mode 100644 src/components/mixins/IndexerDataFetchMixin.ts create mode 100644 src/components/pages/CedeStore/CedeStoreWidget.vue delete mode 100644 src/components/pages/Kensetsu/BurnDialog.vue delete mode 100644 src/components/pages/X1/X1Dialog.vue delete mode 100644 src/components/pages/X1/X1History.vue create mode 100644 src/components/shared/Logo/CedeStore.vue delete mode 100644 src/components/shared/Logo/X1ex.vue create mode 100644 src/components/shared/ResponsiveTabs.vue create mode 100644 src/modules/dashboard/components/BurnDialog.vue create mode 100644 src/modules/dashboard/components/CreateNftToken.vue create mode 100644 src/modules/dashboard/components/CreateSimpleToken.vue create mode 100644 src/modules/dashboard/components/CreateTokenDialog.vue create mode 100644 src/modules/dashboard/components/MintDialog.vue create mode 100644 src/modules/dashboard/components/SendTokenDialog.vue create mode 100644 src/modules/dashboard/consts.ts create mode 100644 src/modules/dashboard/router.ts create mode 100644 src/modules/dashboard/types/index.ts create mode 100644 src/modules/dashboard/views/AssetOwner.vue create mode 100644 src/modules/dashboard/views/AssetOwnerDetails.vue create mode 100644 src/modules/vault/components/AddCollateralDialog.vue create mode 100644 src/modules/vault/components/BorrowMoreDialog.vue create mode 100644 src/modules/vault/components/CloseVaultDialog.vue create mode 100644 src/modules/vault/components/CreateVaultDialog.vue create mode 100644 src/modules/vault/components/ExploreCollaterals.vue create mode 100644 src/modules/vault/components/ExploreOverallStats.vue create mode 100644 src/modules/vault/components/LtvProgressBar.vue create mode 100644 src/modules/vault/components/PositionStatus.vue create mode 100644 src/modules/vault/components/PrevNextInfoLine.vue create mode 100644 src/modules/vault/components/RepayDebtDialog.vue create mode 100644 src/modules/vault/components/VaultDetailsHistory.vue create mode 100644 src/modules/vault/consts.ts create mode 100644 src/modules/vault/router.ts create mode 100644 src/modules/vault/types.ts create mode 100644 src/modules/vault/util.ts create mode 100644 src/modules/vault/views/VaultDetails.vue create mode 100644 src/modules/vault/views/Vaults.vue create mode 100644 src/store/dashboard/actions.ts create mode 100644 src/store/dashboard/getters.ts create mode 100644 src/store/dashboard/index.ts create mode 100644 src/store/dashboard/mutations.ts create mode 100644 src/store/dashboard/state.ts create mode 100644 src/store/dashboard/types.ts create mode 100644 src/store/vault/actions.ts create mode 100644 src/store/vault/getters.ts create mode 100644 src/store/vault/index.ts create mode 100644 src/store/vault/mutations.ts create mode 100644 src/store/vault/state.ts create mode 100644 src/store/vault/types.ts delete mode 100644 src/utils/x1.ts create mode 100644 src/views/AssetOwnerContainer.vue delete mode 100644 src/views/Kensetsu.vue create mode 100644 src/views/VaultsContainer.vue diff --git a/env.json b/env.json index cc40ff0bb..ad5d60783 100644 --- a/env.json +++ b/env.json @@ -2,7 +2,6 @@ "BASE_API_URL": "", "API_KEYS": { "moonpay": "pk_live_LEyw9bsfK0n0v3cdHUaZS1z0qYdDRDu6", - "x1ex": "sprkwdgt-WUQBA5U2", "etherscan": "XBS98SSP8J5FNS7EKQHMHRU94Z2YG7HFFK", "nftStorage": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDBmMzgwOTMyQTNDODM3ZDNiN2JEYzBBNTc0NmNkMDlBRGIyNUZGMzQiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY0NTU0MDQ4MTQ5OSwibmFtZSI6Im5mdC1zdG9yYWdlLXByb2QifQ.CnW1bq8eWEYQxA6cggGMeAqCTozCJZ6s2oL_bssqnmc", "googleApi": "AIzaSyCazdRheGfy7_bwVi0m5UgUYjz7l0c54nM", @@ -10,10 +9,11 @@ }, "FEATURE_FLAGS": { "moonpay": true, - "x1ex": false, "charts": true, "soraCard": false, - "orderBook": true + "orderBook": true, + "kensetsu": true, + "assetOwner": false }, "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod", "SUBSQUID_ENDPOINT": "", @@ -57,7 +57,7 @@ "Polkadot": true, "PolkadotSora": true, "PolkadotAcala": true, - "Liberland": false + "Liberland": true }, "EVM_NETWORKS_IDS": [56, 8217], "ETH_BRIDGE": { diff --git a/package.json b/package.json index d3795664c..25df0b255 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polkaswap-exchange-web", - "version": "1.34.2", + "version": "1.35.0", "repository": { "type": "git", "url": "https://github.com/sora-xor/polkaswap-exchange-web.git" @@ -26,8 +26,9 @@ "test:all": "yarn test:unit --coverage" }, "dependencies": { + "@cedelabs/widgets-universal": "^1.3.1", "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.34.3-1", + "@soramitsu/soraneo-wallet-web": "1.34.7", "@walletconnect/ethereum-provider": "^2.12.2", "@walletconnect/modal": "^2.6.2", "core-js": "^3.37.0", @@ -53,7 +54,7 @@ "@types/electron-devtools-installer": "^2.2.5", "@types/jest": "^29.5.12", "@types/jsdom": "^21.1.6", - "@types/lodash": "^4.17.1", + "@types/lodash": "^4.17.3", "@types/node": "^20.12.10", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", @@ -72,7 +73,7 @@ "@vue/vue2-jest": "^27.0.0", "babel-plugin-require-context-hook": "^1.0.0", "css-unicode-loader": "^1.0.3", - "electron": "^13.0.0", + "electron": "^30.0.6", "electron-devtools-installer": "^3.2.0", "eslint": "^7.32.0", "eslint-plugin-import": "^2.29.1", diff --git a/public/asset-owner/dark.png b/public/asset-owner/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ee19f4058ff8c7675a2766a25948bda0a8db4b28 GIT binary patch literal 96089 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

(8m{nD#o3KdvW<;zPA?N0JvgiwsDxwkXUoHB&w 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�R%fYCgCdN%}_Q+FWEx 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 C#`vKC literal 0 HcmV?d00001 diff --git a/public/asset-owner/light.png b/public/asset-owner/light.png new file mode 100644 index 0000000000000000000000000000000000000000..61a3515bd94eb763b68040f69b6c8de7f9191234 GIT binary patch literal 70656 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 @@ -123,7 +125,7 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) @mutation.settings.setBrowserNotifsPopupBlocked private setBrowserNotifsPopupBlocked!: (flag: boolean) => void; @mutation.settings.toggleDisclaimerDialogVisibility private toggleDisclaimerDialogVisibility!: FnWithoutArgs; @mutation.settings.resetBlockNumberSubscription private resetBlockNumberSubscription!: FnWithoutArgs; - @mutation.settings.setScreenBreakpointClass private setScreenBreakpointClass!: (cssClass: string) => void; + @mutation.settings.setScreenBreakpointClass private setScreenBreakpointClass!: (windowWidth: number) => void; @mutation.referrals.unsubscribeFromInvitedUsers private unsubscribeFromInvitedUsers!: FnWithoutArgs; @mutation.web3.setEvmNetworksApp private setEvmNetworksApp!: (data: EvmNetwork[]) => void; @mutation.web3.setSubNetworkApps private setSubNetworkApps!: (data: SubNetworkApps) => void; @@ -198,21 +200,7 @@ export default class App extends Mixins(mixins.TransactionMixin, NodeErrorMixin) } private setResponsiveClass(): void { - const width = window.innerWidth; - if (width >= Breakpoint.HugeDesktop) { - this.responsiveClass = BreakpointClass.HugeDesktop; - } else if (width >= Breakpoint.LargeDesktop) { - this.responsiveClass = BreakpointClass.LargeDesktop; - } else if (width >= Breakpoint.Desktop) { - this.responsiveClass = BreakpointClass.Desktop; - } else if (width >= Breakpoint.Tablet) { - this.responsiveClass = BreakpointClass.Tablet; - } else if (width >= Breakpoint.LargeMobile) { - this.responsiveClass = BreakpointClass.LargeMobile; - } else if (width < Breakpoint.LargeMobile) { - this.responsiveClass = BreakpointClass.Mobile; - } - this.setScreenBreakpointClass(this.responsiveClass); + this.setScreenBreakpointClass(window.innerWidth); } private setResponsiveClassDebounced = debounce(this.setResponsiveClass, 250); @@ -572,7 +560,11 @@ i.icon-divider { } @include desktop { - .app-main--swap { + .app-main--swap, + .app-main--vaults, + .app-main--vaultdetails, + .app-main--assetowner, + .app-main--assetownerdetails { &.app-main { .app-menu { &:not(.collapsed) { diff --git a/src/assets/fonts/polkaswap_icons.ttf b/src/assets/fonts/polkaswap_icons.ttf index fe862b8c11a34254440b7a51d987418805740470..3753e4149b28d7d9ad705dd6684adb6f45569e97 100644 GIT binary patch delta 5383 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 KbY-T0TK@%8_5v6H diff --git a/src/background.ts b/src/background.ts index 50508c4fb..394d3bbf4 100644 --- a/src/background.ts +++ b/src/background.ts @@ -7,7 +7,8 @@ const isDevelopment = process.env.NODE_ENV !== 'production'; // Scheme must be registered before the app is ready protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }]); -async function createWindow() { +async function createWindow(): Promise { + const ELECTRON_NODE_INTEGRATION = !!process.env.ELECTRON_NODE_INTEGRATION; // Create the browser window. const win = new BrowserWindow({ width: 800, @@ -17,14 +18,14 @@ async function createWindow() { webPreferences: { // Use pluginOptions.nodeIntegration, leave this alone // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info - nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION as unknown as boolean, - contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION, + nodeIntegration: ELECTRON_NODE_INTEGRATION, + contextIsolation: !ELECTRON_NODE_INTEGRATION, }, }); if (process.env.WEBPACK_DEV_SERVER_URL) { // Load the url of the dev server if in development mode - await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string); + await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL); if (!process.env.IS_TEST) win.webContents.openDevTools(); } else { createProtocol('app'); @@ -33,9 +34,10 @@ async function createWindow() { } // It's required for external links - win.webContents.on('new-window', function (e, url) { - e.preventDefault(); + win.webContents.setWindowOpenHandler(({ url }) => { + // Prevent default behavior shell.openExternal(url); + return { action: 'deny' }; }); } diff --git a/src/components/App/Alerts/AlertList.vue b/src/components/App/Alerts/AlertList.vue index 3f1966645..778109a67 100644 --- a/src/components/App/Alerts/AlertList.vue +++ b/src/components/App/Alerts/AlertList.vue @@ -252,7 +252,7 @@ $list-items: 5; font-weight: 300; font-size: var(--s-font-size-medium); line-height: 150%; - letter-spacing: -0.02em; + letter-spacing: var(--s-letter-spacing-small); span { margin-left: $inner-spacing-mini; diff --git a/src/components/App/Menu/AppMenu.vue b/src/components/App/Menu/AppMenu.vue index 5694f60ef..8717cc12e 100644 --- a/src/components/App/Menu/AppMenu.vue +++ b/src/components/App/Menu/AppMenu.vue @@ -107,13 +107,17 @@ import { PoolChildPages, BridgeChildPages, RewardsChildPages, - StakingChildPages, ExploreChildPages, SidebarMenuGroups, SidebarMenuItemLink, FaucetLink, } from '@/consts'; +import { DashboardPageNames } from '@/modules/dashboard/consts'; +import { isDashboardPage } from '@/modules/dashboard/router'; import { StakingPageNames } from '@/modules/staking/consts'; +import { isStakingPage } from '@/modules/staking/router'; +import { VaultPageNames } from '@/modules/vault/consts'; +import { isVaultPage } from '@/modules/vault/router'; import { getter, mutation, state } from '@/store/decorators'; import AppInfoPopper from './AppInfoPopper.vue'; @@ -135,12 +139,34 @@ export default class AppMenu extends Mixins(TranslationMixin) { @state.settings.menuCollapsed collapsed!: boolean; @getter.settings.orderBookEnabled private orderBookEnabled!: boolean; + @getter.settings.kensetsuEnabled private kensetsuEnabled!: boolean; + @getter.settings.assetOwnerEnabled private assetOwnerEnabled!: boolean; @getter.libraryTheme private libraryTheme!: Theme; @mutation.settings.setMenuCollapsed private setMenuCollapsed!: (collapsed: boolean) => void; readonly FaucetLink = FaucetLink; + private resizeObserver: Nullable = null; + + private onMenuWidthChange(): void { + const width = this.$el?.clientWidth ?? 0; + if (!width) return; + + document.documentElement.style.setProperty('--sidebar-width', `${width}px`); + } + + async mounted(): Promise { + await this.$nextTick(); + if (!(this.$el && window.ResizeObserver)) return; + this.resizeObserver = new ResizeObserver(this.onMenuWidthChange); + this.resizeObserver.observe(this.$el); + } + + beforeDestroy(): void { + this.resizeObserver?.disconnect(); + } + get collapseIcon(): string { return this.collapsed ? 'arrows-chevron-right-24' : 'arrows-chevron-left-24'; } @@ -154,10 +180,19 @@ export default class AppMenu extends Mixins(TranslationMixin) { } get sidebarMenuItems(): Array { + let menuItems = SidebarMenuGroups; + if (!this.orderBookEnabled) { - return SidebarMenuGroups.filter(({ title }) => title !== PageNames.OrderBook); + menuItems = menuItems.filter(({ title }) => title !== PageNames.OrderBook); + } + if (!this.kensetsuEnabled) { + menuItems = menuItems.filter(({ title }) => title !== PageNames.VaultsContainer); + } + if (!this.assetOwnerEnabled) { + menuItems = menuItems.filter(({ title }) => title !== PageNames.AssetOwnerContainer); } - return SidebarMenuGroups; + + return menuItems; } get currentPath(): string { @@ -171,12 +206,18 @@ export default class AppMenu extends Mixins(TranslationMixin) { if (RewardsChildPages.includes(currentName)) { return PageNames.Rewards; } - if (StakingChildPages.includes(currentName)) { + if (isStakingPage(currentName)) { return StakingPageNames.Staking; } if (ExploreChildPages.includes(currentName)) { return PageNames.ExploreTokens; } + if (isDashboardPage(currentName)) { + return DashboardPageNames.AssetOwner; + } + if (isVaultPage(currentName)) { + return VaultPageNames.Vaults; + } return currentName as string; } diff --git a/src/components/mixins/IndexerDataFetchMixin.ts b/src/components/mixins/IndexerDataFetchMixin.ts new file mode 100644 index 000000000..4d04c74cd --- /dev/null +++ b/src/components/mixins/IndexerDataFetchMixin.ts @@ -0,0 +1,127 @@ +import { mixins, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; +import isEqual from 'lodash/fp/isEqual'; +import { Component, Mixins } from 'vue-property-decorator'; + +import { type FetchVariables } from '@/types/indexers'; +import { debouncedInputHandler } from '@/utils'; + +@Component +export default class IndexerDataFetchMixin extends Mixins(mixins.LoadingMixin, mixins.PaginationSearchMixin) { + totalCount = 0; + items: any[] = []; + + intervalTimestamp = 0; + private interval: Nullable> = null; + private updateItems = debouncedInputHandler(this.updateData, 250, { leading: false }); + + updateInterval = 24_000; // 4 blocks + + get loadingState(): boolean { + return this.parentLoading || this.loading; + } + + // override PaginationSearchMixin + get total(): number { + return this.totalCount; + } + + get hasItems(): boolean { + return this.total > 0; + } + + get dataVariables(): FetchVariables { + return {}; + } + + get updateVariables(): FetchVariables { + return {}; + } + + checkTriggerUpdate(current: any, prev: any) { + if (!isEqual(current)(prev)) { + this.resetPage(); + this.updateItems(); + } + } + + async requestData(variables: FetchVariables): Promise<{ items: any[]; totalCount: number }> { + console.info('[IndexerDataFetchMixin]: requestData is not implemented'); + return { items: [], totalCount: 0 }; + } + + getItemTimestamp(item: any): number { + console.info('[IndexerDataFetchMixin]: getItemTimestamp is not implemented'); + return 0; + } + + async onPaginationClick(button: WALLET_CONSTS.PaginationButton): Promise { + this.handlePaginationClick(button); + this.updateItems(); + } + + public handlePaginationClick(button: WALLET_CONSTS.PaginationButton): void { + let current = 1; + + switch (button) { + case WALLET_CONSTS.PaginationButton.Prev: + current = this.currentPage - 1; + break; + case WALLET_CONSTS.PaginationButton.Next: + current = this.currentPage + 1; + break; + case WALLET_CONSTS.PaginationButton.Last: + current = this.lastPage; + break; + } + + this.currentPage = current; + } + + private async updateData(): Promise { + this.resetDataSubscription(); + + await this.fetchData(); + + if (this.currentPage === 1) { + this.updateIntervalTimestamp(); + this.subscribeOnData(); + } + } + + private async fetchData(): Promise { + await this.withLoading(async () => { + await this.withParentLoading(async () => { + const { totalCount, items } = await this.requestData(this.dataVariables); + this.totalCount = totalCount; + this.items = items; + }); + }); + } + + private async fetchDataUpdates(): Promise { + const { items, totalCount } = await this.requestData(this.updateVariables); + this.items = [...items, ...this.items].slice(0, this.pageAmount); + this.totalCount = this.totalCount + totalCount; + this.updateIntervalTimestamp(); + } + + private updateIntervalTimestamp(): void { + this.intervalTimestamp = Math.floor(this.getItemTimestamp(this.items[0]) / 1000); + } + + private subscribeOnData(): void { + this.resetDataSubscription(); + this.interval = setInterval(() => this.fetchDataUpdates(), this.updateInterval); + } + + private resetDataSubscription(): void { + if (this.interval) { + clearInterval(this.interval); + } + this.interval = null; + } + + beforeDestroy(): void { + this.resetDataSubscription(); + } +} diff --git a/src/components/pages/Bridge/SelectAccount.vue b/src/components/pages/Bridge/SelectAccount.vue index d44adba28..591c8dec9 100644 --- a/src/components/pages/Bridge/SelectAccount.vue +++ b/src/components/pages/Bridge/SelectAccount.vue @@ -1,7 +1,7 @@ @@ -41,7 +40,6 @@ import type { FPNumber } from '@sora-substrate/math'; import type { AccountAsset } from '@sora-substrate/util/build/assets/types'; enum BuyButtonType { - X1, Bridge, Paywings, } @@ -52,7 +50,6 @@ type BuyButton = { type: BuyButtonType; text: string; button: 'primary' | 'secon components: { TokenLogo: components.TokenLogo, BalanceIndicator: lazyComponent(Components.BalanceIndicator), - X1Dialog: lazyComponent(Components.X1Dialog), }, }) export default class Payment extends Mixins(TranslationMixin, mixins.LoadingMixin) { @@ -60,12 +57,10 @@ export default class Payment extends Mixins(TranslationMixin, mixins.LoadingMixi @state.soraCard.wasEuroBalanceLoaded wasEuroBalanceLoaded!: boolean; @state.soraCard.fees fees!: Fees; - @getter.settings.x1Enabled private x1Enabled!: boolean; @getter.soraCard.isEuroBalanceEnough isEuroBalanceEnough!: boolean; @getter.wallet.account.isLoggedIn isLoggedIn!: boolean; @getter.assets.xor xor!: Nullable; - showX1Dialog = false; showPaywingsDialog = false; WALLET_CONSTS = WALLET_CONSTS; @@ -78,12 +73,8 @@ export default class Payment extends Mixins(TranslationMixin, mixins.LoadingMixi } get buyOptions(): Array { - const options: Array = [ - { type: BuyButtonType.Bridge, text: 'card.bridgeTokensBtn', button: !this.x1Enabled ? 'primary' : 'secondary' }, - ]; - if (this.x1Enabled) { - options.push({ type: BuyButtonType.X1, text: 'card.depositX1Btn', button: 'primary' }); - } + const options: Array = [{ type: BuyButtonType.Bridge, text: 'card.bridgeTokensBtn', button: 'primary' }]; + return options; } @@ -106,10 +97,6 @@ export default class Payment extends Mixins(TranslationMixin, mixins.LoadingMixi return this.t('card.applicationFee', { 0: this.applicationFee }); } - private openX1(): void { - this.showX1Dialog = true; - } - private bridgeTokens(): void { if (!this.isEuroBalanceEnough) { router.push({ name: PageNames.Bridge, params: { amount: this.xorToDeposit.toString() } }); @@ -118,9 +105,6 @@ export default class Payment extends Mixins(TranslationMixin, mixins.LoadingMixi buyTokens(type: BuyButtonType): void { switch (type) { - case BuyButtonType.X1: - this.openX1(); - break; case BuyButtonType.Bridge: this.bridgeTokens(); break; diff --git a/src/components/pages/SoraCard/steps/TermsAndConditions.vue b/src/components/pages/SoraCard/steps/TermsAndConditions.vue index 0fbd7db28..38851b945 100644 --- a/src/components/pages/SoraCard/steps/TermsAndConditions.vue +++ b/src/components/pages/SoraCard/steps/TermsAndConditions.vue @@ -107,7 +107,7 @@ export default class TermsAndConditions extends Mixins(TranslationMixin, mixins. text-align: center; font-weight: 300; line-height: 150%; - letter-spacing: -0.02em; + letter-spacing: var(--s-letter-spacing-small); width: 95%; } diff --git a/src/components/pages/Stats/NetworkStats.vue b/src/components/pages/Stats/NetworkStats.vue index 5ef9fef58..7ba332caf 100644 --- a/src/components/pages/Stats/NetworkStats.vue +++ b/src/components/pages/Stats/NetworkStats.vue @@ -79,6 +79,7 @@ export default class NetworkStats extends Mixins(mixins.LoadingMixin, Translatio readonly FontSizeRate = WALLET_CONSTS.FontSizeRate; readonly FontWeightRate = WALLET_CONSTS.FontWeightRate; readonly filters = NETWORK_STATS_FILTERS; + readonly Arrow = String.fromCodePoint(0x2192); filter = NETWORK_STATS_FILTERS[0]; @@ -91,7 +92,6 @@ export default class NetworkStats extends Mixins(mixins.LoadingMixin, Translatio get columns() { const { Sora, Ethereum } = this.TranslationConsts; - const Arrow = String.fromCodePoint(0x2192); return [ { @@ -105,12 +105,12 @@ export default class NetworkStats extends Mixins(mixins.LoadingMixin, Translatio prop: 'accounts', }, { - title: [Ethereum, Arrow, Sora].join(' '), + title: [Ethereum, this.Arrow, Sora].join(' '), tooltip: this.t('tooltips.bridgeTransactions', { from: Ethereum, to: Sora }), prop: 'bridgeIncomingTransactions', }, { - title: [Sora, Arrow, Ethereum].join(' '), + title: [Sora, this.Arrow, Ethereum].join(' '), tooltip: this.t('tooltips.bridgeTransactions', { from: Sora, to: Ethereum }), prop: 'bridgeOutgoingTransactions', }, diff --git a/src/components/pages/Stats/SupplyChart.vue b/src/components/pages/Stats/SupplyChart.vue index 3bcea4290..c858d2599 100644 --- a/src/components/pages/Stats/SupplyChart.vue +++ b/src/components/pages/Stats/SupplyChart.vue @@ -4,11 +4,11 @@ - @@ -35,7 +41,7 @@ import { XOR, VAL, PSWAP, XSTUSD, XST, TBCD } from '@sora-substrate/util/build/a import { components, mixins, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; import first from 'lodash/fp/first'; import last from 'lodash/fp/last'; -import { Component, Mixins } from 'vue-property-decorator'; +import { Component, Mixins, Prop } from 'vue-property-decorator'; import ChartSpecMixin from '@/components/mixins/ChartSpecMixin'; import { Components } from '@/consts'; @@ -76,13 +82,17 @@ export default class StatsSupplyChart extends Mixins(mixins.LoadingMixin, ChartS readonly filters = ASSET_SUPPLY_LINE_FILTERS; readonly tokens = [XOR, VAL, PSWAP, XSTUSD, XST, TBCD]; + @Prop({ type: Object }) predefinedToken!: Nullable; + + private token = XOR; filter: SnapshotFilter = ASSET_SUPPLY_LINE_FILTERS[0]; - token = XOR; showSelectTokenDialog = false; - + isFetchingError = false; data: readonly ChartData[] = []; - isFetchingError = false; + get selectedToken(): Asset { + return this.predefinedToken || this.token; + } get areActionsDisabled(): boolean { return this.parentLoading || this.loading; @@ -237,7 +247,7 @@ export default class StatsSupplyChart extends Mixins(mixins.LoadingMixin, ChartS } changeToken(token: Asset): void { - if (this.token.address === token.address) return; + if (this.selectedToken.address === token.address) return; this.token = token; this.updateData(); @@ -247,7 +257,7 @@ export default class StatsSupplyChart extends Mixins(mixins.LoadingMixin, ChartS await this.withLoading(async () => { await this.withParentLoading(async () => { try { - const id = this.token.address; + const id = this.selectedToken.address; const { type, count } = this.filter; const seconds = SECONDS_IN_TYPE[type]; const now = Math.floor(Date.now() / (seconds * 1000)) * seconds; // rounded to latest snapshot type diff --git a/src/components/pages/Swap/Widget/Transactions.vue b/src/components/pages/Swap/Widget/Transactions.vue index 210e265b8..a74bbbc25 100644 --- a/src/components/pages/Swap/Widget/Transactions.vue +++ b/src/components/pages/Swap/Widget/Transactions.vue @@ -107,14 +107,15 @@ import { FPNumber, Operation } from '@sora-substrate/util'; import { getCurrentIndexer, components, WALLET_CONSTS, WALLET_TYPES } from '@soramitsu/soraneo-wallet-web'; import dayjs from 'dayjs'; -import isEqual from 'lodash/fp/isEqual'; import { Component, Mixins, Watch } from 'vue-property-decorator'; +import IndexerDataFetchMixin from '@/components/mixins/IndexerDataFetchMixin'; import ScrollableTableMixin from '@/components/mixins/ScrollableTableMixin'; import { Components } from '@/consts'; import { lazyComponent } from '@/router'; import { getter, state } from '@/store/decorators'; -import { debouncedInputHandler, soraExplorerLinks, showMostFittingValue } from '@/utils'; +import { type FetchVariables } from '@/types/indexers'; +import { soraExplorerLinks, showMostFittingValue } from '@/utils'; import type { HistoryItem } from '@sora-substrate/util'; import type { Asset, AccountAsset } from '@sora-substrate/util/build/assets/types'; @@ -134,14 +135,6 @@ type TableItem = { links: WALLET_CONSTS.ExplorerLink[]; }; -type RequestVariables = Partial<{ - filter: any; - first: number; - offset: number; -}>; - -const UPDATE_INTERVAL = 15_000; - @Component({ components: { BaseWidget: lazyComponent(Components.BaseWidget), @@ -152,7 +145,7 @@ const UPDATE_INTERVAL = 15_000; HistoryPagination: components.HistoryPagination, }, }) -export default class SwapTransactionsWidget extends Mixins(ScrollableTableMixin) { +export default class SwapTransactionsWidget extends Mixins(ScrollableTableMixin, IndexerDataFetchMixin) { @state.wallet.settings.soraNetwork private soraNetwork!: Nullable; @getter.swap.tokenFrom tokenFrom!: Nullable; @@ -160,36 +153,18 @@ export default class SwapTransactionsWidget extends Mixins(ScrollableTableMixin) @getter.wallet.account.assetsDataTable private assetsDataTable!: WALLET_TYPES.AssetsTable; @Watch('assetsAddresses', { immediate: true }) - private resetData(current: string[], prev: string[]): void { - if (!isEqual(current)(prev)) { - this.resetPage(); - this.updateTransactions(); - } + private resetData(curr: string[], prev: string[]): void { + this.checkTriggerUpdate(curr, prev); } pageAmount = 8; // override PaginationSearchMixin private readonly operations = [Operation.Swap]; - private interval: Nullable> = null; - private updateTransactions = debouncedInputHandler(this.updateData, 250, { leading: false }); - private intervalTimestamp = 0; - private fromTimestamp = dayjs().subtract(1, 'month').startOf('day').unix(); // month ago, start of the day - - private totalCount = 0; - private transactions: HistoryItem[] = []; - - get loadingState(): boolean { - return this.parentLoading || this.loading; - } - - // override ScrollableTableMixin - get total(): number { - return this.totalCount; - } + private readonly fromTimestamp = dayjs().subtract(1, 'month').startOf('day').unix(); // month ago, start of the day // override ScrollableTableMixin get tableItems(): TableItem[] { - return this.transactions.map((item) => { + return this.items.map((item) => { const txId = item.id ?? ''; const blockId = item.blockId ?? ''; const address = item.from ?? ''; @@ -243,92 +218,51 @@ export default class SwapTransactionsWidget extends Mixins(ScrollableTableMixin) return filter; } - async onPaginationClick(button: WALLET_CONSTS.PaginationButton): Promise { - this.handlePaginationClick(button); - this.updateTransactions(); - } - - private async updateData(): Promise { - this.resetDataSubscription(); - - await this.fetchData(); - - if (this.currentPage === 1) { - this.updateIntervalTimestamp(); - this.subscribeOnData(); - } + // override IndexerDataFetchMixin + get dataVariables(): FetchVariables { + return { + filter: this.createFilter(this.fromTimestamp), + first: this.pageAmount, + offset: this.pageAmount * (this.currentPage - 1), + }; } - private async fetchData(): Promise { - await this.withLoading(async () => { - await this.withParentLoading(async () => { - const { pageAmount, currentPage } = this; - - const variables: RequestVariables = { - filter: this.createFilter(this.fromTimestamp), - first: pageAmount, - offset: pageAmount * (currentPage - 1), - }; - - const { totalCount, transactions } = await this.requestData(variables); - - this.totalCount = totalCount; - this.transactions = transactions; - }); - }); + // override IndexerDataFetchMixin + get updateVariables(): FetchVariables { + return { + filter: this.createFilter(this.intervalTimestamp), + }; } - private async fetchDataUpdates(): Promise { - const variables: RequestVariables = { filter: this.createFilter(this.intervalTimestamp) }; - const { transactions, totalCount } = await this.requestData(variables); - this.transactions = [...transactions, ...this.transactions].slice(0, this.pageAmount); - this.totalCount = this.totalCount + totalCount; - this.updateIntervalTimestamp(); + // override IndexerDataFetchMixin + getItemTimestamp(item: Nullable): number { + return item?.startTime ?? 0; } - private async requestData(variables: RequestVariables): Promise<{ transactions: HistoryItem[]; totalCount: number }> { + // override IndexerDataFetchMixin + async requestData(variables: FetchVariables): Promise<{ items: HistoryItem[]; totalCount: number }> { const indexer = getCurrentIndexer(); const response = await indexer.services.explorer.account.getHistory(variables); if (!response) return { - transactions: [], + items: [], totalCount: 0, }; const { nodes, totalCount } = response; - const transactions: HistoryItem[] = []; + const items: HistoryItem[] = []; for (const node of nodes) { const historyItem = await indexer.services.dataParser.parseTransactionAsHistoryItem(node); if (historyItem) { - transactions.push(historyItem); + items.push(historyItem); } } - return { transactions, totalCount }; - } - - private updateIntervalTimestamp(): void { - this.intervalTimestamp = Math.floor((this.transactions[0]?.startTime ?? 0) / 1000); - } - - private subscribeOnData(): void { - this.resetDataSubscription(); - this.interval = setInterval(() => this.fetchDataUpdates(), UPDATE_INTERVAL); - } - - private resetDataSubscription(): void { - if (this.interval) { - clearInterval(this.interval); - } - this.interval = null; - } - - beforeDestroy(): void { - this.resetDataSubscription(); + return { items, totalCount }; } } diff --git a/src/components/pages/X1/X1Dialog.vue b/src/components/pages/X1/X1Dialog.vue deleted file mode 100644 index 9503901fe..000000000 --- a/src/components/pages/X1/X1Dialog.vue +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - diff --git a/src/components/pages/X1/X1History.vue b/src/components/pages/X1/X1History.vue deleted file mode 100644 index 27f4ccad1..000000000 --- a/src/components/pages/X1/X1History.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/src/components/shared/Dialog/PaymentError.vue b/src/components/shared/Dialog/PaymentError.vue index 6dfbbba97..92721e3ba 100644 --- a/src/components/shared/Dialog/PaymentError.vue +++ b/src/components/shared/Dialog/PaymentError.vue @@ -1,5 +1,5 @@