From 7853090adfd13f37c3ba79f84e6c307bbfda6fb5 Mon Sep 17 00:00:00 2001 From: Stefan Popov Date: Mon, 12 Feb 2024 14:37:08 +0100 Subject: [PATCH] Release 1.29.0 (#1305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Sub bridge issues (#1060) * reset form on network change * fix network name in ui * update KAR address * update wallet * add text for scroll (#1064) * Fix bridge network update from metamask (#1065) * fix bridge network change detection * fix polkadot.js link * Add fee multiplier support (#1066) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * change welcome text (#1069) * Fix/substrate outgoing network select (#1076) * reset form on network change * fix network name in ui * update KAR address * wip rococo adapter * fix yarn.lock * update assets on network change * update balance method for sub * fix adapter connection wait * refactoring action name * refactoring block number usage * update external balance for selected asset * network update fixes * native balance update * Set up coverage * separate prod and stage * fix var * add pre branch * fix var * revert lib * Update actions.ts (#1078) * Substrate bridge incoming transaction tracking (#1081) * reset form on network change * fix network name in ui * update KAR address * wip rococo adapter * fix yarn.lock * update assets on network change * update balance method for sub * fix adapter connection wait * refactoring action name * refactoring block number usage * update external balance for selected asset * network update fixes * native balance update * update external data after sora block update * update selectedNetwork data * show sender & recepient balance * fix balance update * update env.json * update adapters endpoints * add messageHash from collator as externalHash temporary * wait for rococo message * add external links * fix adapter endpoint reset issue * refactoring sonar related issues * incoming transaction signing * incoming transaction tracking demo * remove unused update balances * fix history remove * fix BridgeTransaction asset balance & refactoring * sub history update * disconnect after bridge leave * refactoring disconnect * update wallet * revert env.json * remove console.log9 * fix (#1082) * fix * Update AlertList.vue * fix ru * Fix sub assets fetching & hashi bridge issues (#1083) * fix hashi bridge * fetch sub bridgeassets * update wallet * fix external account check * remove unnecessary codeline * remove console.log * Change jenkins lib * Update KycView.vue (#1084) * Fix bridge account link (#1085) * fix bridge account link * wait for external balances fetching * refactoring bridge fees & balances fetching * fix sonar issues * fix sub tx trancking * fix transaction link style * Fix xst & sorting on explore page (#1075) * Update Wallet.vue * Fix regexp * Refactor tokens page * Add default sorting for tokens page * Update Tokens.vue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Fix issues 1.17 (#1086) * Hide 'show only synths' * Update CERES endpoint for status bar --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Check changes for errors * Revert * Fix notification links (#1092) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add params * Merge fixes from release 1.17.0 (#1097) * Fix transaction view balance check (#1095) * fix ui checks * fix computed * Fix bridge external decimals (#1096) * fix ui checks * fix computed * fix check * Fix evm expected fee (#1091) * update evm gas price * improve gas fee calculation * remove mainnet from evm networks ids * update gasLimits * add external fee warning * refactoring externalBalance * update locales * update translations from localisr * fix merge conflict * Save sub bridge transaction fees in runtime tx processing (#1088) * fix hashi bridge * fetch sub bridgeassets * update wallet * fix external account check * remove unnecessary codeline * remove console.log * demo for fetching extrinsic fee * fix merge conflict * save tx fee & xcm fee * remove duplicated code from bridge reducers * improve network restoration * refactoring external native token balance * refactoring registered asset naming * update evm gas price * update evm gas price * improve gas fee calculation * remove mainnet from evm networks ids * update gasLimits * add external fee warning * refactoring externalBalance * update locales * update translations from localisr * impove outgoing tracking * wip locked balance * use locked balance in bridge calculations * refactoring * update BridgeTransaction asset locked balance check * refactoring event search * get bridge contract asset locked balance * remove Karura from config * refactoring before wallet update * update wallet 1.18.1 * calc evm fee based on asset kind * fix sonar issues * fix naming * Bridge balances refactoring (#1100) * update store balances * remove externalBalance from sort method * refactoring balance update * bridge route params * Change jenkins lib * spam reminder & bridge fee fix (#1103) * address book (#1099) * bump wallet * add lang * Update KycView.vue * bump wallet * update wallet 1.18.5 (#1106) * [SORA Card]: change camera access request (#1107) * add functionality * add translations * add css vars * Update KycView.vue * Update KycView.vue * Update SECURITY.md (#1105) * Update SECURITY.md Quick grammar fixes to security policy * Update SECURITY.md * Update SECURITY.md * Update SECURITY.md --------- Co-authored-by: Rustem * [Swap] Show loss warning dialog (#1108) * update value-status-wrapper * add loss warning dialog * update translations * fix loss translation argument * update wallet 1.18.8 (#1110) * Fix sub bridge tracking issues (#1104) * fix incoming tracking first steps * improve rococo incomplete transaction tracking * update retry button * refactoring namings in sub reducer * return env.json * parachain data tracking * add sora parachain hash to transaction ui * improve incoming failed tx tracking * refactor to pass sonar * add block height & blocks left in ui * update wallet 1.18.6 * refactoring adapter usage * wip adapters usage * try to refactor complexity * replace adapters in reducer * add beforeSign to bridge reducer * move sora sign to reducers * refactoring signExternal * try to pass sonar * refactoring complexity * refactoring duplicated code * fix incoming tracking & transfer notification modal * [Bridge UI] Use xcm fee in amount calculations (#1112) * fix incoming tracking first steps * improve rococo incomplete transaction tracking * update retry button * refactoring namings in sub reducer * return env.json * parachain data tracking * add sora parachain hash to transaction ui * improve incoming failed tx tracking * refactor to pass sonar * add block height & blocks left in ui * update wallet 1.18.6 * refactoring adapter usage * wip adapters usage * try to refactor complexity * replace adapters in reducer * add beforeSign to bridge reducer * move sora sign to reducers * refactoring signExternal * try to pass sonar * refactoring complexity * refactoring duplicated code * fix incoming tracking & transfer notification modal * add externalTransferFee to store * rename evm to external fee * get transfer fee from const * update bridge main form & logic * fix bridge formatted fee * native token decimals * revert BridgeInitMixin changes * Fix node name in status bar (#1113) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * Add soramitsu node (#1114) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * update wallet 1.18.9 (#1115) * Update nodes names (#1116) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * [Tech] Testing workflow (#1111) * Update card.ts * fix sr lang * add Auth and KYC SDK creds * fix typo * use dev price oracle * Update X1Dialog.vue * Update X1Dialog.vue * Update X1Dialog.vue * Update X1Dialog.vue * check url * change images * remove mentions * Update sr.json * Update X1Dialog.vue * switch to prod endpoint * Update KycView.vue * Update X1Dialog.vue * Update card.ts * debug * Update KycView.vue * Update X1Dialog.vue * Update X1Dialog.vue * Fix todo-s comments * make silent * fix typo * debug referenceNumber * Fix soraNetwork issues * Update KycView.vue * Fix types issue --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * remove sora parachain xcm fee, update rococo event (#1120) * update wallet with google login (#1121) * Get blacklisted countries from ipfs (#1122) Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * update wallet with google seed fix (#1124) * Sub history restoration update (#1127) * remove sora parachain xcm fee, update rococo event * wip history restoration * add parachain data for history restoration * show parachain block id instead of extrinsic hash * wip outgoing tx restoration * sub history incoming restoration * unify bridge history actions * refactoring sub history restoration * update wallet 1.19 * update TransactionView external hash placeholder * refactoring sub history * fix decimals in locked balance check (#1128) * Update KycView.vue (#1131) * Fix release 1.19 (#1134) * Update mainnet config * Update zh_CN.json * Improve translations * Update wallet version --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * fix decimals usage (#1136) * Use address book in sub bridge (#1133) * use address book in sub bridge * update wallet & fix BridgeTransaction vie * Fix release 1.20 (#1141) * Fix types & remove brackets for fiat difference * Set 10% as the default error status for fiat difference/price impact * Fix issues with Cyrillic character * Add synths filter --------- Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> * added wallet translations for swap transfer batch extrinsic * Vue 2.7.14 & update packages (#1145) * 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 * fix calculator btn * Pools & Explore pages default sort (#1146) * 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 * explore pages default sort * add pools default sort * add default sort to demeter staking * refactor tokens items * send sora card refresh token (#1140) Co-authored-by: Stefan Popov * Refactoring (#1148) * refactoring * await, fix types * unify payment systems (#1048) * refactor X1 * refactor payment system * resolve imports issues * add eth icon * debug * debug * add connect wallet buttons * debug * remove debug * debug info * improve icons * remove unused icon * add margin * fixes * adjust icons for ads * add translations * adjust pop-ups of ads * add missing translation * add delay * add other langs * update langs * adjust footer * disable x1 * Update env.json * Update env.json * show XST ad with higher probability * add const * update prod env.json * update env.json * show when logged in * make button pressed * Update X1Dialog.vue * add prod creds * improve ads * Update AppAd.vue * improve texts and remove MC icon * Update ethers library to v6 (#1147) * 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 * remove unused variable * ADAR name is const now * updated localize for adar * Update swap subscription (#1150) * 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 * remove unused variable * prepare for subscription update * update wallet 1.21.5 * Fix dev branch issues (#1152) * fix json import (#1153) Co-authored-by: Stefan Popov * bump wallet version and update yarn lock * Swap quote subscription (#1156) * initial changes * update types * update accessors * remove unused imports * add try catch to subscriptions (#1157) * update wallet 1.21.8 (#1158) * allow select node while node is connecting (#1159) * revise & dashboard (#1129) * KYC revise & dashboard * refactor code * remove test data from build * Update env.json * fix appearance bug * do not hide iban * create translations and refactor icons * add translation * notification prework * css refactoring * fix sonarCube issues * add support for kyc count * plural forms * add pools subscription to calc balance * fix fetching * update langs * fix * Update SoraCard.vue * fixes * Update Dashboard.vue * 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> * Delete survey.png --------- Signed-off-by: Nikita Zaporozhets Signed-off-by: BAStos525 Co-authored-by: Nikita Polyakov <53777036+Nikita-Polyakov@users.noreply.github.com> Co-authored-by: Rustem Co-authored-by: Stefan Popov <17688105+stefashkaa@users.noreply.github.com> Co-authored-by: C4tWithShell Co-authored-by: Pavel Varfolomeev Co-authored-by: Pavel Varfolomeev <86880521+wpi86@users.noreply.github.com> Co-authored-by: Dmitriy Creed 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: 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: alexnatalia Co-authored-by: Nikita Polyakov 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: 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: 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: 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> --- Jenkinsfile | 2 +- env.json | 3 +- package.json | 30 +- public/env.json | 5 +- public/marketing.json | 5 - public/marketing/survey.png | Bin 3691 -> 0 bytes src/App.vue | 18 +- src/assets/fonts/polkaswap_icons.ttf | Bin 65424 -> 57652 bytes src/components/App/Footer/AppFooter.vue | 4 +- src/components/App/Footer/FooterPopper.vue | 2 +- src/components/App/Header/AppHeader.vue | 2 +- src/components/App/Header/AppHeaderMenu.vue | 4 +- src/components/App/Header/AppLogoButton.vue | 2 +- src/components/App/Menu/AppMenu.vue | 38 +- src/components/mixins/ChartSpecMixin.ts | 1 - src/components/mixins/ExplorePageMixin.ts | 113 +- src/components/mixins/ScrollableTableMixin.ts | 89 ++ .../mixins/SelectedTokensRouteMixin.ts | 7 +- src/components/mixins/ThemePaletteMixin.ts | 2 +- src/components/pages/Moonpay/Confirmation.vue | 2 +- src/components/pages/Moonpay/Moonpay.vue | 2 +- .../pages/Moonpay/MoonpayHistory.vue | 3 +- src/components/pages/Moonpay/Notification.vue | 2 +- .../pages/OrderBook/BookChartsWidget.vue | 33 + src/components/pages/OrderBook/BookWidget.vue | 598 +++++++++ src/components/pages/OrderBook/BuySell.vue | 1081 +++++++++++++++++ .../pages/OrderBook/Dialogs/CancelOrders.vue | 61 + .../pages/OrderBook/Dialogs/CustomisePage.vue | 18 + .../pages/OrderBook/Dialogs/PlaceOrder.vue | 183 +++ .../pages/OrderBook/HistoryOrderWidget.vue | 309 +++++ .../pages/OrderBook/MarketTradesWidget.vue | 142 +++ .../OrderBook/Popovers/PairListPopover.vue | 301 +++++ .../pages/OrderBook/SetLimitOrderWidget.vue | 114 ++ .../pages/OrderBook/Tables/AllOrders.vue | 53 + .../pages/OrderBook/Tables/OpenOrders.vue | 160 +++ .../pages/OrderBook/Tables/OrderTable.vue | 359 ++++++ .../pages/OrderBook/TransactionDetails.vue | 144 +++ src/components/pages/Rewards/AmountTable.vue | 2 +- .../pages/SoraCard/SoraCardIntroPage.vue | 6 +- .../SoraCard/steps/TermsAndConditions.vue | 2 +- src/components/pages/Stats/BarChart.vue | 1 + src/components/pages/Stats/TvlChart.vue | 1 + src/components/pages/Swap/Chart.vue | 609 ++++++---- src/components/pages/X1/X1History.vue | 2 +- src/components/shared/Button/SortButton.vue | 2 +- src/components/shared/Chart/ChartSkeleton.vue | 2 +- src/components/shared/Input/TokenInput.vue | 83 +- src/components/shared/Logo/Moonpay.vue | 2 +- src/components/shared/Logo/Polkaswap.vue | 2 +- src/components/shared/Logo/Sora.vue | 2 +- src/components/shared/Logo/Web3.vue | 2 +- src/components/shared/Logo/X1ex.vue | 2 +- src/components/shared/PriceChange.vue | 2 +- .../shared/SelectAsset/SelectToken.vue | 2 +- src/components/shared/Skeleton/DataRow.vue | 2 +- src/components/shared/Stats/StatsFilter.vue | 17 +- src/consts/index.ts | 34 +- src/indexer/queries/assetSupply.ts | 11 +- src/indexer/queries/assets.ts | 21 +- src/indexer/queries/networkTvl.ts | 12 +- src/indexer/queries/networkVolume.ts | 12 +- src/indexer/queries/orderBook.ts | 476 ++++++++ src/indexer/queries/pools.ts | 110 ++ src/indexer/queries/price/asset.ts | 133 ++ src/indexer/queries/price/orderBook.ts | 126 ++ src/indexer/queries/stakingNominators.ts | 7 +- src/indexer/queries/stats.ts | 12 +- src/lang/cs.json | 152 ++- src/lang/de.json | 152 ++- src/lang/en.json | 152 ++- src/lang/es.json | 152 ++- src/lang/fr.json | 152 ++- src/lang/hr.json | 152 ++- src/lang/hu.json | 152 ++- src/lang/hy.json | 152 ++- src/lang/id.json | 152 ++- src/lang/it.json | 152 ++- src/lang/messages.ts | 143 ++- src/lang/nl.json | 152 ++- src/lang/no.json | 152 ++- src/lang/pl.json | 152 ++- src/lang/ru.json | 152 ++- src/lang/sk.json | 152 ++- src/lang/sr.json | 152 ++- src/lang/sv.json | 152 ++- src/lang/vi.json | 152 ++- src/lang/yo.json | 152 ++- src/lang/zh_CN.json | 152 ++- .../demeter/components/DialogTitle.vue | 1 - .../sora/components/ClaimRewardsDialog.vue | 22 +- .../sora/components/PendingRewardsDialog.vue | 18 +- .../staking/sora/components/StakeDialog.vue | 16 +- .../sora/components/ValidatorsDialog.vue | 26 +- .../staking/sora/mixins/StakingMixin.ts | 1 - src/modules/staking/sora/views/Overview.vue | 4 +- src/plugins/days-js-duration.ts | 3 + src/plugins/index.ts | 1 + src/plugins/soramitsuUI.ts | 78 +- src/router/index.ts | 10 + src/store/bridge/actions.ts | 2 +- src/store/consts.ts | 1 + src/store/index.ts | 2 + src/store/orderBook/actions.ts | 195 +++ src/store/orderBook/getters.ts | 63 + src/store/orderBook/index.ts | 23 + src/store/orderBook/mutations.ts | 84 ++ src/store/orderBook/state.ts | 34 + src/store/orderBook/types.ts | 29 + src/store/settings/actions.ts | 2 +- src/store/settings/getters.ts | 4 + src/store/settings/mutations.ts | 9 +- src/store/settings/state.ts | 2 + src/store/settings/types.ts | 3 + src/store/staking/actions.ts | 34 +- src/store/swap/mutations.ts | 3 + src/store/types.ts | 15 +- src/styles/_layout.scss | 1 + src/styles/_mixins.scss | 62 +- src/styles/soramitsu-variables.scss | 64 +- src/types/chart.ts | 8 + src/types/orderBook.ts | 47 + src/types/tabs.ts | 5 + src/utils/bridge/eth/utils.ts | 8 +- src/utils/bridge/sub/classes/adapter.ts | 9 +- src/utils/bridge/sub/classes/history.ts | 6 +- src/utils/index.ts | 9 + src/utils/orderBook.ts | 9 + src/views/About.vue | 2 +- src/views/Bridge.vue | 8 +- src/views/BridgeTransactionsHistory.vue | 1 + src/views/Explore/Books.vue | 234 ++++ src/views/Explore/Container.vue | 22 +- src/views/Explore/Demeter.vue | 13 +- src/views/Explore/Pools.vue | 133 +- src/views/Explore/Tokens.vue | 36 +- src/views/FiatDepositOptions.vue | 4 +- src/views/OrderBook.vue | 302 +++++ src/views/Rewards.vue | 2 +- src/views/SoraCard.vue | 2 +- src/views/Swap.vue | 15 +- tests/mocks/tokens.ts | 3 + .../App/Header/AccountButton.spec.ts | 2 +- tests/utils/index.ts | 2 +- yarn.lock | 127 +- 144 files changed, 9674 insertions(+), 919 deletions(-) delete mode 100644 public/marketing/survey.png create mode 100644 src/components/mixins/ScrollableTableMixin.ts create mode 100644 src/components/pages/OrderBook/BookChartsWidget.vue create mode 100644 src/components/pages/OrderBook/BookWidget.vue create mode 100644 src/components/pages/OrderBook/BuySell.vue create mode 100644 src/components/pages/OrderBook/Dialogs/CancelOrders.vue create mode 100644 src/components/pages/OrderBook/Dialogs/CustomisePage.vue create mode 100644 src/components/pages/OrderBook/Dialogs/PlaceOrder.vue create mode 100644 src/components/pages/OrderBook/HistoryOrderWidget.vue create mode 100644 src/components/pages/OrderBook/MarketTradesWidget.vue create mode 100644 src/components/pages/OrderBook/Popovers/PairListPopover.vue create mode 100644 src/components/pages/OrderBook/SetLimitOrderWidget.vue create mode 100644 src/components/pages/OrderBook/Tables/AllOrders.vue create mode 100644 src/components/pages/OrderBook/Tables/OpenOrders.vue create mode 100644 src/components/pages/OrderBook/Tables/OrderTable.vue create mode 100644 src/components/pages/OrderBook/TransactionDetails.vue create mode 100644 src/indexer/queries/orderBook.ts create mode 100644 src/indexer/queries/pools.ts create mode 100644 src/indexer/queries/price/asset.ts create mode 100644 src/indexer/queries/price/orderBook.ts create mode 100644 src/plugins/days-js-duration.ts create mode 100644 src/store/orderBook/actions.ts create mode 100644 src/store/orderBook/getters.ts create mode 100644 src/store/orderBook/index.ts create mode 100644 src/store/orderBook/mutations.ts create mode 100644 src/store/orderBook/state.ts create mode 100644 src/store/orderBook/types.ts create mode 100644 src/types/chart.ts create mode 100644 src/types/orderBook.ts create mode 100644 src/utils/orderBook.ts create mode 100644 src/views/Explore/Books.vue create mode 100644 src/views/OrderBook.vue diff --git a/Jenkinsfile b/Jenkinsfile index 1e42ffb4f..da3bdcfe7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,7 +34,7 @@ def pipeline = new org.js.AppPipeline(steps: this, noIndex: true, sonarSrcPath: 'src', sonarTestsPath: 'tests', - dojoProductType: 'sora', + dojoProductType: 'polkaswap', movingFiles: [ "*":"./", ".well-known/":"./"] ) pipeline.runPipeline() diff --git a/env.json b/env.json index 82b24c258..df6b2593e 100644 --- a/env.json +++ b/env.json @@ -12,7 +12,8 @@ "moonpay": true, "x1ex": false, "charts": true, - "soraCard": false + "soraCard": false, + "orderBook": false }, "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod-sub4", "SUBSQUID_ENDPOINT": "", diff --git a/package.json b/package.json index 6f69df475..01070ec9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polkaswap-exchange-web", - "version": "1.28.3", + "version": "1.29.0", "repository": { "type": "git", "url": "https://github.com/sora-xor/polkaswap-exchange-web.git" @@ -24,14 +24,14 @@ }, "dependencies": { "@metamask/detect-provider": "^2.0.0", - "@soramitsu/soraneo-wallet-web": "1.28.0", + "@soramitsu/soraneo-wallet-web": "1.29.4", "@walletconnect/ethereum-provider": "^2.11.0", "@walletconnect/modal": "^2.6.2", "core-js": "^3.33.2", "country-code-emoji": "^2.3.0", "country-flag-emoji-polyfill": "^0.1.4", "direct-vuex": "^0.12.1", - "echarts": "^5.4.1", + "echarts": "^5.4.3", "email-validator": "^2.0.4", "ethers": "6.8.0", "jwt-decode": "^3.1.2", @@ -40,10 +40,10 @@ "vue": "2.7.14", "vue-class-component": "^7.2.6", "vue-echarts": "^6.3.3", - "vue-i18n": "^8.11.2", + "vue-i18n": "^8.28.2", "vue-property-decorator": "^9.1.2", "vue-router": "^3.6.5", - "vuex": "^3.1.3" + "vuex": "^3.6.2" }, "devDependencies": { "@babel/runtime": "^7.23.2", @@ -65,29 +65,29 @@ "@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-standard": "^6.1.0", "@vue/eslint-config-typescript": "^8.0.0", - "@vue/test-utils": "^1.2.2", - "@vue/vue2-jest": "^27.0.0-alpha.2", + "@vue/test-utils": "^1.3.6", + "@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-devtools-installer": "^3.1.0", - "eslint": "^7.29.0", + "electron-devtools-installer": "^3.2.0", + "eslint": "^7.32.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-promise": "^5.2.0", "eslint-plugin-standard": "^5.0.0", "eslint-plugin-vue": "^7.20.0", - "jest": "^27.2.2", - "jsdom": "^16.6.0", + "jest": "^27.5.1", + "jsdom": "^16.7.0", "lint-staged": "^9.5.0", "node-polyfill-webpack-plugin": "^2.0.1", - "prettier": "^2.2.1", + "prettier": "^2.8.8", "sass": "^1.66.1", "sass-loader": "^13.3.2", - "ts-jest": "^27.0.5", + "ts-jest": "^27.1.5", "typescript": "~5.2.2", - "vue-cli-plugin-electron-builder": "^3.0.0-alpha.3", + "vue-cli-plugin-electron-builder": "^3.0.0-alpha.4", "vue-cli-plugin-test-attrs": "^0.1.5", "vue-template-compiler": "2.7.14" }, diff --git a/public/env.json b/public/env.json index c5029c8dc..7386257fd 100644 --- a/public/env.json +++ b/public/env.json @@ -12,7 +12,8 @@ "moonpay": true, "x1ex": false, "charts": true, - "soraCard": true + "soraCard": false, + "orderBook": true }, "FAUCET_URL": "https://faucet.dev.sora2.tachi.soramitsu.co.jp/", "DEFAULT_NETWORKS": [ @@ -34,7 +35,7 @@ "address": "wss://ws.framenode-3.r0.dev.sora2.soramitsu.co.jp" } ], - "SUBQUERY_ENDPOINT": "https://subquery.sq1.dev.sora2.soramitsu.co.jp", + "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-dev", "SUBSQUID_ENDPOINT": "https://squid.subsquid.io/sora-dev/v/v1/graphql", "NETWORK_TYPE": "Dev", "CHAIN_GENESIS_HASH": "", diff --git a/public/marketing.json b/public/marketing.json index 96351c738..95504f8fa 100644 --- a/public/marketing.json +++ b/public/marketing.json @@ -1,9 +1,4 @@ [ - { - "title": "ROADMAP 2024 SURVEY", - "img": "/marketing/survey.png", - "link": "https://form.typeform.com/to/Mb6p2Kpy" - }, { "title": "GET SORA CARD", "img": "/marketing/card.png", diff --git a/public/marketing/survey.png b/public/marketing/survey.png deleted file mode 100644 index 1c3784620c7fc488701000a50219ab0834410900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3691 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 JPDHLkV1niSQd|H4 diff --git a/src/App.vue b/src/App.vue index a9e1dcfc9..493844371 100644 --- a/src/App.vue +++ b/src/App.vue @@ -66,8 +66,8 @@ import type { ConnectToNodeOptions, Node } from './types/nodes'; import type { History, HistoryItem } from '@sora-substrate/util'; import type { WhitelistArrayItem } from '@sora-substrate/util/build/assets/types'; import type { EvmNetwork } from '@sora-substrate/util/build/bridgeProxy/evm/types'; -import type DesignSystem from '@soramitsu/soramitsu-js-ui/lib/types/DesignSystem'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type DesignSystem from '@soramitsu-ui/ui-vue2/lib/types/DesignSystem'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component({ components: { @@ -392,6 +392,8 @@ html { font-size: var(--s-font-size-small); line-height: var(--s-line-height-base); letter-spacing: var(--s-letter-spacing-small); + background-color: var(--s-color-utility-body); + scrollbar-color: transparent transparent; } ul ul { @@ -550,6 +552,18 @@ i.icon-divider { @include icon-styles; } +.app-main--orderbook { + .app-menu { + position: absolute; + right: initial; + } + + .app-content { + display: flex; + justify-content: center; + } +} + @include desktop { .app-main { &.app-main--swap.app-main--has-charts { diff --git a/src/assets/fonts/polkaswap_icons.ttf b/src/assets/fonts/polkaswap_icons.ttf index 59aa1dc04ecd191e26d377c34661279ea1b2466b..fe862b8c11a34254440b7a51d987418805740470 100644 GIT binary patch literal 57652 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 QquC{Ky}i^@SzhqJ0j5=)T>t<8 diff --git a/src/components/App/Footer/AppFooter.vue b/src/components/App/Footer/AppFooter.vue index ed1af754d..6f916ece8 100644 --- a/src/components/App/Footer/AppFooter.vue +++ b/src/components/App/Footer/AppFooter.vue @@ -65,8 +65,8 @@ @@ -204,6 +211,10 @@ export default class AppMenu extends Mixins(TranslationMixin) { } } + .collapse-button { + pointer-events: none; + } + &:hover, &:focus { box-shadow: 20px 20px 60px 0px #0000001a; @@ -213,6 +224,10 @@ export default class AppMenu extends Mixins(TranslationMixin) { display: initial; } } + + .collapse-button { + pointer-events: all; + } } } } @@ -286,9 +301,6 @@ export default class AppMenu extends Mixins(TranslationMixin) { &:focus { background-color: unset !important; } - i.el-icon-bank-card { - width: 28px; // to avoid issue with paddings - } } } @@ -346,6 +358,7 @@ export default class AppMenu extends Mixins(TranslationMixin) { @include large-mobile(true) { position: fixed; + right: 0; &.visible { visibility: visible; @@ -368,10 +381,6 @@ export default class AppMenu extends Mixins(TranslationMixin) { } } - @include large-mobile(true) { - right: 0; - } - @include large-mobile { visibility: visible; position: relative; @@ -409,6 +418,8 @@ export default class AppMenu extends Mixins(TranslationMixin) { flex: 1; flex-flow: column nowrap; justify-content: space-between; + max-width: $sidebar-max-width; + padding-right: $inner-spacing-mini; // for shadow } } } @@ -480,4 +491,3 @@ export default class AppMenu extends Mixins(TranslationMixin) { } } -@/modules/staking/demeter/consts diff --git a/src/components/mixins/ChartSpecMixin.ts b/src/components/mixins/ChartSpecMixin.ts index a673a0af0..7c9121aa8 100644 --- a/src/components/mixins/ChartSpecMixin.ts +++ b/src/components/mixins/ChartSpecMixin.ts @@ -18,7 +18,6 @@ const AXIS_LABEL_CSS = { export default class ChartSpecMixin extends Mixins(ThemePaletteMixin, TranslationMixin) { gridSpec(options: any = {}) { return merge({ - top: 20, left: 0, right: 0, bottom: 20 + AXIS_OFFSET, diff --git a/src/components/mixins/ExplorePageMixin.ts b/src/components/mixins/ExplorePageMixin.ts index 3ade24223..236874e65 100644 --- a/src/components/mixins/ExplorePageMixin.ts +++ b/src/components/mixins/ExplorePageMixin.ts @@ -1,23 +1,16 @@ -import SScrollbar from '@soramitsu/soramitsu-js-ui/lib/components/Scrollbar'; -import { SortDirection } from '@soramitsu/soramitsu-js-ui/lib/components/Table/consts'; -import { mixins, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; -import Vue from 'vue'; -import { Component, Mixins, Prop, Ref, Watch } from 'vue-property-decorator'; +import { KnownAssets } from '@sora-substrate/util/build/assets/consts'; +import { SortDirection } from '@soramitsu-ui/ui-vue2/lib/components/Table/consts'; +import { Component, Mixins, Prop, Watch } from 'vue-property-decorator'; import { getter } from '@/store/decorators'; -import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types'; +import ScrollableTableMixin from './ScrollableTableMixin'; +import TranslationMixin from './TranslationMixin'; + +import type { Asset, RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types'; @Component -export default class ExplorePageMixin extends Mixins( - mixins.LoadingMixin, - mixins.PaginationSearchMixin, - mixins.FormattedAmountMixin -) { - readonly FontSizeRate = WALLET_CONSTS.FontSizeRate; - readonly FontWeightRate = WALLET_CONSTS.FontWeightRate; - - @Ref('table') readonly tableComponent!: any; +export default class ExplorePageMixin extends Mixins(ScrollableTableMixin, TranslationMixin) { @Prop({ default: '', type: String }) readonly exploreQuery!: string; @Prop({ default: false, type: Boolean }) readonly isAccountItemsOnly!: boolean; @Watch('exploreQuery') @@ -25,16 +18,25 @@ export default class ExplorePageMixin extends Mixins( this.currentPage = 1; } - @getter.wallet.account.isLoggedIn isLoggedIn!: boolean; + @getter.wallet.account.isLoggedIn public isLoggedIn!: boolean; @getter.assets.assetDataByAddress public getAsset!: (addr?: string) => Nullable; + @getter.assets.whitelistAssets public whitelistAssets!: Array; - order = ''; - property = ''; + order = SortDirection.DESC; + property = 'tvl'; get loadingState(): boolean { return this.parentLoading || this.loading; } + get allowedAssets(): Array { + // if whitelist is not available, use KnownAssets + if (!this.whitelistAssets.length) { + return [...KnownAssets]; + } + return this.whitelistAssets; + } + get pricesAvailable(): boolean { return Object.keys(this.fiatPriceObject).length > 0; } @@ -43,26 +45,23 @@ export default class ExplorePageMixin extends Mixins( return !(this.order && this.property); } - get preparedItems(): any[] { - console.warn('[ExplorePageMixin]: "preparedItems" computed property is not implemented'); + // items -> prefilteredItems -> filteredItems -> preparedItems + get prefilteredItems(): any[] { + console.warn('[ExplorePageMixin]: "prefilteredItems" computed property is not implemented'); return []; } - get total(): number { - return this.filteredItems.length; - } - get filteredItems() { const search = this.exploreQuery.toLowerCase().trim(); - if (!search) return this.preparedItems; + if (!search) return this.prefilteredItems; const filterAsset = (asset): boolean => asset?.name?.toLowerCase?.()?.includes?.(search) || asset?.symbol?.toLowerCase?.()?.includes?.(search) || asset?.address?.toLowerCase?.() === search; - return this.preparedItems.filter( + return this.prefilteredItems.filter( (item: any) => filterAsset(item) || filterAsset(item.poolAsset) || @@ -72,7 +71,7 @@ export default class ExplorePageMixin extends Mixins( ); } - get sortedItems() { + get preparedItems() { if (this.isDefaultSort) return this.filteredItems; const isAscending = this.order === SortDirection.ASC; @@ -87,19 +86,11 @@ export default class ExplorePageMixin extends Mixins( }); } - get tableItems() { - return this.getPageItems(this.sortedItems); - } - async mounted(): Promise { - await this.$nextTick(); - - this.initScrollbar(); - await this.updateExploreData(); } - changeSort({ order = '', property = '' } = {}): void { + changeSort({ order = SortDirection.DESC, property = '' } = {}): void { this.order = order; this.property = property; } @@ -111,54 +102,4 @@ export default class ExplorePageMixin extends Mixins( async updateExploreData(): Promise { console.warn('[ExplorePageMixin]: "updateExploreData" method is not implemented'); } - - 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.First: - current = 1; - break; - case WALLET_CONSTS.PaginationButton.Last: - current = this.lastPage; - } - - this.currentPage = current; - } - - private initScrollbar(): void { - if (!this.tableComponent) return; - - const Scrollbar = Vue.extend(SScrollbar); - const scrollbar = new Scrollbar(); - scrollbar.$mount(); - - const elTable = this.tableComponent.$refs.table; - const elTableBodyWrapper = elTable.$refs.bodyWrapper; - const elTableHeaderWrapper = elTable.$refs.headerWrapper; - const elTableNativeTable = elTableBodyWrapper.getElementsByTagName('table')[0]; - const scrollbarWrap = scrollbar.$el.getElementsByClassName('el-scrollbar__wrap')[0]; - const scrollbarView = scrollbar.$el.getElementsByClassName('el-scrollbar__view')[0]; - - elTableBodyWrapper.appendChild(scrollbar.$el); - scrollbarView.appendChild(elTableNativeTable); - - this.$watch( - () => (scrollbar.$children[0] as any).moveX, - () => { - const scrollLeft = scrollbarWrap.scrollLeft; - // to scroll table content - elTableBodyWrapper.scrollLeft = scrollLeft; - elTableHeaderWrapper.scrollLeft = scrollLeft; - // to render box shadow on fixed table - elTable.scrollPosition = scrollLeft === 0 ? 'left' : 'right'; - } - ); - } } diff --git a/src/components/mixins/ScrollableTableMixin.ts b/src/components/mixins/ScrollableTableMixin.ts new file mode 100644 index 000000000..8ca6e6aee --- /dev/null +++ b/src/components/mixins/ScrollableTableMixin.ts @@ -0,0 +1,89 @@ +import { mixins, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; +import SScrollbar from '@soramitsu-ui/ui-vue2/lib/components/Scrollbar'; +import Vue from 'vue'; +import { Component, Mixins, Ref } from 'vue-property-decorator'; + +@Component +export default class ScrollableTableMixin extends Mixins( + mixins.LoadingMixin, + mixins.PaginationSearchMixin, + mixins.FormattedAmountMixin +) { + readonly FontSizeRate = WALLET_CONSTS.FontSizeRate; + readonly FontWeightRate = WALLET_CONSTS.FontWeightRate; + + @Ref('table') readonly tableComponent!: any; + + get loadingState(): boolean { + return this.parentLoading || this.loading; + } + + // should be already filtered & sorted + get preparedItems(): any[] { + console.warn('[ScrollableTableMixin]: "preparedItems" computed property is not implemented'); + return []; + } + + get total(): number { + return this.preparedItems.length; + } + + get tableItems() { + return this.getPageItems(this.preparedItems); + } + + async mounted(): Promise { + await this.$nextTick(); + this.initScrollbar(); + } + + public handlePaginationClick(button: WALLET_CONSTS.PaginationButton): void { + let current = 1; // First by default (instead of case WALLET_CONSTS.PaginationButton.First) + + 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; + } + + public initScrollbar(): void { + if (!this.tableComponent) return; + + const Scrollbar = Vue.extend(SScrollbar); + const scrollbar = new Scrollbar(); + scrollbar.$mount(); + + const elTable = this.tableComponent.$refs.table; + const elTableBodyWrapper = elTable.$refs.bodyWrapper; + const elTableHeaderWrapper = elTable.$refs.headerWrapper; + const elTableNativeTable = elTableBodyWrapper.getElementsByTagName('table')[0]; + const scrollbarContainer = scrollbar.$el; + const scrollbarWrap = scrollbar.$el.getElementsByClassName('el-scrollbar__wrap')[0]; + const scrollbarView = scrollbar.$el.getElementsByClassName('el-scrollbar__view')[0]; + + scrollbarContainer.classList.add('scrollable-table'); + elTableBodyWrapper.appendChild(scrollbar.$el); + scrollbarView.appendChild(elTableNativeTable); + + this.$watch( + () => (scrollbar.$children[0] as any).moveX, + () => { + const scrollLeft = scrollbarWrap.scrollLeft; + // to scroll table content + elTableBodyWrapper.scrollLeft = scrollLeft; + elTableHeaderWrapper.scrollLeft = scrollLeft; + // to render box shadow on fixed table + elTable.scrollPosition = scrollLeft === 0 ? 'left' : 'right'; + } + ); + } +} diff --git a/src/components/mixins/SelectedTokensRouteMixin.ts b/src/components/mixins/SelectedTokensRouteMixin.ts index 93c9b9bca..fd6fee74e 100644 --- a/src/components/mixins/SelectedTokensRouteMixin.ts +++ b/src/components/mixins/SelectedTokensRouteMixin.ts @@ -36,6 +36,10 @@ export default class SelectedTokenRouteMixin extends Vue { const bothArePresented = !!(firstAddress && secondAddress); switch (this.$route.name) { + case PageNames.OrderBook: + // Second asset address should be used as quote for Orderbook /trade/base/quote + // only XOR for now, like /trade/xst/xor + return bothArePresented && secondAddress === XOR.address; case PageNames.RemoveLiquidity: return bothArePresented && api.dex.baseAssetsIds.includes(firstAddress); case PageNames.AddLiquidity: { @@ -75,6 +79,7 @@ export default class SelectedTokenRouteMixin extends Vue { * (b) `false` - when assets are equal; * (c) SWAP: `true` when both parameters are parsed as asset ids; * (d) ADD/REMOVE LIQUIDITY: `true` when both parameters are parsed as asset ids and first is from baseAssetIds; + * (e) ORDERBOOK: `true` is second === correct quote asset */ get isValidRoute(): boolean { const { first, second } = this.$route.params; @@ -84,7 +89,7 @@ export default class SelectedTokenRouteMixin extends Vue { } /** - * Sould be used in Add liquidity & Swap during mount + * Should be used in Add liquidity & Swap during mount * * Returns is valid state for routing life cycle */ diff --git a/src/components/mixins/ThemePaletteMixin.ts b/src/components/mixins/ThemePaletteMixin.ts index 312b69b2d..58ca87f39 100644 --- a/src/components/mixins/ThemePaletteMixin.ts +++ b/src/components/mixins/ThemePaletteMixin.ts @@ -3,7 +3,7 @@ import { Component, Vue } from 'vue-property-decorator'; import { getter } from '@/store/decorators'; import { getCssVariableValue as css } from '@/utils'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component export default class ThemePaletteMixin extends Vue { diff --git a/src/components/pages/Moonpay/Confirmation.vue b/src/components/pages/Moonpay/Confirmation.vue index 917948bdb..d3d90e9d5 100644 --- a/src/components/pages/Moonpay/Confirmation.vue +++ b/src/components/pages/Moonpay/Confirmation.vue @@ -33,7 +33,7 @@ import { lazyComponent } from '@/router'; import { getter, state } from '@/store/decorators'; import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component({ components: { diff --git a/src/components/pages/Moonpay/Moonpay.vue b/src/components/pages/Moonpay/Moonpay.vue index b8d3baca0..cf30b63e5 100644 --- a/src/components/pages/Moonpay/Moonpay.vue +++ b/src/components/pages/Moonpay/Moonpay.vue @@ -21,8 +21,8 @@ import type { MoonpayTransaction } from '@/utils/moonpay'; import MoonpayBridgeInitMixin from './BridgeInitMixin'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; import type { WALLET_TYPES } from '@soramitsu/soraneo-wallet-web'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component({ components: { diff --git a/src/components/pages/Moonpay/MoonpayHistory.vue b/src/components/pages/Moonpay/MoonpayHistory.vue index 884f87094..e4b52ebeb 100644 --- a/src/components/pages/Moonpay/MoonpayHistory.vue +++ b/src/components/pages/Moonpay/MoonpayHistory.vue @@ -85,7 +85,7 @@ import { MoonpayTransactionStatus } from '../../../utils/moonpay'; import type { MoonpayTransaction, MoonpayCurrency, MoonpayCurrenciesById } from '../../../utils/moonpay'; import type { EthHistory } from '@sora-substrate/util/build/bridgeProxy/eth/types'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; const HistoryView = 'history'; const DetailsView = 'details'; @@ -242,6 +242,7 @@ export default class MoonpayHistory extends Mixins(mixins.PaginationSearchMixin, case WALLET_CONSTS.PaginationButton.Last: current = this.lastPage; this.isLtrDirection = false; + break; } this.currentPage = current; diff --git a/src/components/pages/Moonpay/Notification.vue b/src/components/pages/Moonpay/Notification.vue index 9626861e7..a6251a7d6 100644 --- a/src/components/pages/Moonpay/Notification.vue +++ b/src/components/pages/Moonpay/Notification.vue @@ -20,7 +20,7 @@ import { mutation, state, getter } from '@/store/decorators'; import { MoonpayNotifications } from './consts'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component({ components: { diff --git a/src/components/pages/OrderBook/BookChartsWidget.vue b/src/components/pages/OrderBook/BookChartsWidget.vue new file mode 100644 index 000000000..bc801f017 --- /dev/null +++ b/src/components/pages/OrderBook/BookChartsWidget.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/components/pages/OrderBook/BookWidget.vue b/src/components/pages/OrderBook/BookWidget.vue new file mode 100644 index 000000000..9a193bdec --- /dev/null +++ b/src/components/pages/OrderBook/BookWidget.vue @@ -0,0 +1,598 @@ + + + + + diff --git a/src/components/pages/OrderBook/BuySell.vue b/src/components/pages/OrderBook/BuySell.vue new file mode 100644 index 000000000..a38617190 --- /dev/null +++ b/src/components/pages/OrderBook/BuySell.vue @@ -0,0 +1,1081 @@ + + + + + + + diff --git a/src/components/pages/OrderBook/Dialogs/CancelOrders.vue b/src/components/pages/OrderBook/Dialogs/CancelOrders.vue new file mode 100644 index 000000000..3e1f3f4cf --- /dev/null +++ b/src/components/pages/OrderBook/Dialogs/CancelOrders.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/pages/OrderBook/Dialogs/CustomisePage.vue b/src/components/pages/OrderBook/Dialogs/CustomisePage.vue new file mode 100644 index 000000000..fe5c23e29 --- /dev/null +++ b/src/components/pages/OrderBook/Dialogs/CustomisePage.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/pages/OrderBook/Dialogs/PlaceOrder.vue b/src/components/pages/OrderBook/Dialogs/PlaceOrder.vue new file mode 100644 index 000000000..31881280f --- /dev/null +++ b/src/components/pages/OrderBook/Dialogs/PlaceOrder.vue @@ -0,0 +1,183 @@ + + + + + + + diff --git a/src/components/pages/OrderBook/HistoryOrderWidget.vue b/src/components/pages/OrderBook/HistoryOrderWidget.vue new file mode 100644 index 000000000..93e12641e --- /dev/null +++ b/src/components/pages/OrderBook/HistoryOrderWidget.vue @@ -0,0 +1,309 @@ + + + + + + + diff --git a/src/components/pages/OrderBook/MarketTradesWidget.vue b/src/components/pages/OrderBook/MarketTradesWidget.vue new file mode 100644 index 000000000..6fa6688ba --- /dev/null +++ b/src/components/pages/OrderBook/MarketTradesWidget.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/components/pages/OrderBook/Popovers/PairListPopover.vue b/src/components/pages/OrderBook/Popovers/PairListPopover.vue new file mode 100644 index 000000000..3da34aa19 --- /dev/null +++ b/src/components/pages/OrderBook/Popovers/PairListPopover.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/src/components/pages/OrderBook/SetLimitOrderWidget.vue b/src/components/pages/OrderBook/SetLimitOrderWidget.vue new file mode 100644 index 000000000..77908995f --- /dev/null +++ b/src/components/pages/OrderBook/SetLimitOrderWidget.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/components/pages/OrderBook/Tables/AllOrders.vue b/src/components/pages/OrderBook/Tables/AllOrders.vue new file mode 100644 index 000000000..a53ea6f22 --- /dev/null +++ b/src/components/pages/OrderBook/Tables/AllOrders.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/components/pages/OrderBook/Tables/OpenOrders.vue b/src/components/pages/OrderBook/Tables/OpenOrders.vue new file mode 100644 index 000000000..f6690fadb --- /dev/null +++ b/src/components/pages/OrderBook/Tables/OpenOrders.vue @@ -0,0 +1,160 @@ + + + diff --git a/src/components/pages/OrderBook/Tables/OrderTable.vue b/src/components/pages/OrderBook/Tables/OrderTable.vue new file mode 100644 index 000000000..813f6b685 --- /dev/null +++ b/src/components/pages/OrderBook/Tables/OrderTable.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/src/components/pages/OrderBook/TransactionDetails.vue b/src/components/pages/OrderBook/TransactionDetails.vue new file mode 100644 index 000000000..0419fc28e --- /dev/null +++ b/src/components/pages/OrderBook/TransactionDetails.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/components/pages/Rewards/AmountTable.vue b/src/components/pages/Rewards/AmountTable.vue index 57bce3c9a..30c7288b4 100644 --- a/src/components/pages/Rewards/AmountTable.vue +++ b/src/components/pages/Rewards/AmountTable.vue @@ -78,8 +78,8 @@ @@ -285,6 +333,39 @@ $el-input-class: '.el-input'; } } } + +.input-line--footer-with-slider { + @include input-slider; + width: 100%; + + .el-slider__button { + background-color: #fff; + border-radius: 4px; + transform: rotate(-45deg); + } + + .el-slider__stop { + height: 10px; + width: 10px; + border-radius: 2px; + top: -1.8px; + border: 1.3px solid var(--s-color-base-content-tertiary); + transform: translateX(-50%) rotate(-45deg); + } + + .asset-info { + display: flex; + width: 100%; + justify-content: space-between; + } + + .delimiter { + background-color: var(--s-color-base-border-secondary); + width: 100%; + height: 1px; + margin: 14px 0 4px 0; + } +} -@/modules/staking/demeter/types diff --git a/src/modules/staking/sora/components/ClaimRewardsDialog.vue b/src/modules/staking/sora/components/ClaimRewardsDialog.vue index 32754aaae..82dbea23c 100644 --- a/src/modules/staking/sora/components/ClaimRewardsDialog.vue +++ b/src/modules/staking/sora/components/ClaimRewardsDialog.vue @@ -38,7 +38,7 @@ @@ -82,7 +82,7 @@ import type { CodecString } from '@sora-substrate/util'; FormattedAmountWithFiatValue: components.FormattedAmountWithFiatValue, }, }) -export default class ClaimRewardsDialog extends Mixins(StakingMixin, mixins.DialogMixin, mixins.LoadingMixin) { +export default class ClaimRewardsDialog extends Mixins(StakingMixin, mixins.DialogMixin, mixins.TransactionMixin) { @Prop({ default: () => true, type: Boolean }) readonly isAdding!: boolean; rewardsDestination = ''; @@ -167,16 +167,18 @@ export default class ClaimRewardsDialog extends Mixins(StakingMixin, mixins.Dial } async handleConfirm(): Promise { - await this.payout({ - payouts: this.pendingRewards - ? this.pendingRewards.map((r) => ({ era: r.era, validators: r.validators.map((v) => v.address) })) - : [], - payee: this.rewardsDestination !== this.payeeAddress ? this.rewardsDestination : undefined, - }); + await this.withNotifications(async () => { + await this.payout({ + payouts: this.pendingRewards + ? this.pendingRewards.map((r) => ({ era: r.era, validators: r.validators.map((v) => v.address) })) + : [], + payee: this.rewardsDestination !== this.payeeAddress ? this.rewardsDestination : undefined, + }); - await this.getPendingRewards(); + await this.getPendingRewards(); - this.closeDialog(); + this.closeDialog(); + }); } checkPendingRewards(): void { diff --git a/src/modules/staking/sora/components/PendingRewardsDialog.vue b/src/modules/staking/sora/components/PendingRewardsDialog.vue index c7c575f1a..a1f968923 100644 --- a/src/modules/staking/sora/components/PendingRewardsDialog.vue +++ b/src/modules/staking/sora/components/PendingRewardsDialog.vue @@ -69,7 +69,7 @@ @@ -129,8 +129,8 @@ type Reward = { export default class PendingRewardsDialog extends Mixins( StakingMixin, ValidatorsMixin, - mixins.DialogMixin, - mixins.LoadingMixin + mixins.TransactionMixin, + mixins.DialogMixin ) { payoutNetworkFee: string | null = null; selectedRewards: Reward[] = []; @@ -235,13 +235,15 @@ export default class PendingRewardsDialog extends Mixins( } async handleConfirm(): Promise { - await this.payout({ - payouts: this.payouts, - }); + await this.withNotifications(async () => { + await this.payout({ + payouts: this.payouts, + }); - await this.getPendingRewards(); + await this.getPendingRewards(); - this.closeDialog(); + this.closeDialog(); + }); } } diff --git a/src/modules/staking/sora/components/StakeDialog.vue b/src/modules/staking/sora/components/StakeDialog.vue index ff567168f..941aafcea 100644 --- a/src/modules/staking/sora/components/StakeDialog.vue +++ b/src/modules/staking/sora/components/StakeDialog.vue @@ -43,7 +43,7 @@ @@ -68,7 +68,6 @@ import { Component, Mixins, Watch, Prop } from 'vue-property-decorator'; import { Components } from '@/consts'; import { lazyComponent } from '@/router'; -import { state } from '@/store/decorators'; import { StakeDialogMode } from '../consts'; import StakingMixin from '../mixins/StakingMixin'; @@ -83,11 +82,9 @@ import type { CodecString } from '@sora-substrate/util'; AccountCard: components.AccountCard, }, }) -export default class StakeDialog extends Mixins(StakingMixin, mixins.DialogMixin, mixins.LoadingMixin) { +export default class StakeDialog extends Mixins(StakingMixin, mixins.TransactionMixin, mixins.DialogMixin) { @Prop({ required: true, type: String }) readonly mode!: StakeDialogMode; - @state.wallet.settings.shouldBalanceBeHidden private shouldBalanceBeHidden!: boolean; - @Watch('visible') private resetValue() { if (this.visible) { @@ -202,13 +199,14 @@ export default class StakeDialog extends Mixins(StakingMixin, mixins.DialogMixin async handleConfirm(): Promise { this.setStakeAmount(this.value); + let extrinsic = this.unbond; if (this.mode === StakeDialogMode.NEW) { - await this.bondAndNominate(); + extrinsic = this.bondAndNominate; } else if (this.mode === StakeDialogMode.ADD) { - await this.bondExtra(); - } else { - await this.unbond(); + extrinsic = this.bondExtra; } + + await this.withNotifications(async () => await extrinsic()); this.$emit('confirm'); } } diff --git a/src/modules/staking/sora/components/ValidatorsDialog.vue b/src/modules/staking/sora/components/ValidatorsDialog.vue index 961de5f84..63474bb07 100644 --- a/src/modules/staking/sora/components/ValidatorsDialog.vue +++ b/src/modules/staking/sora/components/ValidatorsDialog.vue @@ -9,7 +9,13 @@
- + {{ confirmText }}
@@ -49,7 +55,7 @@ import type { MyStakingInfo } from '@sora-substrate/util/build/staking/types'; InfoLine: components.InfoLine, }, }) -export default class ValidatorsDialog extends Mixins(StakingMixin, mixins.DialogMixin, mixins.LoadingMixin) { +export default class ValidatorsDialog extends Mixins(StakingMixin, mixins.DialogMixin, mixins.TransactionMixin) { @mutation.staking.setStakingInfo setStakingInfo!: (stakingInfo: MyStakingInfo) => void; @action.staking.getStakingInfo getStakingInfo!: AsyncFnWithoutArgs; @@ -164,16 +170,18 @@ export default class ValidatorsDialog extends Mixins(StakingMixin, mixins.Dialog if (this.mode === ValidatorsListMode.USER) { this.isSelectingEditingMode = true; } else { - await this.nominate(); + await this.withNotifications(async () => { + await this.nominate(); - if (!this.stakingInfo) throw new Error('There is no staking info'); + if (!this.stakingInfo) throw new Error('There is no staking info'); - this.setStakingInfo({ - ...this.stakingInfo, - myValidators: this.selectedValidators.map((v) => v.address), - }); + this.setStakingInfo({ + ...this.stakingInfo, + myValidators: this.selectedValidators.map((v) => v.address), + }); - this.mode = ValidatorsListMode.USER; + this.mode = ValidatorsListMode.USER; + }); } } diff --git a/src/modules/staking/sora/mixins/StakingMixin.ts b/src/modules/staking/sora/mixins/StakingMixin.ts index 97814bd87..89475c38b 100644 --- a/src/modules/staking/sora/mixins/StakingMixin.ts +++ b/src/modules/staking/sora/mixins/StakingMixin.ts @@ -53,7 +53,6 @@ export default class StakingMixin extends Mixins(mixins.FormattedAmountMixin, Tr @mutation.staking.setShowValidatorsFilterDialog setShowValidatorsFilterDialog!: (value: boolean) => void; @mutation.staking.selectValidators selectValidators!: (validators: ValidatorInfoFull[]) => void; - @action.staking.bond bond!: AsyncFnWithoutArgs; @action.staking.nominate nominate!: AsyncFnWithoutArgs; @action.staking.bondAndNominate bondAndNominate!: AsyncFnWithoutArgs; @action.staking.getBondAndNominateNetworkFee getBondAndNominateNetworkFee!: () => Promise; diff --git a/src/modules/staking/sora/views/Overview.vue b/src/modules/staking/sora/views/Overview.vue index f9c80c5be..021637186 100644 --- a/src/modules/staking/sora/views/Overview.vue +++ b/src/modules/staking/sora/views/Overview.vue @@ -97,7 +97,7 @@ v-if="stakingInitialized" :label="t('soraStaking.info.redeemable')" :value="redeemableFundsFormatted" - :asset-symbol="rewardAsset?.symbol" + :asset-symbol="stakingAsset?.symbol" :fiat-value="redeemableFundsFiat" /> = [ name: PageNames.ExploreTokens, component: lazyView(PageNames.ExploreTokens), }, + { + path: 'books', + name: PageNames.ExploreBooks, + component: lazyView(PageNames.ExploreBooks), + }, ], }, { @@ -265,6 +270,11 @@ const routes: Array = [ name: PageNames.Stats, component: lazyView(PageNames.Stats), }, + { + path: '/trade/:first?/:second?', + name: PageNames.OrderBook, + component: lazyView(PageNames.OrderBook), + }, { path: '*', redirect: '/swap', diff --git a/src/store/bridge/actions.ts b/src/store/bridge/actions.ts index 341527005..02fcb9605 100644 --- a/src/store/bridge/actions.ts +++ b/src/store/bridge/actions.ts @@ -139,7 +139,7 @@ async function getEvmNetworkFee(context: ActionContext): Promise const bridgeRegisteredAsset = rootState.assets.registeredAssets[asset.address]; const decimals = state.isSoraToEvm ? asset.decimals : asset.externalDecimals; // using max balance to not overflow contract calculation - const value = FPNumber.fromCodecValue(state.assetSenderBalance!, decimals).toString(); + const value = FPNumber.fromCodecValue(state.assetSenderBalance ?? 0, decimals).toString(); fee = await getEthNetworkFee( asset, diff --git a/src/store/consts.ts b/src/store/consts.ts index c638b9a07..7bca9a655 100644 --- a/src/store/consts.ts +++ b/src/store/consts.ts @@ -19,6 +19,7 @@ export enum Module { Staking = 'staking', DemeterFarming = 'demeterFarming', SoraCard = 'soraCard', + OrderBook = 'orderBook', } export const Modules = [...Object.values(Module), ...WalletModules]; diff --git a/src/store/index.ts b/src/store/index.ts index f0f90bee6..d9ef15ee9 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -8,6 +8,7 @@ import assets from './assets'; import bridge from './bridge'; import demeterFarming from './demeterFarming'; import moonpay from './moonpay'; +import orderBook from './orderBook'; import pool from './pool'; import referrals from './referrals'; import removeLiquidity from './removeLiquidity'; @@ -40,6 +41,7 @@ const modules = { staking, demeterFarming, soraCard, + orderBook, }; const { store, rootGetterContext, rootActionContext } = createDirectStore({ diff --git a/src/store/orderBook/actions.ts b/src/store/orderBook/actions.ts new file mode 100644 index 000000000..5fa5fdf14 --- /dev/null +++ b/src/store/orderBook/actions.ts @@ -0,0 +1,195 @@ +import { api } from '@soramitsu/soraneo-wallet-web'; +import { defineActions } from 'direct-vuex'; +import { combineLatest } from 'rxjs'; + +import { subscribeOnOrderBookUpdates, fetchOrderBooks } from '@/indexer/queries/orderBook'; + +import { orderBookActionContext } from '.'; + +import type { OrderBook } from '@sora-substrate/liquidity-proxy'; +import type { LimitOrder } from '@sora-substrate/util/build/orderBook/types'; +import type { Subscription } from 'rxjs'; + +const actions = defineActions({ + async getOrderBooksInfo(context): Promise { + const { commit, rootGetters } = orderBookActionContext(context); + const { whitelist } = rootGetters.wallet.account; + const orderBooks = await api.orderBook.getOrderBooks(); + + const orderBooksWhitelist = Object.entries(orderBooks).reduce>((buffer, [key, book]) => { + const { base, quote } = book.orderBookId; + if ([base, quote].every((address) => address in whitelist)) { + buffer[key] = book; + } + return buffer; + }, {}); + + commit.setOrderBooks(orderBooksWhitelist); + }, + + async updateOrderBooksStats(context): Promise { + const { commit } = orderBookActionContext(context); + + const orderBooksWithStats = await fetchOrderBooks(); + const orderBooksStats = (orderBooksWithStats ?? []).reduce((buffer, item) => { + const { + id: { base, quote }, + stats, + } = item; + + const key = api.orderBook.serializedKey(base, quote); + buffer[key] = stats; + return buffer; + }, {}); + + commit.setStats(orderBooksStats); + }, + + async subscribeToBidsAndAsks(context): Promise { + const { commit, dispatch, getters } = orderBookActionContext(context); + const { baseAsset, quoteAsset } = getters; + + dispatch.unsubscribeFromBidsAndAsks(); + + if (!(baseAsset && quoteAsset)) return; + + let asksSubscription!: Subscription; + let bidsSubscription!: Subscription; + + await Promise.all([ + new Promise((resolve) => { + asksSubscription = api.orderBook + .subscribeOnAggregatedAsks(baseAsset.address, quoteAsset.address) + .subscribe((asks) => { + commit.setAsks(asks.toReversed()); + resolve(); + }); + }), + new Promise((resolve) => { + bidsSubscription = api.orderBook + .subscribeOnAggregatedBids(baseAsset.address, quoteAsset.address) + .subscribe((bids) => { + commit.setBids(bids.toReversed()); + resolve(); + }); + }), + ]); + + commit.setOrderBookUpdates([asksSubscription, bidsSubscription]); + }, + + unsubscribeFromBidsAndAsks(context): void { + const { commit } = orderBookActionContext(context); + + commit.setAsks(); + commit.setBids(); + commit.resetOrderBookUpdates(); + }, + + async subscribeToOrderBookStats(context): Promise { + const { commit, dispatch, getters, state } = orderBookActionContext(context); + const { dexId } = state; + const { baseAsset, quoteAsset } = getters; + + dispatch.unsubscribeFromOrderBookStats(); + + if (!(baseAsset && quoteAsset)) return; + + const subscription = await subscribeOnOrderBookUpdates( + dexId, + baseAsset.address, + quoteAsset.address, + (data) => { + const { + id: { base, quote }, + stats, + deals, + } = data; + const key = api.orderBook.serializedKey(base, quote); + commit.setDeals(deals); + commit.setStats({ [key]: stats }); + }, + console.error + ); + + if (!subscription) return; + + commit.setOrderBookStatsUpdates(subscription); + }, + + unsubscribeFromOrderBookStats(context): void { + const { commit } = orderBookActionContext(context); + + commit.setDeals(); + commit.resetOrderBookStatsUpdates(); + }, + + async subscribeToUserLimitOrders(context): Promise { + const { commit, dispatch, getters } = orderBookActionContext(context); + const { baseAsset, quoteAsset, accountAddress } = getters; + + dispatch.unsubscribeFromUserLimitOrders(); + + if (!(accountAddress && baseAsset && quoteAsset)) return; + + let subscription!: Subscription; + + await new Promise((resolve) => { + subscription = api.orderBook + .subscribeOnUserLimitOrdersIds(baseAsset.address, quoteAsset.address, accountAddress) + .subscribe(async (ids) => { + const userLimitOrders = (await Promise.all( + ids.map((id) => api.orderBook.getLimitOrder(baseAsset.address, quoteAsset.address, id)) + )) as LimitOrder[]; + + const orders = userLimitOrders.map((el) => { + const amountStr = el.amount.toString(); + const originalAmountStr = el.originalAmount.toString(); + return { ...el, amountStr, originalAmountStr }; + }); + + commit.setUserLimitOrders(orders); + + resolve(); + }); + }); + + commit.setUserLimitOrderUpdates(subscription); + }, + + async subscribeOnLimitOrders(context, ids: number[]): Promise { + const { commit, getters, state } = orderBookActionContext(context); + const { baseAsset, quoteAsset, accountAddress } = getters; + + if (!(accountAddress && baseAsset && quoteAsset)) return; + + let subscription!: Subscription; + const observables = ids.map((id) => api.orderBook.subscribeOnLimitOrder(baseAsset.address, quoteAsset.address, id)); + + await new Promise((resolve) => { + subscription = combineLatest(observables).subscribe((updated) => { + const updatedOrders = updated.filter((item) => !!item) as LimitOrder[]; + if (updatedOrders.length) { + const userLimitOrders = state.userLimitOrders.map((order) => { + const found = updatedOrders.find((item) => item.id === order.id); + return found ?? order; + }); + commit.setUserLimitOrders(userLimitOrders); + resolve(); + } else { + resolve(); + } + }); + }); + + commit.setPagedUserLimitOrdersSubscription(subscription); + }, + + unsubscribeFromUserLimitOrders(context): void { + const { commit } = orderBookActionContext(context); + + commit.resetUserLimitOrderUpdates(); + }, +}); + +export default actions; diff --git a/src/store/orderBook/getters.ts b/src/store/orderBook/getters.ts new file mode 100644 index 000000000..0344e7b45 --- /dev/null +++ b/src/store/orderBook/getters.ts @@ -0,0 +1,63 @@ +import { OrderBook } from '@sora-substrate/liquidity-proxy'; +import { api } from '@soramitsu/soraneo-wallet-web'; +import { defineGetters } from 'direct-vuex'; + +import type { OrderBookStats, OrderBookDealData } from '@/types/orderBook'; +import { getBookDecimals } from '@/utils/orderBook'; + +import { OrderBookState } from './types'; + +import { orderBookGetterContext } from '.'; + +import type { RegisteredAccountAsset } from '@sora-substrate/util/build/assets/types'; + +const getters = defineGetters()({ + baseAsset(...args): Nullable { + const { state, rootGetters } = orderBookGetterContext(args); + if (!state.baseAssetAddress) return null; + return rootGetters.assets.assetDataByAddress(state.baseAssetAddress); + }, + quoteAsset(...args): Nullable { + const { state, rootGetters } = orderBookGetterContext(args); + if (!state.quoteAssetAddress) return null; + return rootGetters.assets.assetDataByAddress(state.quoteAssetAddress); + }, + orderBookId(...args): string { + const { getters } = orderBookGetterContext(args); + const { baseAsset, quoteAsset } = getters; + + if (!(baseAsset && quoteAsset)) return ''; + + return api.orderBook.serializedKey(baseAsset.address, quoteAsset.address); + }, + currentOrderBook(...args): Nullable { + const { getters, state } = orderBookGetterContext(args); + + if (!getters.orderBookId) return null; + + return state.orderBooks[getters.orderBookId]; + }, + orderBookStats(...args): Nullable { + const { getters, state } = orderBookGetterContext(args); + + if (!getters.orderBookId) return null; + + return state.orderBooksStats[getters.orderBookId]; + }, + orderBookDecimals(...args): number { + const { getters } = orderBookGetterContext(args); + + return getBookDecimals(getters.currentOrderBook); + }, + orderBookLastDeal(...args): Nullable { + const { state } = orderBookGetterContext(args); + + return state.deals[0] ?? null; + }, + accountAddress(...args): string { + const { rootState } = orderBookGetterContext(args); + return rootState.wallet.account.address; + }, +}); + +export default getters; diff --git a/src/store/orderBook/index.ts b/src/store/orderBook/index.ts new file mode 100644 index 000000000..745ae1971 --- /dev/null +++ b/src/store/orderBook/index.ts @@ -0,0 +1,23 @@ +import { defineModule } from 'direct-vuex'; + +import { localActionContext, localGetterContext } from '@/store'; +import { Module } from '@/store/consts'; + +import actions from './actions'; +import getters from './getters'; +import mutations from './mutations'; +import state from './state'; + +const orderBook = defineModule({ + namespaced: true, + state, + getters, + mutations, + actions, +}); + +const orderBookGetterContext = (args: [any, any, any, any]) => localGetterContext(args, Module.OrderBook, orderBook); +const orderBookActionContext = (context: any) => localActionContext(context, Module.OrderBook, orderBook); + +export { orderBookActionContext, orderBookGetterContext }; +export default orderBook; diff --git a/src/store/orderBook/mutations.ts b/src/store/orderBook/mutations.ts new file mode 100644 index 000000000..b36673708 --- /dev/null +++ b/src/store/orderBook/mutations.ts @@ -0,0 +1,84 @@ +import { PriceVariant } from '@sora-substrate/liquidity-proxy'; +import { defineMutations } from 'direct-vuex'; + +import { LimitOrderType } from '@/consts'; +import type { OrderBookDealData, OrderBookStats } from '@/types/orderBook'; + +import type { OrderBookState } from './types'; +import type { OrderBookId, OrderBookPriceVolume, OrderBook } from '@sora-substrate/liquidity-proxy'; +import type { LimitOrder } from '@sora-substrate/util/build/orderBook/types'; +import type { Subscription } from 'rxjs'; + +const mutations = defineMutations()({ + setOrderBooks(state, orderBooks: Record): void { + state.orderBooks = orderBooks; + }, + setCurrentOrderBook(state, { dexId, base, quote }: OrderBookId): void { + state.dexId = dexId; + state.baseAssetAddress = base; + state.quoteAssetAddress = quote; + }, + setBaseValue(state, value: string): void { + state.baseValue = value; + }, + setQuoteValue(state, value: string): void { + state.quoteValue = value; + }, + setSide(state, side: PriceVariant): void { + state.side = side; + }, + setLimitOrderType(state, type: LimitOrderType): void { + state.limitOrderType = type; + }, + setAsks(state, asks: readonly OrderBookPriceVolume[] = []): void { + state.asks = Object.freeze([...asks]); + }, + setBids(state, bids: readonly OrderBookPriceVolume[] = []): void { + state.bids = Object.freeze([...bids]); + }, + setDeals(state, deals: readonly OrderBookDealData[] = []): void { + state.deals = Object.freeze([...deals]); + }, + setStats(state, stats: Record): void { + state.orderBooksStats = Object.freeze({ ...state.orderBooksStats, ...stats }); + }, + setUserLimitOrders(state, limitOrders: LimitOrder[] = []): void { + state.userLimitOrders = Object.freeze([...limitOrders]); + }, + setOrderBookUpdates(state, subscriptions: Array): void { + state.orderBookUpdates = subscriptions; + }, + resetOrderBookUpdates(state): void { + state.orderBookUpdates?.forEach((subscription) => subscription?.unsubscribe()); + state.orderBookUpdates = []; + }, + setOrderBookStatsUpdates(state, subscription: VoidFunction): void { + state.orderBookStatsUpdates = subscription; + }, + resetOrderBookStatsUpdates(state): void { + state.orderBookStatsUpdates?.(); + state.orderBookStatsUpdates = null; + }, + setUserLimitOrderUpdates(state, subscription: Subscription): void { + state.userLimitOrderUpdates = subscription; + }, + resetUserLimitOrderUpdates(state): void { + state.userLimitOrderUpdates?.unsubscribe(); + state.userLimitOrderUpdates = null; + }, + setPagedUserLimitOrdersSubscription(state, subscription: Subscription): void { + state.pagedUserLimitOrdersSubscription = subscription; + }, + resetPagedUserLimitOrdersSubscription(state): void { + state.pagedUserLimitOrdersSubscription?.unsubscribe(); + state.pagedUserLimitOrdersSubscription = null; + }, + setOrdersToBeCancelled(state, orders): void { + state.ordersToBeCancelled = orders; + }, + setAmountSliderValue(state, percent: number) { + state.amountSliderValue = percent; + }, +}); + +export default mutations; diff --git a/src/store/orderBook/state.ts b/src/store/orderBook/state.ts new file mode 100644 index 000000000..8cfea5703 --- /dev/null +++ b/src/store/orderBook/state.ts @@ -0,0 +1,34 @@ +import { PriceVariant } from '@sora-substrate/liquidity-proxy'; +import { DexId } from '@sora-substrate/util/build/dex/consts'; + +import { LimitOrderType } from '@/consts'; + +import type { OrderBookState } from './types'; + +function initialState(): OrderBookState { + return { + orderBooks: {}, + dexId: DexId.XOR, + baseAssetAddress: null, + quoteAssetAddress: null, + limitOrderType: LimitOrderType.limit, + baseValue: '', + quoteValue: '', + orderBooksStats: {}, + deals: [], + asks: [], + bids: [], + userLimitOrders: [], + side: PriceVariant.Buy, + orderBookUpdates: [], + orderBookStatsUpdates: null, + userLimitOrderUpdates: null, + pagedUserLimitOrdersSubscription: null, + ordersToBeCancelled: [], + amountSliderValue: 0, + }; +} + +const state = initialState(); + +export default state; diff --git a/src/store/orderBook/types.ts b/src/store/orderBook/types.ts new file mode 100644 index 000000000..765bfcb6d --- /dev/null +++ b/src/store/orderBook/types.ts @@ -0,0 +1,29 @@ +import type { LimitOrderType } from '@/consts'; +import type { OrderBookStats, OrderBookDealData } from '@/types/orderBook'; + +import type { PriceVariant, OrderBookPriceVolume, OrderBook } from '@sora-substrate/liquidity-proxy'; +import type { DexId } from '@sora-substrate/util/build/dex/consts'; +import type { LimitOrder } from '@sora-substrate/util/build/orderBook/types'; +import type { Subscription } from 'rxjs'; + +export type OrderBookState = { + orderBooks: Record; + dexId: DexId; + baseAssetAddress: Nullable; + quoteAssetAddress: Nullable; + limitOrderType: LimitOrderType; + orderBooksStats: Record; + deals: readonly OrderBookDealData[]; + asks: readonly OrderBookPriceVolume[]; + bids: readonly OrderBookPriceVolume[]; + userLimitOrders: readonly LimitOrder[]; + baseValue: string; + quoteValue: string; + side: PriceVariant; + orderBookUpdates: Array; + orderBookStatsUpdates: Nullable; + userLimitOrderUpdates: Nullable; + pagedUserLimitOrdersSubscription: Nullable; + ordersToBeCancelled: Array; + amountSliderValue: number; +}; diff --git a/src/store/settings/actions.ts b/src/store/settings/actions.ts index a5c9ecbdd..c7f41dfaf 100644 --- a/src/store/settings/actions.ts +++ b/src/store/settings/actions.ts @@ -204,7 +204,7 @@ const actions = defineActions({ updateDocumentTitle(); updateFpNumberLocale(locale); commit.setLanguage(locale); - commit.updateDisplayRegions(); // based on locale + commit.updateIntlUtils(); // based on locale }, async setBlockNumber(context): Promise { const { commit } = settingsActionContext(context); diff --git a/src/store/settings/getters.ts b/src/store/settings/getters.ts index 39ef38022..c8a4d8cf4 100644 --- a/src/store/settings/getters.ts +++ b/src/store/settings/getters.ts @@ -64,6 +64,10 @@ const getters = defineGetters()({ const { state } = settingsGetterContext(args); return state.featureFlags.soraCard; }, + orderBookEnabled(...args): Nullable { + const { state } = settingsGetterContext(args); + return state.featureFlags.orderBook; + }, notificationActivated(...args): boolean { const { state } = settingsGetterContext(args); return state.browserNotifsPermission === 'granted'; diff --git a/src/store/settings/mutations.ts b/src/store/settings/mutations.ts index 34e11dd0b..0968f470f 100644 --- a/src/store/settings/mutations.ts +++ b/src/store/settings/mutations.ts @@ -95,12 +95,14 @@ const mutations = defineMutations()({ state.userDisclaimerApprove = true; settingsStorage.set('disclaimerApprove', true); }, - updateDisplayRegions(state): void { + updateIntlUtils(state): void { try { state.displayRegions = new Intl.DisplayNames([state.language], { type: 'region' }); + state.percentFormat = new Intl.NumberFormat([state.language], { style: 'percent', maximumFractionDigits: 2 }); } catch (error) { - console.warn('Intl.DisplayNames issue', error); + console.warn('Intl is not supported!', error); state.displayRegions = null; + state.percentFormat = null; } }, setFeatureFlags(state, featureFlags: FeatureFlags = {}): void { @@ -109,6 +111,9 @@ const mutations = defineMutations()({ setBlockNumber(state, value: number): void { state.blockNumber = value || 0; }, + setMenuCollapsed(state, collapsed: boolean): void { + state.menuCollapsed = collapsed; + }, setBlockNumberUpdates(state, subscription: Subscription): void { state.blockNumberUpdates = subscription; }, diff --git a/src/store/settings/state.ts b/src/store/settings/state.ts index cc40494ac..73332c259 100644 --- a/src/store/settings/state.ts +++ b/src/store/settings/state.ts @@ -22,12 +22,14 @@ function initialState(): SettingsState { node: node ? JSON.parse(node) : {}, language: getLocale(), displayRegions: undefined, + percentFormat: undefined, defaultNodes: [], customNodes: customNodes ? JSON.parse(customNodes) : [], nodeAddressConnecting: '', nodeConnectionAllowance: true, chainGenesisHash: '', faucetUrl: '', + menuCollapsed: false, selectNodeDialogVisibility: false, selectIndexerDialogVisibility: false, selectLanguageDialogVisibility: false, diff --git a/src/store/settings/types.ts b/src/store/settings/types.ts index 79232fa14..0eace1fa6 100644 --- a/src/store/settings/types.ts +++ b/src/store/settings/types.ts @@ -15,6 +15,7 @@ export type FeatureFlags = { x1ex?: boolean; charts?: boolean; soraCard?: boolean; + orderBook?: boolean; }; export type SettingsState = { @@ -27,12 +28,14 @@ export type SettingsState = { node: Partial; language: string; displayRegions: Nullable; + percentFormat: Nullable; defaultNodes: Array; customNodes: Array; nodeAddressConnecting: string; nodeConnectionAllowance: boolean; chainGenesisHash: string; faucetUrl: string; + menuCollapsed: boolean; selectNodeDialogVisibility: boolean; selectIndexerDialogVisibility: boolean; selectLanguageDialogVisibility: boolean; diff --git a/src/store/staking/actions.ts b/src/store/staking/actions.ts index 87ad66e25..75213ab6d 100644 --- a/src/store/staking/actions.ts +++ b/src/store/staking/actions.ts @@ -7,16 +7,6 @@ import type { Payouts } from '@sora-substrate/util/build/staking/types'; import type { Subscription } from 'rxjs'; const actions = defineActions({ - async bond(context): Promise { - const { state, getters } = stakingActionContext(context); - - const controller = state.controller || getters.stash; - - if (!state.payee) throw new Error('Payee is not set'); - - await api.staking.bond({ controller, value: state.stakeAmount, payee: state.payee }); - }, - async nominate(context): Promise { const { state, dispatch } = stakingActionContext(context); @@ -106,10 +96,6 @@ const actions = defineActions({ }); }, - async chill(context): Promise { - await api.staking.chill(); - }, - async getStakingInfo(context): Promise { const { getters, commit } = stakingActionContext(context); @@ -153,7 +139,7 @@ const actions = defineActions({ async getUnbondPeriod(context): Promise { const { commit } = stakingActionContext(context); - const unbondPeriod = await api.staking.getUnbondPeriod(); + const unbondPeriod = api.staking.getUnbondPeriod(); commit.setUnbondPeriod(unbondPeriod); }, @@ -161,7 +147,7 @@ const actions = defineActions({ async getMaxNominations(context): Promise { const { commit } = stakingActionContext(context); - const maxNominations = await api.staking.getMaxNominations(); + const maxNominations = api.staking.getMaxNominations(); commit.setMaxNominations(maxNominations); }, @@ -169,7 +155,7 @@ const actions = defineActions({ async getHistoryDepth(context): Promise { const { commit } = stakingActionContext(context); - const historyDepth = await api.staking.getHistoryDepth(); + const historyDepth = api.staking.getHistoryDepth(); commit.setHistoryDepth(historyDepth); }, @@ -179,7 +165,7 @@ const actions = defineActions({ commit.resetActiveEraUpdates(); - const observable = await api.staking.getActiveEraObservable(); + const observable = api.staking.getActiveEraObservable(); if (!observable) return; @@ -200,7 +186,7 @@ const actions = defineActions({ commit.resetCurrentEraUpdates(); - const observable = await api.staking.getCurrentEraObservable(); + const observable = api.staking.getCurrentEraObservable(); if (!observable) return; @@ -223,7 +209,7 @@ const actions = defineActions({ if (!state.currentEra) throw new Error('Current era is not set'); - const observable = await api.staking.getEraTotalStakeObservable(state.currentEra); + const observable = api.staking.getEraTotalStakeObservable(state.currentEra); if (!observable) return; @@ -244,7 +230,7 @@ const actions = defineActions({ commit.resetControllerUpdates(); - const observable = await api.staking.getControllerObservable(getters.stash); + const observable = api.staking.getControllerObservable(getters.stash); if (!observable) return; @@ -265,7 +251,7 @@ const actions = defineActions({ commit.resetPayeeUpdates(); - const observable = await api.staking.getPayeeObservable(getters.stash); + const observable = api.staking.getPayeeObservable(getters.stash); if (!observable) return; @@ -286,7 +272,7 @@ const actions = defineActions({ commit.resetNominationsUpdates(); - const observable = await api.staking.getNominationsObservable(getters.stash); + const observable = api.staking.getNominationsObservable(getters.stash); if (!observable) return; @@ -307,7 +293,7 @@ const actions = defineActions({ commit.resetAccountLedgerUpdates(); - const observable = await api.staking.getAccountLedgerObservable(getters.stash); + const observable = api.staking.getAccountLedgerObservable(getters.stash); if (!observable) return; diff --git a/src/store/swap/mutations.ts b/src/store/swap/mutations.ts index bc8b8f679..d230de1fd 100644 --- a/src/store/swap/mutations.ts +++ b/src/store/swap/mutations.ts @@ -67,6 +67,9 @@ const mutations = defineMutations()({ state.isAvailable = isAvailable; state.liquiditySources = liquiditySources; }, + setLiquiditySource(state, liquiditySource): void { + state.liquiditySources = [liquiditySource]; + }, selectDexId(state, dexId: number) { state.selectedDexId = dexId; }, diff --git a/src/store/types.ts b/src/store/types.ts index 4af26079f..c0f16b432 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -3,7 +3,7 @@ import type store from '@/store'; import type { VUEX_TYPES } from '@soramitsu/soraneo-wallet-web'; import type { VueDecorator } from 'vue-class-component'; -type BaseModuleDecorator = { +type BaseModuleDecorator = { router: VUEX_TYPES.BaseDecorator; web3: VUEX_TYPES.BaseDecorator; assets: VUEX_TYPES.BaseDecorator; @@ -19,6 +19,7 @@ type BaseModuleDecorator; demeterFarming: VUEX_TYPES.BaseDecorator; soraCard: VUEX_TYPES.BaseDecorator; + orderBook: VUEX_TYPES.BaseDecorator; }; export type StateDecorators = BaseModuleDecorator< @@ -36,7 +37,8 @@ export type StateDecorators = BaseModuleDecorator< typeof store.state.rewards, typeof store.state.staking, typeof store.state.demeterFarming, - typeof store.state.soraCard + typeof store.state.soraCard, + typeof store.state.orderBook > & VUEX_TYPES.WalletStateDecorators; @@ -55,7 +57,8 @@ export type GettersDecorators = BaseModuleDecorator< typeof store.getters.rewards, typeof store.getters.staking, typeof store.getters.demeterFarming, - typeof store.getters.soraCard + typeof store.getters.soraCard, + typeof store.getters.orderBook > & VUEX_TYPES.WalletGettersDecorators & { libraryDesignSystem: VueDecorator; libraryTheme: VueDecorator }; @@ -74,7 +77,8 @@ export type CommitDecorators = BaseModuleDecorator< typeof store.commit.rewards, typeof store.commit.staking, typeof store.commit.demeterFarming, - typeof store.commit.soraCard + typeof store.commit.soraCard, + typeof store.commit.orderBook > & VUEX_TYPES.WalletCommitDecorators; @@ -93,6 +97,7 @@ export type DispatchDecorators = BaseModuleDecorator< typeof store.dispatch.rewards, typeof store.dispatch.staking, typeof store.dispatch.demeterFarming, - typeof store.dispatch.soraCard + typeof store.dispatch.soraCard, + typeof store.dispatch.orderBook > & VUEX_TYPES.WalletDispatchDecorators; diff --git a/src/styles/_layout.scss b/src/styles/_layout.scss index b7bd75250..5c861279b 100644 --- a/src/styles/_layout.scss +++ b/src/styles/_layout.scss @@ -7,6 +7,7 @@ $basic-spacing-medium: $basic-spacing-mini * 4; $inner-window-width: 464px; $inner-window-height: 217px; +$sidebar-max-width: 190px; $inner-spacing-mini: 8px; $inner-spacing-tiny: math.div($inner-spacing-mini, 2); diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss index 0d9028d3a..2aab15861 100644 --- a/src/styles/_mixins.scss +++ b/src/styles/_mixins.scss @@ -265,6 +265,7 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, text-align: center; &.is-active { background: var(--s-color-base-background); + box-shadow: var(--s-shadow-element); } @if $withBottomMargin == true { &:last-child { @@ -286,10 +287,6 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, position: relative; } - &.is-active { - box-shadow: var(--s-shadow-element); - } - .el-collapse-item__header { height: auto; min-height: #{$collapse-icon-height + $inner-spacing-medium * 2}; @@ -311,16 +308,22 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, font-weight: 600; } -@mixin scrollbar($marginOffset: 0, $verticalRight: 2px, $isLeft: false) { +@mixin scrollbar( + $marginOffset: 0, + $verticalRight: 2px, + $isLeft: false, + $withHorizontalScroll: false, + $hideVerticalScroll: false +) { &.el-scrollbar { margin-left: $marginOffset; margin-right: $marginOffset; & > .el-scrollbar__wrap { - overflow-x: hidden; - margin-bottom: 0px !important; // to disable element-ui negative margin - } - & > .el-scrollbar__wrap { + @if $withHorizontalScroll == false { + overflow-x: hidden; + margin-bottom: 0px !important; // to disable element-ui negative margin + } &, & > .el-scrollbar__view { display: flex; @@ -328,13 +331,15 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, flex-flow: column nowrap; } } - & > .el-scrollbar__bar { - &.is-vertical { - right: $verticalRight; + & > .el-scrollbar__bar.is-vertical { + right: $verticalRight; - @if $isLeft == true { - left: 0; - } + @if $isLeft == true { + left: 0; + } + + @if $hideVerticalScroll == true { + width: 0; } } } @@ -615,12 +620,22 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, &-address { display: flex; font-size: var(--s-font-size-extra-mini); + .tokens-item-address__value { + &.token-address { + font-size: var(--s-font-size-extra-mini); + font-weight: 400; + color: var(--s-color-base-content-primary); + } + } } &-tokens { display: flex; flex-flow: column nowrap; align-items: flex-end; } + &-token { + font-size: var(--s-font-size-small); + } &-price { font-size: var(--s-font-size-medium); white-space: nowrap; @@ -628,15 +643,6 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, &-amount.formatted-amount--fiat-value { color: var(--s-color-base-content-primary) !important; } - &-address { - .tokens-item-address__value { - &.token-address { - font-size: var(--s-font-size-extra-mini); - font-weight: 400; - color: var(--s-color-base-content-primary); - } - } - } } } @@ -679,12 +685,8 @@ $button-custom-shadow: -1px -1px 5px rgba(0, 0, 0, 0.05), 1px 1px 5px rgba(0, 0, &#{$tabs-class} { #{$tabs-class}__header { width: 100%; - } - #{$tabs-class} { - &__header { - #{$tabs-class}__item { - font-weight: 600; - } + #{$tabs-class}__item { + font-weight: 600; } } } diff --git a/src/styles/soramitsu-variables.scss b/src/styles/soramitsu-variables.scss index b9702008d..b3d33c7e3 100644 --- a/src/styles/soramitsu-variables.scss +++ b/src/styles/soramitsu-variables.scss @@ -1,40 +1,40 @@ -$s-color-brand-day: #A19A9D; // 0d0248 +$s-color-brand-day: #a19a9d; // 0d0248 // Primary theme colors -$s-color-theme-accent: #F8087B; // NEU bright pink fluro -$s-color-theme-accent-hover: #F754A3; // NEU pale quartz pink +$s-color-theme-accent: #f8087b; // NEU bright pink fluro +$s-color-theme-accent-hover: #f754a3; // NEU pale quartz pink $s-color-theme-accent-pressed: #bf065f; $s-color-theme-accent-focused: #ab0555; // Secondary theme colors -$s-color-theme-secondary: #44E5B2; -$s-color-theme-secondary-hover: #24DAA0; -$s-color-theme-secondary-pressed: #24DAA0; -$s-color-theme-secondary-focused: #24DAA0; +$s-color-theme-secondary: #44e5b2; +$s-color-theme-secondary-hover: #24daa0; +$s-color-theme-secondary-pressed: #24daa0; +$s-color-theme-secondary-focused: #24daa0; // Base content colors -$s-color-base-content-primary: #2A171F; -$s-color-base-content-secondary: #A19A9D; -$s-color-base-content-tertiary: #D5CDD0; +$s-color-base-content-primary: #2a171f; +$s-color-base-content-secondary: #a19a9d; +$s-color-base-content-tertiary: #d5cdd0; $s-color-base-content-quaternary: #75787b; // Base misc colors -$s-color-base-background: #FAF4F8; -$s-color-base-border-primary: #F7F3F4; -$s-color-base-border-secondary: #EDE4E7; -$s-color-base-background-hover: #F7F3F4; -$s-color-base-disabled: #FDF7FB; -$s-color-base-on-disabled: #A19A9D; -$s-color-base-on-accent: #FFFFFF; +$s-color-base-background: #faf4f8; +$s-color-base-border-primary: #f7f3f4; +$s-color-base-border-secondary: #ede4e7; +$s-color-base-background-hover: #f7f3f4; +$s-color-base-disabled: #fdf7fb; +$s-color-base-on-disabled: #a19a9d; +$s-color-base-on-accent: #ffffff; // Utility colors -$s-color-utility-body: #F7F3F4; -$s-color-utility-surface: #FDF7FB; +$s-color-utility-body: #f7f3f4; +$s-color-utility-surface: #fdf7fb; $s-color-utility-overlay: rgba(42, 23, 31, 0.1); // Status colors -$s-color-status-success: #34AD87; -$s-color-status-warning: #EBA332; -$s-color-status-error: #F754A3; -$s-color-status-info: #479AEF; -$s-color-status-success-background: #B9EBDB; -$s-color-status-warning-background: #FCEEBD; -$s-color-status-error-background: #FFD8EB; -$s-color-status-info-background: #C6E2FF; +$s-color-status-success: #34ad87; +$s-color-status-warning: #eba332; +$s-color-status-error: #f754a3; +$s-color-status-info: #479aef; +$s-color-status-success-background: #b9ebdb; +$s-color-status-warning-background: #fceebd; +$s-color-status-error-background: #ffd8eb; +$s-color-status-info-background: #c6e2ff; // Fiat colors $s-color-fiat-value: rgba(71, 154, 239, 1) !default; $s-color-rewards: #c0e2ff !default; @@ -46,7 +46,7 @@ $s-size-big: 58px; // Shadows $s-shadow-surface: 1px 1px 5px var(--s-shadow-color-dark), inset 1px 1px 1px var(--s-shadow-color-dark); $s-shadow-tooltip: 0px 1px 4px rgba(13, 2, 72, 0.35); -$s-shadow-tab: 1px 1px 2px #FFFFFF, inset 1px 1px 2px rgba(0, 0, 0, 0.1); // 0px 1px 1px rgba(0, 0, 0, 0.1); +$s-shadow-tab: 1px 1px 2px #ffffff, inset 1px 1px 2px rgba(0, 0, 0, 0.1); // 0px 1px 1px rgba(0, 0, 0, 0.1); $s-shadow-dropdown: 0px 4px 8px rgba(19, 19, 19, 0.15); $s-shadow-mobile-tap-bar: 0px -4px 8px rgba(19, 19, 19, 0.15); $s-shadow-mobile-side-menu: -4px 4px 8px rgba(19, 19, 19, 0.15); @@ -57,8 +57,8 @@ $s-border-radius-small: $s-border-radius-base * 1.5; $s-border-radius-medium: $s-border-radius-base * 2; $s-border-radius-big: $s-border-radius-base * 3; // Fonts paths -$s-font-family-default-path: '~@soramitsu/soramitsu-js-ui/lib/assets/fonts/Sora-VariableFont_wght.ttf' !default; -$s-font-family-mono-path: '~@soramitsu/soramitsu-js-ui/lib/assets/fonts/JetBrainsMono-Regular.woff' !default; +$s-font-family-default-path: '~@soramitsu-ui/ui-vue2/lib/assets/fonts/Sora-VariableFont_wght.ttf' !default; +$s-font-family-mono-path: '~@soramitsu-ui/ui-vue2/lib/assets/fonts/JetBrainsMono-Regular.woff' !default; $s-font-family-icons-path: '~@/assets/fonts/polkaswap_icons.ttf' !default; // Font Feature Settings $s-font-feature-settings-common: normal; @@ -75,9 +75,9 @@ $s-transition-default: all 0.125s ease-in-out; $s-asset-item-height: 71px; $s-asset-item-height--fiat: 86px; // override dark theme on disabled -$s-color-base-on-disabled--dark: #C29AB7; +$s-color-base-on-disabled--dark: #c29ab7; -@import "../../node_modules/@soramitsu/soramitsu-js-ui/lib/styles/index"; +@import '../../node_modules/@soramitsu-ui/ui-vue2/lib/styles/index'; :root { --s-color-brand-day: #{$s-color-brand-day}; diff --git a/src/types/chart.ts b/src/types/chart.ts new file mode 100644 index 000000000..b0db3887a --- /dev/null +++ b/src/types/chart.ts @@ -0,0 +1,8 @@ +/** "open", "close", "low", "high" data */ +export type OCLH = [number, number, number, number]; + +export type SnapshotItem = { + timestamp: number; + price: OCLH; + volume: number; +}; diff --git a/src/types/orderBook.ts b/src/types/orderBook.ts new file mode 100644 index 000000000..d0d4c073a --- /dev/null +++ b/src/types/orderBook.ts @@ -0,0 +1,47 @@ +import { INDEXER_TYPES } from '@soramitsu/soraneo-wallet-web'; + +import type { OrderBookId, PriceVariant } from '@sora-substrate/liquidity-proxy'; +import type { FPNumber, CodecString } from '@sora-substrate/util'; +import type { LimitOrder } from '@sora-substrate/util/build/orderBook/types'; + +export enum Filter { + open = 'open', + all = 'all', + executed = 'executed', +} + +export enum Cancel { + multiple = 'multiple', + all = 'all', +} + +export const OrderStatus = INDEXER_TYPES.OrderStatus; + +export type OrderBookDealData = { + timestamp: number; + side: PriceVariant; + price: FPNumber; + amount: FPNumber; +}; + +export type OrderBookStats = { + baseAssetReserves?: CodecString; + quoteAssetReserves?: CodecString; + price: FPNumber; + priceChange: FPNumber; + volume: FPNumber; + status: string; +}; + +export type OrderBookWithStats = { + id: OrderBookId; + stats: OrderBookStats; +}; + +export type OrderBookUpdateData = OrderBookWithStats & { + deals: OrderBookDealData[]; +}; + +export type OrderData = LimitOrder & { + status: string; +}; diff --git a/src/types/tabs.ts b/src/types/tabs.ts index ce9b64459..fb92f0756 100644 --- a/src/types/tabs.ts +++ b/src/types/tabs.ts @@ -1,3 +1,8 @@ +export enum OrderBookTabs { + Limit = 'limit', + Market = 'market', +} + export enum AlertTypeTabs { Drop = 'drop', Raise = 'raise', diff --git a/src/utils/bridge/eth/utils.ts b/src/utils/bridge/eth/utils.ts index 3ba446d2c..1feed0caf 100644 --- a/src/utils/bridge/eth/utils.ts +++ b/src/utils/bridge/eth/utils.ts @@ -122,7 +122,7 @@ export async function getIncomingEvmTransactionData({ asset, value, recipient, g const amount = new FPNumber(value, asset.externalDecimals).toCodecString(); - const contractAddress = getContractAddress(KnownEthBridgeAsset.Other)!; + const contractAddress = getContractAddress(KnownEthBridgeAsset.Other) as string; const contractAbi = SmartContracts[SmartContractType.EthBridge][KnownEthBridgeAsset.Other].abi; const contract = new ethers.Contract(contractAddress, contractAbi, signer); @@ -159,7 +159,7 @@ export async function getOutgoingEvmTransactionData({ const symbol = asset.symbol as KnownEthBridgeAsset; const isValOrXor = [KnownEthBridgeAsset.XOR, KnownEthBridgeAsset.VAL].includes(symbol); const bridgeAsset: KnownEthBridgeAsset = isValOrXor ? symbol : KnownEthBridgeAsset.Other; - const contractAddress = getContractAddress(bridgeAsset)!; + const contractAddress = getContractAddress(bridgeAsset) as string; const contractAbi = SmartContracts[SmartContractType.EthBridge][bridgeAsset].abi; const contract = new ethers.Contract(contractAddress, contractAbi, signer); @@ -267,10 +267,10 @@ export async function getEthNetworkFee( try { const { contract, method, args } = await getIncomingEvmTransactionData(txParams); - const signer = contract.runner!; + const signer = contract.runner; const tx = await contract[method].populateTransaction(...args); - txGasLimit = await signer.estimateGas!(tx); + txGasLimit = (await signer?.estimateGas?.(tx)) ?? BigInt(0); } catch { txGasLimit = getEthBridgeIncomingGasLimit(asset.externalAddress); } diff --git a/src/utils/bridge/sub/classes/adapter.ts b/src/utils/bridge/sub/classes/adapter.ts index 01c6fe43a..3a9fb4393 100644 --- a/src/utils/bridge/sub/classes/adapter.ts +++ b/src/utils/bridge/sub/classes/adapter.ts @@ -269,6 +269,13 @@ export class SubNetworksConnector { protected getConnection( network: SubNetwork, connectorAdapter?: Adapter + ): SubNetworkConnection; + + protected getConnection(network: undefined, connectorAdapter?: Adapter): undefined; + + protected getConnection( + network?: SubNetwork, + connectorAdapter?: Adapter ): SubNetworkConnection | undefined { if (!network) return undefined; @@ -312,7 +319,7 @@ export class SubNetworksConnector { public async init(destination: SubNetwork, connector?: SubNetworksConnector): Promise { const [soraParachain, relaychain, parachain] = this.getChains(destination); // Create adapters - this.soraParachain = this.getConnection(soraParachain, connector?.soraParachain?.adapter)!; + this.soraParachain = this.getConnection(soraParachain, connector?.soraParachain?.adapter); this.relaychain = this.getConnection(relaychain, connector?.relaychain?.adapter); this.parachain = this.getConnection(parachain, connector?.parachain?.adapter); // link destination network diff --git a/src/utils/bridge/sub/classes/history.ts b/src/utils/bridge/sub/classes/history.ts index 0f88e4dcd..7799c01c2 100644 --- a/src/utils/bridge/sub/classes/history.ts +++ b/src/utils/bridge/sub/classes/history.ts @@ -25,7 +25,7 @@ import type { ActionContext } from 'vuex'; const hasFinishedState = (item: Nullable) => { if (!item) return false; - return [BridgeTxStatus.Done, BridgeTxStatus.Failed].includes(item.transactionState!); + return [BridgeTxStatus.Done, BridgeTxStatus.Failed].includes(item.transactionState as BridgeTxStatus); }; const getType = (isOutgoing: boolean) => { @@ -252,7 +252,7 @@ class SubBridgeHistory extends SubNetworksConnector { history.transactionState = BridgeTxStatus.Failed; } - history.externalNetwork = subBridgeApi.getSoraParachain(history.externalNetwork!); + history.externalNetwork = subBridgeApi.getSoraParachain(history.externalNetwork as SubNetwork); history.externalBlockId = history.parachainBlockId; history.to = formatSubAddress(history.to as string, this.parachainApi.registry.chainSS58 as number); history.parachainBlockId = undefined; // parachain is external network @@ -374,7 +374,7 @@ class SubBridgeHistory extends SubNetworksConnector { ); const signer = feeEvent.event.data[0].toString(); // signer is spent balance for fee - history.externalNetwork = subBridgeApi.getSoraParachain(history.externalNetwork!); + history.externalNetwork = subBridgeApi.getSoraParachain(history.externalNetwork as SubNetwork); history.externalNetworkFee = feeEvent.event.data[1].toString(); history.externalBlockId = parachainBlockId; history.to = formatSubAddress(signer, this.parachainApi.registry.chainSS58 as number); diff --git a/src/utils/index.ts b/src/utils/index.ts index b8ab25656..3ce3cb43b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -2,6 +2,7 @@ import { FPNumber, CodecString } from '@sora-substrate/util'; import { isNativeAsset } from '@sora-substrate/util/build/assets'; import { XOR } from '@sora-substrate/util/build/assets/consts'; import { api, WALLET_CONSTS } from '@soramitsu/soraneo-wallet-web'; +import scrollbarWidth from 'element-ui/src/utils/scrollbar-width'; import debounce from 'lodash/debounce'; import { app, ZeroStringValue } from '@/consts'; @@ -20,6 +21,12 @@ type AssetWithBalance = AccountAsset | RegisteredAccountAsset; type PoolAssets = { baseAsset: T; poolAsset: T }; +export async function waitUntil(condition: () => boolean): Promise { + if (condition()) return; + await delay(250); + await waitUntil(condition); +} + export async function waitForSoraNetworkFromEnv(): Promise { return new Promise((resolve) => { store.original.watch( @@ -374,3 +381,5 @@ export const sortPools = (a: PoolAssets, b: PoolAssets) = return byBaseAsset === 0 ? sortAssets(a.poolAsset, b.poolAsset) : byBaseAsset; }; + +export const calcElScrollGutter: () => number = scrollbarWidth; diff --git a/src/utils/orderBook.ts b/src/utils/orderBook.ts new file mode 100644 index 000000000..f64490168 --- /dev/null +++ b/src/utils/orderBook.ts @@ -0,0 +1,9 @@ +import type { OrderBook } from '@sora-substrate/liquidity-proxy'; + +export const MAX_ORDERS_PER_SIDE = 1024; +export const MAX_ORDERS_PER_USER = 1024; +export const MAX_ORDERS_PER_SINGLE_PRICE = 1024; + +export function getBookDecimals(orderBook: Nullable): number { + return orderBook?.stepLotSize?.toString().split('.')[1]?.length ?? 2; +} diff --git a/src/views/About.vue b/src/views/About.vue index c62dfec4b..142098875 100644 --- a/src/views/About.vue +++ b/src/views/About.vue @@ -158,7 +158,7 @@ import TranslationMixin from '@/components/mixins/TranslationMixin'; import Web3Logo from '@/components/shared/Logo/Web3.vue'; import { getter } from '@/store/decorators'; -import type Theme from '@soramitsu/soramitsu-js-ui/lib/types/Theme'; +import type Theme from '@soramitsu-ui/ui-vue2/lib/types/Theme'; @Component({ components: { diff --git a/src/views/Bridge.vue b/src/views/Bridge.vue index dbfc82c67..9f69c557a 100644 --- a/src/views/Bridge.vue +++ b/src/views/Bridge.vue @@ -78,7 +78,9 @@ v-if="changeSenderWalletEvm" class="connect-wallet-btn disconnect" @click="resetEvmProviderConnection" - >{{ t('disconnectWalletText') }} + > + {{ t('disconnectWalletText') }} +
{{ t('disconnectWalletText') }} + > + {{ t('disconnectWalletText') }} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + diff --git a/src/views/Explore/Container.vue b/src/views/Explore/Container.vue index 8503aebda..7c8747dec 100644 --- a/src/views/Explore/Container.vue +++ b/src/views/Explore/Container.vue @@ -69,12 +69,16 @@ export default class ExploreContainer extends Mixins(mixins.LoadingMixin, Transl } get tabs(): Array<{ name: string; label: string }> { - return [PageNames.ExploreFarming, PageNames.ExplorePools, PageNames.ExploreStaking, PageNames.ExploreTokens].map( - (name) => ({ - name, - label: this.t(`pageTitle.${name}`), - }) - ); + return [ + PageNames.ExploreFarming, + PageNames.ExplorePools, + PageNames.ExploreStaking, + PageNames.ExploreTokens, + PageNames.ExploreBooks, + ].map((name) => ({ + name, + label: this.t(`pageTitle.${name}`), + })); } get pageName(): string { @@ -87,7 +91,11 @@ export default class ExploreContainer extends Mixins(mixins.LoadingMixin, Transl /** Shown only for logged in users and for any tab on page except Tokens */ get switcherAvailable(): boolean { - return this.pageName !== PageNames.ExploreTokens && this.isLoggedIn; + if (!this.isLoggedIn) return false; + + return [PageNames.ExploreFarming, PageNames.ExplorePools, PageNames.ExploreStaking].includes( + this.pageName as PageNames + ); } handleTabChange(name: string): void { diff --git a/src/views/Explore/Demeter.vue b/src/views/Explore/Demeter.vue index f3cf31ad0..31b928ccc 100644 --- a/src/views/Explore/Demeter.vue +++ b/src/views/Explore/Demeter.vue @@ -109,7 +109,7 @@ value-can-be-hidden :font-size-rate="FontSizeRate.SMALL" :value="balance" - class="explore-table-item-price explore-table-item-amount" + class="explore-table-item-token" >