diff --git a/package.json b/package.json index 3cb03d5e6..fd66d2053 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,14 @@ "direct-vuex": "^0.12.1", "echarts": "^5.4.0", "ethers": "^5.7.2", + "jwt-decode": "^3.1.2", "lodash": "^4.17.21", + "uuidv4": "^6.2.13", "vue": "2.6.14", "vue-class-component": "^7.2.6", "vue-echarts": "^6.2.3", "vue-i18n": "^8.11.2", + "vue-plugin-load-script": "^2.x.x", "vue-property-decorator": "^9.1.2", "vue-router": "^3.5.3", "vuex": "^3.1.3" diff --git a/public/env.json b/public/env.json index abda889bb..4f6b56139 100644 --- a/public/env.json +++ b/public/env.json @@ -1,86 +1,86 @@ { "BASE_API_URL": "", "API_KEYS": { - "moonpay": "pk_test_4ASGxHKGpLPE6sdQq1V3QjtpUFSpWLk", - "nftStorage": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDBmMzgwOTMyQTNDODM3ZDNiN2JEYzBBNTc0NmNkMDlBRGIyNUZGMzQiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY0MjU4OTQ2ODA4MSwibmFtZSI6Im5mdC1zdG9yYWdlLWRldiJ9.hkvzea9ltcriXXHKoYd3F2Iu1Y8X5H-zunAQboC_3vw", - "etherscan": "YBR7IWEBEXFICT8M7GRV77NBX4AXJ9T53H" + "moonpay": "pk_test_4ASGxHKGpLPE6sdQq1V3QjtpUFSpWLk", + "nftStorage": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDBmMzgwOTMyQTNDODM3ZDNiN2JEYzBBNTc0NmNkMDlBRGIyNUZGMzQiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY0MjU4OTQ2ODA4MSwibmFtZSI6Im5mdC1zdG9yYWdlLWRldiJ9.hkvzea9ltcriXXHKoYd3F2Iu1Y8X5H-zunAQboC_3vw", + "etherscan": "YBR7IWEBEXFICT8M7GRV77NBX4AXJ9T53H" }, "FEATURE_FLAGS": { - "moonpay": true, - "charts": true + "moonpay": true, + "charts": true }, "FAUCET_URL": "https://faucet.dev.sora2.tachi.soramitsu.co.jp/", "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-dev", "DEFAULT_NETWORKS": [ - { - "chain": "SORA-dev Testnet #1", - "name": "SORA", - "address": "wss://ws.framenode-1.s1.dev.sora2.soramitsu.co.jp" - }, - { - "chain": "SORA-dev Testnet #2", - "name": "SORA", - "address": "wss://ws.framenode-2.s2.dev.sora2.soramitsu.co.jp" - }, - { - "chain": "SORA-dev Testnet #3", - "name": "SORA", - "address": "wss://ws.framenode-3.s3.dev.sora2.soramitsu.co.jp" - }, - { - "chain": "SORA-dev Testnet #4", - "name": "SORA", - "address": "wss://ws.framenode-4.s3.dev.sora2.soramitsu.co.jp" - }, - { - "chain": "SORA-dev Testnet #5", - "name": "SORA", - "address": "wss://ws.framenode-5.s4.dev.sora2.soramitsu.co.jp" - }, - { - "chain": "SORA-dev Testnet #6", - "name": "SORA", - "address": "wss://ws.framenode-6.s4.dev.sora2.soramitsu.co.jp" - } + { + "chain": "SORA-dev Testnet #1", + "name": "SORA", + "address": "wss://ws.framenode-1.s1.dev.sora2.soramitsu.co.jp" + }, + { + "chain": "SORA-dev Testnet #2", + "name": "SORA", + "address": "wss://ws.framenode-2.s2.dev.sora2.soramitsu.co.jp" + }, + { + "chain": "SORA-dev Testnet #3", + "name": "SORA", + "address": "wss://ws.framenode-3.s3.dev.sora2.soramitsu.co.jp" + }, + { + "chain": "SORA-dev Testnet #4", + "name": "SORA", + "address": "wss://ws.framenode-4.s3.dev.sora2.soramitsu.co.jp" + }, + { + "chain": "SORA-dev Testnet #5", + "name": "SORA", + "address": "wss://ws.framenode-5.s4.dev.sora2.soramitsu.co.jp" + }, + { + "chain": "SORA-dev Testnet #6", + "name": "SORA", + "address": "wss://ws.framenode-6.s4.dev.sora2.soramitsu.co.jp" + } ], "NETWORK_TYPE": "Dev", "CHAIN_GENESIS_HASH": "", "SUB_NETWORKS": [ - { - "name": "ethereum", - "id": 0, - "symbol": "ETH", - "currency": "ETH", - "defaultType": "sepolia", - "CONTRACTS": { - "XOR": { - "MASTER": "0x12c6a709925783f49fcca0b398d13b0d597e6e1c" - }, - "VAL": { - "MASTER": "0x47e229aa491763038f6a505b4f85d8eb463f0962" - }, - "OTHER": { - "MASTER": "0x24390c8f6cbd5d152c30226f809f4e3f153b88d4" - } - } - }, - { - "name": "energy", - "id": 1, - "symbol": "VT", - "currency": "VT", - "defaultType": "private", - "CONTRACTS": { - "XOR": { - "MASTER": "" - }, - "VAL": { - "MASTER": "" - }, - "OTHER": { - "MASTER": "0x1891b81AE0C5A81Ec84BC4f69322C6a01A3B3095" - } - } + { + "name": "ethereum", + "id": 0, + "symbol": "ETH", + "currency": "ETH", + "defaultType": "sepolia", + "CONTRACTS": { + "XOR": { + "MASTER": "0x12c6a709925783f49fcca0b398d13b0d597e6e1c" + }, + "VAL": { + "MASTER": "0x47e229aa491763038f6a505b4f85d8eb463f0962" + }, + "OTHER": { + "MASTER": "0x24390c8f6cbd5d152c30226f809f4e3f153b88d4" + } + } + }, + { + "name": "energy", + "id": 1, + "symbol": "VT", + "currency": "VT", + "defaultType": "private", + "CONTRACTS": { + "XOR": { + "MASTER": "" + }, + "VAL": { + "MASTER": "" + }, + "OTHER": { + "MASTER": "0x1891b81AE0C5A81Ec84BC4f69322C6a01A3B3095" + } } + } ] } diff --git a/src/assets/img/sora-card/card.svg b/src/assets/img/sora-card/card.svg new file mode 100644 index 000000000..45e830ad5 --- /dev/null +++ b/src/assets/img/sora-card/card.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sora-card/email.svg b/src/assets/img/sora-card/email.svg new file mode 100644 index 000000000..f95167130 --- /dev/null +++ b/src/assets/img/sora-card/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sora-card/sidebar.svg b/src/assets/img/sora-card/sidebar.svg new file mode 100644 index 000000000..f5d9e9bb0 --- /dev/null +++ b/src/assets/img/sora-card/sidebar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/img/sora-card/sora-card-front.svg b/src/assets/img/sora-card/sora-card-front.svg new file mode 100644 index 000000000..0e6246db5 --- /dev/null +++ b/src/assets/img/sora-card/sora-card-front.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/sora-card/sora-card.svg b/src/assets/img/sora-card/sora-card.svg new file mode 100644 index 000000000..aa95d2d85 --- /dev/null +++ b/src/assets/img/sora-card/sora-card.svg @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/sora-card/user.svg b/src/assets/img/sora-card/user.svg new file mode 100644 index 000000000..0c25b4d8b --- /dev/null +++ b/src/assets/img/sora-card/user.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/App/Menu/AppMenu.vue b/src/components/App/Menu/AppMenu.vue index a721a4f4b..f785da4d4 100644 --- a/src/components/App/Menu/AppMenu.vue +++ b/src/components/App/Menu/AppMenu.vue @@ -221,6 +221,33 @@ export default class AppMenu extends Mixins(TranslationMixin) { } } } + +// TODO: [TECH] move from fonts provided values +.sora-card-sidebar-icon { + path { + fill: var(--s-color-base-content-tertiary) !important; + } +} + +.el-menu-item:not(.is-active):not(.is-disabled) { + .sidebar-item-content { + &:hover .sora-card-sidebar-icon path { + fill: var(--s-color-base-content-secondary) !important; + } + } +} + +.el-menu-item.is-disabled { + &:hover path { + fill: var(--s-color-base-content-tertiary) !important; + } +} + +.is-active .sora-card-sidebar-icon { + path { + fill: var(--s-color-theme-accent) !important; + } +} diff --git a/src/components/SoraCard/SoraCardIntroPage.vue b/src/components/SoraCard/SoraCardIntroPage.vue new file mode 100644 index 000000000..02b13dcb2 --- /dev/null +++ b/src/components/SoraCard/SoraCardIntroPage.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/SoraCard/SoraCardKYC.vue b/src/components/SoraCard/SoraCardKYC.vue new file mode 100644 index 000000000..43e6b4800 --- /dev/null +++ b/src/components/SoraCard/SoraCardKYC.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/components/SoraCard/steps/ConfirmationInfo.vue b/src/components/SoraCard/steps/ConfirmationInfo.vue new file mode 100644 index 000000000..4c78886a8 --- /dev/null +++ b/src/components/SoraCard/steps/ConfirmationInfo.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/components/SoraCard/steps/KycView.vue b/src/components/SoraCard/steps/KycView.vue new file mode 100644 index 000000000..160294961 --- /dev/null +++ b/src/components/SoraCard/steps/KycView.vue @@ -0,0 +1,162 @@ + + + + + + + diff --git a/src/components/SoraCard/steps/RoadMap.vue b/src/components/SoraCard/steps/RoadMap.vue new file mode 100644 index 000000000..191fb3196 --- /dev/null +++ b/src/components/SoraCard/steps/RoadMap.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/src/components/SoraCard/steps/TermsAndConditions.vue b/src/components/SoraCard/steps/TermsAndConditions.vue new file mode 100644 index 000000000..aa874ba58 --- /dev/null +++ b/src/components/SoraCard/steps/TermsAndConditions.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/src/components/SoraCard/steps/ToSDialog.vue b/src/components/SoraCard/steps/ToSDialog.vue new file mode 100644 index 000000000..03df998be --- /dev/null +++ b/src/components/SoraCard/steps/ToSDialog.vue @@ -0,0 +1,47 @@ + + + + + + + diff --git a/src/consts/index.ts b/src/consts/index.ts index 7f7eeb0b7..9b2320182 100644 --- a/src/consts/index.ts +++ b/src/consts/index.ts @@ -133,6 +133,7 @@ export enum PageNames { Tokens = 'Tokens', MoonpayHistory = 'MoonpayHistory', StakingContainer = 'StakingContainer', + SoraCard = 'SoraCard', } export enum Components { @@ -147,6 +148,14 @@ export enum Components { BrowserNotifsEnableDialog = 'App/BrowserNotification/BrowserNotifsEnableDialog', BrowserNotifsBlockedDialog = 'App/BrowserNotification/BrowserNotifsBlockedDialog', PairTokenLogo = 'PairTokenLogo', + SoraCard = 'SoraCard', + SoraCardIntroPage = 'SoraCard/SoraCardIntroPage', + SoraCardKYC = 'SoraCard/SoraCardKYC', + TermsAndConditions = 'SoraCard/steps/TermsAndConditions', + ToSDialog = 'SoraCard/steps/ToSDialog', + RoadMap = 'SoraCard/steps/RoadMap', + KycView = 'SoraCard/steps/KycView', + ConfirmationInfo = 'SoraCard/steps/ConfirmationInfo', SwapConfirm = 'Swap/Confirm', SwapChart = 'Swap/Chart', StatusActionBadge = 'Swap/StatusActionBadge', @@ -208,7 +217,7 @@ export enum RewardsTabsItems { } interface SidebarMenuItem { - icon: string; + icon?: string; title: string; disabled?: boolean; } @@ -252,6 +261,10 @@ const OtherPagesMenu: Array = [ icon: 'various-bone-24', title: PageNames.Tokens, }, + { + icon: 'sora-card', + title: PageNames.SoraCard, + }, { icon: 'file-file-text-24', title: PageNames.About, @@ -298,6 +311,11 @@ export const StoreLinks = { GooglePlay: 'https://play.google.com/store/apps/details?id=jp.co.soramitsu.sora', }; +export const TosExternalLinks = { + Terms: `https://soracard.com/terms/`, + Privacy: `https://soracard.com/privacy/`, +}; + export const FaucetLink: SidebarMenuItemLink = { icon: 'software-terminal-24', title: 'faucet', diff --git a/src/lang/en.json b/src/lang/en.json index 14c440541..51c7281f6 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1,1134 +1,1135 @@ { - "closeText": "Close", - "backText": "Back", - "createWalletText": "Create wallet", - "nameText": "Name", - "nextText": "Next", - "importText": "Import", - "settingsText": "Settings", - "addAssetText": "Add asset", - "createTokenText": "Create", - "comingSoonText": "Coming Soon", - "successText": "Success", - "warningText": "Warning", - "swapText": "Swap", - "searchText": "Search", - "cancelText": "Cancel", - "saveText": "Save", - "logoutText": "Log out", - "sendText": "Send", - "addressText": "Address", - "amountText": "Amount", - "confirmText": "Confirm", - "errorText": "Error", - "insufficientBalanceText": "Insufficient {tokenSymbol} balance", - "unknownErrorText": "ERROR Something went wrong...", - "transactionSubmittedText": "Transaction was submitted", - "operations": { - "Swap": "Swap", - "Transfer": "Transfer", - "AddLiquidity": "Add Liquidity", - "RemoveLiquidity": "Remove Liquidity", - "CreatePair": "Create Pair", - "RegisterAsset": "Register Asset", - "ClaimRewards": "Claim Rewards", - "andText": "and", - "finalized": { - "Transfer": "{action} {amount} {symbol} {direction} {address}", - "Swap": "Swapped {amount} {symbol} for {amount2} {symbol2}", - "AddLiquidity": "Supplied {amount} {symbol} and {amount2} {symbol2}", - "RemoveLiquidity": "Removed {amount} {symbol} and {amount2} {symbol2}", - "CreatePair": "Supplied {amount} {symbol} and {amount2} {symbol2}", - "RegisterAsset": "Registered {symbol} asset", - "ClaimRewards": "Reward claimed successfully {rewards}", - "ReferralReserveXor": "Bonded XOR successfully", - "ReferralUnreserveXor": "Unbonded XOR successfully", - "ReferralSetInvitedUser": "Referral is set successfully", - "SwapAndSend": "Swapped {amount} {symbol} for {amount2} {symbol2} and {action} {direction} {address}", - "DemeterFarmingDepositLiquidity": "Supplied {symbol} and {symbol2} {amount} LP tokens", - "DemeterFarmingWithdrawLiquidity": "Removed {symbol} and {symbol2} {amount} LP tokens", - "DemeterFarmingStakeToken": "Added {amount} {symbol}", - "DemeterFarmingUnstakeToken": "Removed {amount} {symbol}", - "DemeterFarmingGetRewards": "{amount} {symbol} claimed successfully", - "EthBridgeIncoming": "Transfered {amount} {symbol} from {Ethereum} to {Sora}", - "EthBridgeOutgoing": "Transfered {amount} {symbol} from {Sora} to {Ethereum}" - }, - "error": { - "Transfer": "Failed to {action} {amount} {symbol} {direction} {address}", - "Swap": "Failed to swap {amount} {symbol} for {amount2} {symbol2}", - "AddLiquidity": "Failed to supply {amount} {symbol} and {amount2} {symbol2}", - "RemoveLiquidity": "Failed to remove {amount} {symbol} and {amount2} {symbol2}", - "CreatePair": "Failed to supply {amount} {symbol} and {amount2} {symbol2}", - "RegisterAsset": "Failed to register {symbol} asset", - "ClaimRewards": "Failed to claim rewards {rewards}", - "ReferralReserveXor": "Failed to bond XOR", - "ReferralUnreserveXor": "Failed to unbond XOR", - "ReferralSetInvitedUser": "Failed to set referral", - "SwapAndSend": "Failed to swap {amount} {symbol} for {amount2} {symbol2} and {action} {direction} {address}", - "DemeterFarmingDepositLiquidity": "Failed to supply {amount} {symbol} and {symbol2} LP tokens", - "DemeterFarmingWithdrawLiquidity": "Failed to remove {amount} {symbol} and {symbol2} LP tokens", - "DemeterFarmingStakeToken": "Failed to add {amount} {symbol}", - "DemeterFarmingUnstakeToken": "Failed to remove {amount} {symbol}", - "DemeterFarmingGetRewards": "Failed to claim {symbol}", - "EthBridgeIncoming": "Failed to transfer {amount} {symbol} from {Ethereum} to {Sora}", - "EthBridgeOutgoing": "Failed to transfer {amount} {symbol} from {Sora} to {Ethereum}" - }, - "ReferralReserveXor": "Bond XOR", - "ReferralUnreserveXor": "Unbond XOR", - "ReferralSetInvitedUser": "Set Referral", - "SwapAndSend": "Swap and Send", - "DemeterFarmingDepositLiquidity": "Stake Liquidity", - "DemeterFarmingWithdrawLiquidity": "Unstake Liquidity", - "DemeterFarmingStakeToken": "Stake Token", - "DemeterFarmingUnstakeToken": "Unstake Token", - "DemeterFarmingGetRewards": "Claim Rewards", - "EthBridgeIncoming": "@:hashiBridgeText", - "EthBridgeOutgoing": "@:hashiBridgeText" - }, - "polkadotjs": { - "noExtensions": "No {PolkadotJs} extension was found. Please install it and reload this page\nhttps:\/\/polkadot.js.org\/extension\/", - "noAccounts": "There seems to be no accounts in your {extension} extension. Please add an account and try again.", - "noAccount": "{extension} account error. Please check your account in the {extension} extension", - "noExtension": "No {extension} extension was found. Please install it and reload this page", - "noSigner": "Access denied. Go to {extension} extension settings and open \"Manage Website Access\" to allow." - }, - "connection": { - "title": "{Sora} Network account", - "text": "Connect or create your {Sora} Network account with {extensions} extensions. These extensions allow you to securely sign transactions and manage assets in {Sora} Network.", - "noAccounts": "No account found in your {extension} browser extension. Please add an account and try again.", - "selectAccount": "Select account to work with", - "action": { - "install": "Install extension", - "learnMore": "Learn more", - "connect": "Connect account", - "refresh": "Refresh" - }, - "selectWallet": "Select a wallet to work with", - "wallet": { - "install": "Install" - } + "closeText": "Close", + "backText": "Back", + "createWalletText": "Create wallet", + "nameText": "Name", + "nextText": "Next", + "importText": "Import", + "settingsText": "Settings", + "addAssetText": "Add asset", + "createTokenText": "Create", + "comingSoonText": "Coming Soon", + "successText": "Success", + "warningText": "Warning", + "swapText": "Swap", + "searchText": "Search", + "cancelText": "Cancel", + "saveText": "Save", + "logoutText": "Log out", + "sendText": "Send", + "addressText": "Address", + "amountText": "Amount", + "confirmText": "Confirm", + "errorText": "Error", + "insufficientBalanceText": "Insufficient {tokenSymbol} balance", + "unknownErrorText": "ERROR Something went wrong...", + "transactionSubmittedText": "Transaction was submitted", + "operations": { + "Swap": "Swap", + "Transfer": "Transfer", + "AddLiquidity": "Add Liquidity", + "RemoveLiquidity": "Remove Liquidity", + "CreatePair": "Create Pair", + "RegisterAsset": "Register Asset", + "ClaimRewards": "Claim Rewards", + "andText": "and", + "finalized": { + "Transfer": "{action} {amount} {symbol} {direction} {address}", + "Swap": "Swapped {amount} {symbol} for {amount2} {symbol2}", + "AddLiquidity": "Supplied {amount} {symbol} and {amount2} {symbol2}", + "RemoveLiquidity": "Removed {amount} {symbol} and {amount2} {symbol2}", + "CreatePair": "Supplied {amount} {symbol} and {amount2} {symbol2}", + "RegisterAsset": "Registered {symbol} asset", + "ClaimRewards": "Reward claimed successfully {rewards}", + "ReferralReserveXor": "Bonded XOR successfully", + "ReferralUnreserveXor": "Unbonded XOR successfully", + "ReferralSetInvitedUser": "Referral is set successfully", + "SwapAndSend": "Swapped {amount} {symbol} for {amount2} {symbol2} and {action} {direction} {address}", + "DemeterFarmingDepositLiquidity": "Supplied {symbol} and {symbol2} {amount} LP tokens", + "DemeterFarmingWithdrawLiquidity": "Removed {symbol} and {symbol2} {amount} LP tokens", + "DemeterFarmingStakeToken": "Added {amount} {symbol}", + "DemeterFarmingUnstakeToken": "Removed {amount} {symbol}", + "DemeterFarmingGetRewards": "{amount} {symbol} claimed successfully", + "EthBridgeIncoming": "Transfered {amount} {symbol} from {Ethereum} to {Sora}", + "EthBridgeOutgoing": "Transfered {amount} {symbol} from {Sora} to {Ethereum}" }, + "error": { + "Transfer": "Failed to {action} {amount} {symbol} {direction} {address}", + "Swap": "Failed to swap {amount} {symbol} for {amount2} {symbol2}", + "AddLiquidity": "Failed to supply {amount} {symbol} and {amount2} {symbol2}", + "RemoveLiquidity": "Failed to remove {amount} {symbol} and {amount2} {symbol2}", + "CreatePair": "Failed to supply {amount} {symbol} and {amount2} {symbol2}", + "RegisterAsset": "Failed to register {symbol} asset", + "ClaimRewards": "Failed to claim rewards {rewards}", + "ReferralReserveXor": "Failed to bond XOR", + "ReferralUnreserveXor": "Failed to unbond XOR", + "ReferralSetInvitedUser": "Failed to set referral", + "SwapAndSend": "Failed to swap {amount} {symbol} for {amount2} {symbol2} and {action} {direction} {address}", + "DemeterFarmingDepositLiquidity": "Failed to supply {amount} {symbol} and {symbol2} LP tokens", + "DemeterFarmingWithdrawLiquidity": "Failed to remove {amount} {symbol} and {symbol2} LP tokens", + "DemeterFarmingStakeToken": "Failed to add {amount} {symbol}", + "DemeterFarmingUnstakeToken": "Failed to remove {amount} {symbol}", + "DemeterFarmingGetRewards": "Failed to claim {symbol}", + "EthBridgeIncoming": "Failed to transfer {amount} {symbol} from {Ethereum} to {Sora}", + "EthBridgeOutgoing": "Failed to transfer {amount} {symbol} from {Sora} to {Ethereum}" + }, + "ReferralReserveXor": "Bond XOR", + "ReferralUnreserveXor": "Unbond XOR", + "ReferralSetInvitedUser": "Set Referral", + "SwapAndSend": "Swap and Send", + "DemeterFarmingDepositLiquidity": "Stake Liquidity", + "DemeterFarmingWithdrawLiquidity": "Unstake Liquidity", + "DemeterFarmingStakeToken": "Stake Token", + "DemeterFarmingUnstakeToken": "Unstake Token", + "DemeterFarmingGetRewards": "Claim Rewards", + "EthBridgeIncoming": "@:hashiBridgeText", + "EthBridgeOutgoing": "@:hashiBridgeText" + }, + "polkadotjs": { + "noExtensions": "No {PolkadotJs} extension was found. Please install it and reload this page\nhttps://polkadot.js.org/extension/", + "noAccounts": "There seems to be no accounts in your {extension} extension. Please add an account and try again.", + "noAccount": "{extension} account error. Please check your account in the {extension} extension", + "noExtension": "No {extension} extension was found. Please install it and reload this page", + "noSigner": "Access denied. Go to {extension} extension settings and open \"Manage Website Access\" to allow." + }, + "connection": { + "title": "{Sora} Network account", + "text": "Connect or create your {Sora} Network account with {extensions} extensions. These extensions allow you to securely sign transactions and manage assets in {Sora} Network.", + "noAccounts": "No account found in your {extension} browser extension. Please add an account and try again.", + "selectAccount": "Select account to work with", + "action": { + "install": "Install extension", + "learnMore": "Learn more", + "connect": "Connect account", + "refresh": "Refresh" + }, + "selectWallet": "Select a wallet to work with", "wallet": { - "title": "{Sora} Network account", - "WalletAssets": "Assets", - "WalletActivity": "Activity", - "addAsset": "@:addAssetText", - "createToken": "@:createTokenText" - }, - "walletSend": { - "title": "Send", - "address": "@:addressText", - "amount": "@:amountText", - "balance": "Balance", - "max": "MAX", - "fee": "@:networkFeeText", - "enterAddress": "Enter address", - "badAddress": "Incorrect address", - "enterAmount": "Enter amount", - "badAmount": "@:insufficientBalanceText", - "confirmTitle": "Confirm transaction", - "confirm": "@:confirmText", - "errorAddress": "Invalid address. Please check it and try again.", - "feeTooltip": "@:networkFeeTooltipText", - "tooltip": "Send tokens between {Sora} network accounts", - "addressWarning": "Tokens will be sent to the {Sora} address below. Make sure the recipient can access the {Sora} chain to use the tokens:", - "addressError": "You cannot send tokens to the same account that you are currently connected to." - }, - "account": { - "successCopy": "Wallet address is copied to the clipboard", - "copy": "Copy address", - "switch": "Switch account", - "walletAddress": "Wallet address" + "install": "Install" + } + }, + "wallet": { + "title": "{Sora} Network account", + "WalletAssets": "Assets", + "WalletActivity": "Activity", + "addAsset": "@:addAssetText", + "createToken": "@:createTokenText" + }, + "walletSend": { + "title": "Send", + "address": "@:addressText", + "amount": "@:amountText", + "balance": "Balance", + "max": "MAX", + "fee": "@:networkFeeText", + "enterAddress": "Enter address", + "badAddress": "Incorrect address", + "enterAmount": "Enter amount", + "badAmount": "@:insufficientBalanceText", + "confirmTitle": "Confirm transaction", + "confirm": "@:confirmText", + "errorAddress": "Invalid address. Please check it and try again.", + "feeTooltip": "@:networkFeeTooltipText", + "tooltip": "Send tokens between {Sora} network accounts", + "addressWarning": "Tokens will be sent to the {Sora} address below. Make sure the recipient can access the {Sora} chain to use the tokens:", + "addressError": "You cannot send tokens to the same account that you are currently connected to." + }, + "account": { + "successCopy": "Wallet address is copied to the clipboard", + "copy": "Copy address", + "switch": "Switch account", + "walletAddress": "Wallet address" + }, + "history": { + "clearHistory": "Clear history", + "filterPlaceholder": "Filter by Address, Symbol, Type or Block ID", + "empty": "Your transactions will appear here", + "emptySearch": "No transactions found", + "firstText": "First", + "lastText": "Last", + "prevText": "Previous", + "nextText": "Next" + }, + "assets": { + "empty": "There are no assets", + "add": "@:addAssetText", + "swap": "@:swapText", + "send": "@:sendText", + "receive": "@:account.copy", + "liquidity": "Add liquidity", + "bridge": "Bridge", + "copy": "Copy Asset ID", + "successCopy": "{symbol} Asset ID is copied to the clipboard", + "copied": "Copied!", + "balance": { + "transferable": "Transferable", + "frozen": "Frozen", + "locked": "- Locked", + "reserved": "- Reserved", + "total": "Total", + "bonded": "- Bonded" + }, + "totalAssetsValue": "Total assets value:", + "details": "Details", + "assetId": "Asset ID" + }, + "asset": { + "remove": "Remove asset", + "select": "Select an asset", + "receive": "Receive {symbol}" + }, + "addAsset": { + "title": "@:addAssetText", + "action": "@:addAssetText", + "success": "Asset {symbol} was added successfully!", + "empty": "No tokens found", + "alreadyAttached": "Token was already attached", + "understand": "I understand", + "warningTitle": "Trade at your own risk!", + "warningMessage": "Anyone can create a token, including creating fake versions of existing tokens that claim to represent projects.\nIf you purchase this token, you may not be able to sell it back.", + "approved": "Asset approved by community", + "unknown": "Unknown source", + "scam": "SCAM", + "next": "Next", + "AddAssetToken": { + "title": "Currencies", + "switchBtn": "Verified assets only" + }, + "searchInputText": "Search by Asset ID, Name or Ticker Symbol" + }, + "createToken": { + "title": "@:createTokenText", + "desc": "Create and deploy custom asset on {Sora}", + "action": "@:createTokenText", + "enterSymbol": "Enter token symbol", + "enterName": "Enter token name", + "enterSupply": "Enter token supply", + "confirm": "@:confirmText", + "success": { + "title": "Transaction submitted", + "desc": "Create {symbol} token" + }, + "tooltipValue": "@:networkFeeTooltipText", + "fee": "@:networkFeeText", + "insufficientBalance": "@:insufficientBalanceText", + "feeError": "Failed to get a fee for a transaction", + "error": "Failed to create {symbol} token", + "tokenSymbol": { + "placeholder": "Token symbol", + "desc": "This is an identifier for the token. You can use from 1 to 7 characters for the selection." + }, + "tokenName": { + "placeholder": "Token name", + "desc": "This is a name for the token. You can use from 1 to 33 characters for the selection." + }, + "tokenSupply": { + "placeholder": "Token supply", + "desc": "You will receive these tokens upon creation." + }, + "extensibleSupply": { + "placeholder": "Extensible supply", + "desc": "Ability to mint more tokens." + }, + "titleCommon": "Create", + "confirmTokenTitleCommon": "Create Token", + "confirmTokenTitleNFT": "Create NFT", + "actionNFT": "@:createTokenTextNFT", + "provideContent": "Provide content", + "selectLocalFile": "Select local file", + "CreateSimpleToken": "Token", + "nft": { + "source": { + "label": "Source", + "value": "Local files", + "limit": "Choose another file" + }, + "link": { + "placeholder": "IPFS link", + "copyLink": "Copy link", + "tooltip": "IPFS is a distributed system for storing and accessing files, making it possible to access files from many locations that aren't managed by one organization." + }, + "image": { + "placeholderNoImage": "Upload the file by either entering a link or choosing from local storage", + "placeholderBadSource": "The file failed to be processed", + "placeholderBadSourceAddition": "or it’s not uploaded to IPFS yet", + "placeholderFileLimit": "The file size exceeds the limit of {value}mb" + }, + "supply": { + "placeholder": "Token supply", + "desc": "Amount of NFTs you’re going to get.", + "quantity": "Quantity" + }, + "description": { + "placeholder": "Description" + } }, + "enterTokenDescription": "Enter description", + "divisible": { + "placeholder": "Divisible", + "desc": "Ability of NFT to divide into fractional parts. Liquidity provisioning only works with divisible assets" + } + }, + "transaction": { + "title": "Transaction details", + "blockId": "Block Id", + "status": "Status", + "statuses": { + "pending": "Pending...", + "failed": "Transaction failed", + "complete": "Complete" + }, + "errorMessage": "Error", + "startTime": "Date", + "amount": "@:amountText", + "amount2": "@:amountText 2", + "fee": "Transaction Fee", + "total": "Total", + "from": "From", + "to": "To", + "successCopy": "{value} is copied to the clipboard", + "copy": "Copy {value}", "history": { - "clearHistory": "Clear history", - "filterPlaceholder": "Filter by Address, Symbol, Type or Block ID", - "empty": "Your transactions will appear here", - "emptySearch": "No transactions found", - "firstText": "First", - "lastText": "Last", - "prevText": "Previous", - "nextText": "Next" + "created": "Transaction for {amount} {symbol} has been created.", + "submitted": "Transaction submitted with fee of {fee} {symbol}", + "confirmed": "Transaction confirmed" }, - "assets": { - "empty": "There are no assets", - "add": "@:addAssetText", - "swap": "@:swapText", - "send": "@:sendText", - "receive": "@:account.copy", - "liquidity": "Add liquidity", - "bridge": "Bridge", - "copy": "Copy Asset ID", - "successCopy": "{symbol} Asset ID is copied to the clipboard", - "copied": "Copied!", - "balance": { - "transferable": "Transferable", - "frozen": "Frozen", - "locked": "- Locked", - "reserved": "- Reserved", - "total": "Total", - "bonded": "- Bonded" - }, - "totalAssetsValue": "Total assets value:", - "details": "Details", - "assetId": "Asset ID" - }, - "asset": { - "remove": "Remove asset", - "select": "Select an asset", - "receive": "Receive {symbol}" - }, - "addAsset": { - "title": "@:addAssetText", - "action": "@:addAssetText", - "success": "Asset {symbol} was added successfully!", - "empty": "No tokens found", - "alreadyAttached": "Token was already attached", - "understand": "I understand", - "warningTitle": "Trade at your own risk!", - "warningMessage": "Anyone can create a token, including creating fake versions of existing tokens that claim to represent projects.\nIf you purchase this token, you may not be able to sell it back.", - "approved": "Asset approved by community", - "unknown": "Unknown source", - "scam": "SCAM", - "next": "Next", - "AddAssetToken": { - "title": "Currencies", - "switchBtn": "Verified assets only" - }, - "searchInputText": "Search by Asset ID, Name or Ticker Symbol" - }, - "createToken": { - "title": "@:createTokenText", - "desc": "Create and deploy custom asset on {Sora}", - "action": "@:createTokenText", - "enterSymbol": "Enter token symbol", - "enterName": "Enter token name", - "enterSupply": "Enter token supply", - "confirm": "@:confirmText", - "success": { - "title": "Transaction submitted", - "desc": "Create {symbol} token" - }, - "tooltipValue": "@:networkFeeTooltipText", - "fee": "@:networkFeeText", - "insufficientBalance": "@:insufficientBalanceText", - "feeError": "Failed to get a fee for a transaction", - "error": "Failed to create {symbol} token", - "tokenSymbol": { - "placeholder": "Token symbol", - "desc": "This is an identifier for the token. You can use from 1 to 7 characters for the selection." - }, - "tokenName": { - "placeholder": "Token name", - "desc": "This is a name for the token. You can use from 1 to 33 characters for the selection." - }, - "tokenSupply": { - "placeholder": "Token supply", - "desc": "You will receive these tokens upon creation." - }, - "extensibleSupply": { - "placeholder": "Extensible supply", - "desc": "Ability to mint more tokens." - }, - "titleCommon": "Create", - "confirmTokenTitleCommon": "Create Token", - "confirmTokenTitleNFT": "Create NFT", - "actionNFT": "@:createTokenTextNFT", - "provideContent": "Provide content", - "selectLocalFile": "Select local file", - "CreateSimpleToken": "Token", - "nft": { - "source": { - "label": "Source", - "value": "Local files", - "limit": "Choose another file" - }, - "link": { - "placeholder": "IPFS link", - "copyLink": "Copy link", - "tooltip": "IPFS is a distributed system for storing and accessing files, making it possible to access files from many locations that aren't managed by one organization." - }, - "image": { - "placeholderNoImage": "Upload the file by either entering a link or choosing from local storage", - "placeholderBadSource": "The file failed to be processed", - "placeholderBadSourceAddition": "or it’s not uploaded to IPFS yet", - "placeholderFileLimit": "The file size exceeds the limit of {value}mb" - }, - "supply": { - "placeholder": "Token supply", - "desc": "Amount of NFTs you’re going to get.", - "quantity": "Quantity" - }, - "description": { - "placeholder": "Description" - } - }, - "enterTokenDescription": "Enter description", - "divisible": { - "placeholder": "Divisible", - "desc": "Ability of NFT to divide into fractional parts. Liquidity provisioning only works with divisible assets" - } - }, - "transaction": { - "title": "Transaction details", - "blockId": "Block Id", - "status": "Status", - "statuses": { - "pending": "Pending...", - "failed": "Transaction failed", - "complete": "Complete" - }, - "errorMessage": "Error", - "startTime": "Date", - "amount": "@:amountText", - "amount2": "@:amountText 2", - "fee": "Transaction Fee", - "total": "Total", - "from": "From", - "to": "To", - "successCopy": "{value} is copied to the clipboard", - "copy": "Copy {value}", - "history": { - "created": "Transaction for {amount} {symbol} has been created.", - "submitted": "Transaction submitted with fee of {fee} {symbol}", - "confirmed": "Transaction confirmed" - }, - "viewIn": { - "sorascan": "View in SORAScan", - "subscan": "View in Subscan" - }, - "txId": "Transaction Id", - "referrer": "Referrer", - "referral": "Referral" - }, - "appName": "{AppName}", - "changeNetworkText": "Change network in {Metamask}", - "transactionText": "transaction | transactions", - "connectWalletText": "Connect account", - "changeAccountText": "Change account", - "connectedText": "Connected", - "connectWalletTextTooltip": "Connect to {Sora} Network with {PolkadotJs}", - "selectNodeText": "Select Network Node", - "bridgeText": "Bridge", - "disclaimer": "{disclaimerPrefix} This website is maintained by the {Sora} community. Before continuing to use this website, please review the {polkaswapFaqLink} and documentation, which includes a detailed explanation on how {AppName} works, as well as the {memorandumLink}, and {privacyLink}. These documents are crucial to a secure and positive user experience. By using {AppName}, you acknowledge that you have read and understand these documents. You also acknowledge the following: 1) your sole responsibility for compliance with all laws that may apply to your particular use of {AppName} in your legal jurisdiction; 2) your understanding that the current version of {AppName} is an alpha version: it has not been fully tested, and some functions may not perform as designed; and 3) your understanding and voluntary acceptance of the risks involved in using {AppName}, including, but not limited to, the risk of losing tokens. Please do not continue without reading the {polkaswapFaqLink}, {memorandumLink}, {privacyLink}!", - "poweredBy": "Powered by", - "confirmTransactionText": "Confirm transaction in {direction}", - "retryText": "Retry", - "networkFeeText": "Network Fee", - "networkFeeTooltipText": "Network fee is used to ensure {Sora} system's growth and stable performance.", - "ethNetworkFeeTooltipText": "Please note that the {Ethereum} network fees displayed on {AppName} are only rough estimations, you can see the correct fee amount in your connected {Ethereum} wallet prior to confirming the transaction.", - "marketText": "Market", - "marketAlgorithmText": "Market algorithm", - "firstPerSecond": "{first} per {second}", - "pairIsNotCreated": "Token pair isn't created", - "pageTitle": { - "Swap": "Swap", - "Pool": "Pool", - "Bridge": "@:bridgeText", - "About": "About", - "Stats": "Stats", - "Support": "Support", - "Wallet": "Wallet", - "CreatePair": "Create Pair", - "AddLiquidity": "Add Liquidity", - "AddLiquidityId": "Add Liquidity", - "RemoveLiquidity": "Remove Liquidity", - "PageNotFound": "Page Not Found", - "Tokens": "Tokens", - "Rewards": "Rewards" - }, - "mainMenu": { - "Swap": "Swap", - "Pool": "Pool", - "Bridge": "@:bridgeText", - "Farming": "Farming", - "Wallet": "Account", - "Rewards": "Rewards", - "About": "About", - "Stats": "Stats", - "Support": "Support", - "CreatePair": "Create Pair", - "Tokens": "Tokens", - "StakingContainer": "Staking" - }, - "social": { - "twitter": "Twitter", - "telegram": "Telegram", - "medium": "Medium", - "reddit": "Reddit", - "github": "GitHub", - "wiki": "{Sora} Wiki" - }, - "footerMenu": { - "faucet": "Faucet", - "github": "GitHub", - "sorawiki": "{Sora} Wiki", - "memorandum": "{AppName} Memorandum and Terms of Services", - "privacy": "Privacy Policy", - "info": "Info & Community" - }, - "helpDialog": { - "title": "Help", - "termsOfService": "Terms of Service", - "privacyPolicy": "Privacy Policy", - "appVersion": "{AppName} version", - "contactUs": "Contact us" - }, - "aboutNetworkDialog": { - "title": "About", - "learnMore": "@:learnMoreText", - "network": { - "title": "What is {Sora}?", - "description": "{AppName} is built on top of the {Sora} Network, and the {Sora} token (XOR) is used for gas\/fees and liquidity provision on {AppName}. {Sora} Network allows for reduced fees, faster transactions and simpler consensus finalization and is focused on delivering interoperability across other blockchain ecosystems like {Ethereum}." - }, - "polkadot": { - "title": "What is {PolkadotJs}?", - "description": "{PolkadotJs} extension is a browser extension available for Firefox and Chrome dedicated to managing accounts for Substrate-based chains, including {Sora}, {Polkadot} and {Kusama}. You can add, import, and export accounts and sign transactions or extrinsics that you have initiated from websites you have authorized." - } - }, - "node": { - "errors": { - "connection": "An error occurred while connecting to the node\n{address}\n", - "network": "The node\n{address}\n is from the another network\n", - "existing": "This node is already added: {title}\n" - }, - "messages": { - "connected": "Connection established with node\n{address}\n", - "selectNode": "Please select node to connect from the node list" - }, - "warnings": { - "disconnect": "Connection to the node has been lost. Reconnecting..." - } - }, - "selectNodeDialog": { - "title": "{Sora} Network node selection", - "addNode": "Add custom node", - "customNode": "Custom node", - "howToSetupOwnNode": "How to setup your own {Sora} node", - "select": "Select", - "connected": "Connected", - "selectNodeForEnvironment": "Select a node for {environment} environment:", - "nodeTitle": "{chain} hosted by {name}", - "messages": { - "emptyName": "Please input the name of the node", - "emptyAddress": "Please input the address of the node", - "incorrectProtocol": "Address should starts from ws:\/\/ or wss:\/\/", - "incorrectAddress": "Incorrect address" - }, - "updateNode": "Update node" + "viewIn": { + "sorascan": "View in SORAScan", + "subscan": "View in Subscan" }, - "buttons": { - "max": "MAX", - "chooseToken": "Choose token", - "chooseAToken": "Choose a token", - "chooseTokens": "Choose tokens", - "enterAmount": "Enter amount" + "txId": "Transaction Id", + "referrer": "Referrer", + "referral": "Referral" + }, + "appName": "{AppName}", + "changeNetworkText": "Change network in {Metamask}", + "transactionText": "transaction | transactions", + "connectWalletText": "Connect account", + "changeAccountText": "Change account", + "connectedText": "Connected", + "connectWalletTextTooltip": "Connect to {Sora} Network with {PolkadotJs}", + "selectNodeText": "Select Network Node", + "bridgeText": "Bridge", + "disclaimer": "{disclaimerPrefix} This website is maintained by the {Sora} community. Before continuing to use this website, please review the {polkaswapFaqLink} and documentation, which includes a detailed explanation on how {AppName} works, as well as the {memorandumLink}, and {privacyLink}. These documents are crucial to a secure and positive user experience. By using {AppName}, you acknowledge that you have read and understand these documents. You also acknowledge the following: 1) your sole responsibility for compliance with all laws that may apply to your particular use of {AppName} in your legal jurisdiction; 2) your understanding that the current version of {AppName} is an alpha version: it has not been fully tested, and some functions may not perform as designed; and 3) your understanding and voluntary acceptance of the risks involved in using {AppName}, including, but not limited to, the risk of losing tokens. Please do not continue without reading the {polkaswapFaqLink}, {memorandumLink}, {privacyLink}!", + "poweredBy": "Powered by", + "confirmTransactionText": "Confirm transaction in {direction}", + "retryText": "Retry", + "networkFeeText": "Network Fee", + "networkFeeTooltipText": "Network fee is used to ensure {Sora} system's growth and stable performance.", + "ethNetworkFeeTooltipText": "Please note that the {Ethereum} network fees displayed on {AppName} are only rough estimations, you can see the correct fee amount in your connected {Ethereum} wallet prior to confirming the transaction.", + "marketText": "Market", + "marketAlgorithmText": "Market algorithm", + "firstPerSecond": "{first} per {second}", + "pairIsNotCreated": "Token pair isn't created", + "pageTitle": { + "Swap": "Swap", + "Pool": "Pool", + "Bridge": "@:bridgeText", + "About": "About", + "Stats": "Stats", + "Support": "Support", + "Wallet": "Wallet", + "CreatePair": "Create Pair", + "AddLiquidity": "Add Liquidity", + "AddLiquidityId": "Add Liquidity", + "RemoveLiquidity": "Remove Liquidity", + "PageNotFound": "Page Not Found", + "Tokens": "Tokens", + "Rewards": "Rewards" + }, + "mainMenu": { + "Swap": "Swap", + "Pool": "Pool", + "Bridge": "@:bridgeText", + "Farming": "Farming", + "Wallet": "Account", + "Rewards": "Rewards", + "About": "About", + "Stats": "Stats", + "Support": "Support", + "SoraCard": "SORA Card", + "CreatePair": "Create Pair", + "Tokens": "Tokens", + "StakingContainer": "Staking" + }, + "social": { + "twitter": "Twitter", + "telegram": "Telegram", + "medium": "Medium", + "reddit": "Reddit", + "github": "GitHub", + "wiki": "{Sora} Wiki" + }, + "footerMenu": { + "faucet": "Faucet", + "github": "GitHub", + "sorawiki": "{Sora} Wiki", + "memorandum": "{AppName} Memorandum and Terms of Services", + "privacy": "Privacy Policy", + "info": "Info & Community" + }, + "helpDialog": { + "title": "Help", + "termsOfService": "Terms of Service", + "privacyPolicy": "Privacy Policy", + "appVersion": "{AppName} version", + "contactUs": "Contact us" + }, + "aboutNetworkDialog": { + "title": "About", + "learnMore": "@:learnMoreText", + "network": { + "title": "What is {Sora}?", + "description": "{AppName} is built on top of the {Sora} Network, and the {Sora} token (XOR) is used for gas/fees and liquidity provision on {AppName}. {Sora} Network allows for reduced fees, faster transactions and simpler consensus finalization and is focused on delivering interoperability across other blockchain ecosystems like {Ethereum}." }, - "transfers": { - "from": "From", - "to": "To" + "polkadot": { + "title": "What is {PolkadotJs}?", + "description": "{PolkadotJs} extension is a browser extension available for Firefox and Chrome dedicated to managing accounts for Substrate-based chains, including {Sora}, {Polkadot} and {Kusama}. You can add, import, and export accounts and sign transactions or extrinsics that you have initiated from websites you have authorized." + } + }, + "node": { + "errors": { + "connection": "An error occurred while connecting to the node\n{address}\n", + "network": "The node\n{address}\n is from the another network\n", + "existing": "This node is already added: {title}\n" }, - "pageNotFound": { - "title": "Page not found", - "body": "404" + "messages": { + "connected": "Connection established with node\n{address}\n", + "selectNode": "Please select node to connect from the node list" }, - "metamask": "{Metamask}", - "sora": { - "Dev": "{Sora} Devnet", - "Test": "{Sora} Testnet", - "Prod": "{Sora} Mainnet", - "Stage": "{Sora} Testnet" - }, - "evm": { - "main": "{Ethereum} Mainnet", - "ropsten": "{Ethereum} Ropsten", - "rinkeby": "{Ethereum} Rinkeby", - "kovan": "{Ethereum} Kovan", - "goerli": "{Ethereum} Goerli", - "private": "Volta Testnet", - "EWC": "Energy Web Chain" - }, - "providers": { - "metamask": "{Metamask}" - }, - "about": { - "title": "The DEX for the Interoperable Future.", - "description": "Cross-chain exchange of assets, simple creation and listing of new assets, and the easiest swaps ever. The interoperable future of {Polkadot} is here and we are at the forefront!", - "trading": { - "title": "Faster Trading", - "first": "{AppName} is a non-custodial, cross-chain AMM DEX protocol for swapping tokens based on {Polkadot} and {Kusama} relay chains, {Polkadot} and {Kusama} parachains, and blockchains directly connected via bridges.", - "second": "{AppName} removes trusted intermediaries and provides the opportunity for faster trading", - "third": "{AppName} is a community project and devs collaborate on the open source code using the" - }, - "liquidity": { - "title": "Boundless Liquidity", - "first": "{AppName} combines multiple liquidity sources under a common liquidity aggregation algorithm, operating completely on-chain, in a trustless and decentralized way.", - "second": "When traders call the swap function, the liquidity aggregation algorithm will fill orders using the best offers across all liquidity sources. Liquidity sources can be other DEXs, order books, or other API-driven sources.", - "third": "Because {AppName} is an open-source project, anyone can add more liquidity sources by making contributions to the {AppName} codebase." - }, - "swap": { - "title": "Swap Any Token", - "first": "Go beyond the limits of current DEXs by adding tokens from the {Polkadot} ecosystem as well as other blockchains.", - "second": "Create, list and trade your own tokens on the {Sora} network.", - "third": "Our core infrastructure uses Parity Substrate, which is more scalable than {Ethereum}, and does not use expensive mining for consensus." - }, - "pswap": { - "title": "PSWAP Tokens", - "first": "PSWAP was created by community governance by voting on its release. It is a utility and governance token used to reward liquidity providers on {AppName}. Unlike most other reward tokens, PSWAP is burned with transactions and decreases in supply over time.", - "second": "The {percent}% fee for every swap on the {AppName} DEX is used to buy back PSWAP tokens, which are then burned. At first, 90% of burned PSWAP tokens are reminted to allocate to liquidity providers, but with time this percentage will decrease to 35% after 4 years." - }, - "links": { - "first": { - "title": "Become a {Sora} Validator", - "desc": "Secure the future of the {Sora} network and decentralized apps like {AppName}, and earn rewards along the way by becoming a {Sora} validator." - }, - "second": { - "title": "Connect a Chain to {Sora}", - "desc": "Grow the decentralized world economy by connecting more chains to {Sora} and {AppName} using the {Hashi} bridge protocol." - } - }, - "network": "{AppName} is built on the {Sora} Network, focusing on interoperability to connect the rest of the crypto ecosystem to {Polkadot}." - }, - "exchange": { - "Swap": "Swap", - "Pool": "Pool", - "balance": "Balance", - "insufficientBalance": "@:insufficientBalanceText", - "price": "Price", - "transactionSubmitted": "Transaction submitted", - "transactionMessage": "{firstToken} and {secondToken}", - "confirm": "Confirm", - "ok": "OK" + "warnings": { + "disconnect": "Connection to the node has been lost. Reconnecting..." + } + }, + "selectNodeDialog": { + "title": "{Sora} Network node selection", + "addNode": "Add custom node", + "customNode": "Custom node", + "howToSetupOwnNode": "How to setup your own {Sora} node", + "select": "Select", + "connected": "Connected", + "selectNodeForEnvironment": "Select a node for {environment} environment:", + "nodeTitle": "{chain} hosted by {name}", + "messages": { + "emptyName": "Please input the name of the node", + "emptyAddress": "Please input the address of the node", + "incorrectProtocol": "Address should starts from ws:// or wss://", + "incorrectAddress": "Incorrect address" + }, + "updateNode": "Update node" + }, + "buttons": { + "max": "MAX", + "chooseToken": "Choose token", + "chooseAToken": "Choose a token", + "chooseTokens": "Choose tokens", + "enterAmount": "Enter amount" + }, + "transfers": { + "from": "From", + "to": "To" + }, + "pageNotFound": { + "title": "Page not found", + "body": "404" + }, + "metamask": "{Metamask}", + "sora": { + "Dev": "{Sora} Devnet", + "Test": "{Sora} Testnet", + "Prod": "{Sora} Mainnet", + "Stage": "{Sora} Testnet" + }, + "evm": { + "main": "{Ethereum} Mainnet", + "ropsten": "{Ethereum} Ropsten", + "rinkeby": "{Ethereum} Rinkeby", + "kovan": "{Ethereum} Kovan", + "goerli": "{Ethereum} Goerli", + "private": "Volta Testnet", + "EWC": "Energy Web Chain" + }, + "providers": { + "metamask": "{Metamask}" + }, + "about": { + "title": "The DEX for the Interoperable Future.", + "description": "Cross-chain exchange of assets, simple creation and listing of new assets, and the easiest swaps ever. The interoperable future of {Polkadot} is here and we are at the forefront!", + "trading": { + "title": "Faster Trading", + "first": "{AppName} is a non-custodial, cross-chain AMM DEX protocol for swapping tokens based on {Polkadot} and {Kusama} relay chains, {Polkadot} and {Kusama} parachains, and blockchains directly connected via bridges.", + "second": "{AppName} removes trusted intermediaries and provides the opportunity for faster trading", + "third": "{AppName} is a community project and devs collaborate on the open source code using the" + }, + "liquidity": { + "title": "Boundless Liquidity", + "first": "{AppName} combines multiple liquidity sources under a common liquidity aggregation algorithm, operating completely on-chain, in a trustless and decentralized way.", + "second": "When traders call the swap function, the liquidity aggregation algorithm will fill orders using the best offers across all liquidity sources. Liquidity sources can be other DEXs, order books, or other API-driven sources.", + "third": "Because {AppName} is an open-source project, anyone can add more liquidity sources by making contributions to the {AppName} codebase." }, "swap": { - "connectWallet": "@:connectWalletText", - "estimated": "estimated", - "slippageTolerance": "Slippage Tolerance", - "minReceived": "Minimum Received", - "maxSold": "Maximum Sold", - "minReceivedTooltip": "Your transaction will revert if there is a large, unfavorable price movement before it is confirmed.", - "priceImpact": "Price Impact", - "priceImpactTooltip": "The difference between the market price and estimated price due to trade size.", - "liquidityProviderFee": "Liquidity Provider Fee", - "liquidityProviderFeeTooltip": "A portion of each trade ({liquidityProviderFee}%) goes to liquidity providers as a protocol incentive.", - "networkFee": "@:networkFeeText", - "pairIsNotCreated": "@:pairIsNotCreated", - "firstPerSecond": "@:firstPerSecond", - "insufficientAmount": "Insufficient {tokenSymbol} amount", - "insufficientLiquidity": "Insufficient liquidity", - "confirmSwap": "Confirm swap", - "swapOutputMessage": "Output is estimated. You will receive at least {transactionValue} or the transaction will revert.", - "rewardsForSwap": "PSWAP Strategic Rewards", - "swapInputMessage": "Input is estimated. You will sell maximum {transactionValue} or the transaction will revert.", - "route": "Route", - "errorFetching": "Error fetching the data" - }, - "pool": { - "connectWallet": "@:connectWalletText", - "connectToWallet": "Connect an account to view your liquidity.", - "liquidityNotFound": "No liquidity found.", - "addLiquidity": "Add liquidity", - "removeLiquidity": "Remove liquidity", - "createPair": "Create a pair", - "pooledToken": "{tokenSymbol} Pooled", - "pairTokens": "{pair} Pool Tokens", - "poolShare": "Your pool share", - "unknownAsset": "@:unknownAssetText", - "description": "When you add liquidity, you are given pool tokens representing your position. These tokens automatically earn fees proportional to your share of the pool, and can be redeemed at any time.", - "strategicBonusApy": "Strategic Bonus APY" - }, - "bridge": { - "title": "{Hashi} Bridge", - "info": "Convert tokens between the {Sora} and {Ethereum} networks.", - "balance": "Balance", - "connectWallet": "@:connectWalletText", - "connected": "@:connectedText", - "changeAccount": "@:changeAccountText", - "changeNetwork": "@:changeNetworkText", - "next": "Next", - "connectWallets": "Connect wallets to view respective transaction history.", - "soraNetworkFee": "{Sora} Network Fee", - "ethereumNetworkFee": "{Ethereum} Network Fee", - "tooltipValue": "@:comingSoonText", - "total": "Total", - "viewHistory": "View transactions history", - "transactionSubmitted": "Transaction submitted", - "transactionMessage": "{assetA} for {assetB}", - "notRegisteredAsset": "Asset {assetSymbol} is not registered", - "selectNetwork": "Select network", - "networkInfo": "Bridge {Sora} Network with:", - "ethereum": "{Ethereum}", - "energy": "@:evm.EWC", - "copy": "Copy network address", - "soraAddress": "{Sora} address", - "ethereumAddress": "{Ethereum} address" - }, - "selectRegisteredAsset": { - "title": "Select a token", - "search": { - "title": "Tokens", - "placeholder": "Filter by Asset ID, Name or Ticker Symbol", - "networkLabelSora": "{Sora} network tokens", - "networkLabelEthereum": "{Ethereum} network mirror tokens", - "emptyListMessage": "No results" - }, - "customAsset": { - "title": "Custom", - "customInfo": "Important! Custom tokens must be registered in {Sora}.", - "registerToken": "Register token", - "addressPlaceholder": "Asset ID", - "symbolPlaceholder": "Token symbol", - "empty": "No tokens found", - "alreadyAttached": "Token was already attached" - } - }, - "confirmBridgeTransactionDialog": { - "confirmTransaction": "Confirm transaction", - "insufficientBalance": "@:insufficientBalanceText", - "changeNetwork": "@:changeNetworkText", - "confirm": "@:confirmTransactionText", - "buttonConfirm": "@:confirmText" - }, - "bridgeTransaction": { - "details": "{from} for {to}", - "for": " for ", - "steps": { - "step": "{step} of 2", - "step1": "1st", - "step2": "2nd" - }, - "status": { - "pending": "{step} transactions pending...", - "failed": "{step} transactions failed. @:(retryText).", - "confirm": "Confirm 2nd of 2 transactions...", - "complete": "Complete", - "convertionComplete": "Conversion complete" - }, - "statuses": { - "waiting": "Waiting", - "ready": "Ready", - "pending": "Pending", - "frozen": "Frozen", - "failed": "Transaction failed", - "done": "Complete", - "waitingForConfirmation": "Waiting for confirmation..." - }, - "viewInEtherscan": "View in {Etherscan}", - "networkTitle": "{network} transaction", - "transactionHash": "Transaction hash", - "networkInfo": { - "status": "Status", - "date": "Date", - "amount": "Amount", - "transactionFee": "Transaction Fee", - "total": "Total" - }, - "successCopy": "Transaction hash is copied to the clipboard", - "ethereum": "{Ethereum}", - "sora": "{Sora}", - "pending": "{network} transaction pending...", - "retry": "@:retryText", - "metamask": "{Metamask}", - "confirm": "@:confirmTransactionText", - "newTransaction": "Create new transaction", - "changeNetwork": "@:changeNetworkText", - "connectWallet": "@:connectWalletText", - "changeAccount": "@:changeAccountText in {Metamask}", - "expectedAddress": "Expected address in {Metamask}", - "title": "Bridge Transaction", - "expectedMetaMaskAddress": "Expected address in {Metamask}:", - "allowToken": "Allow {AppName} to use your {tokenSymbol}", - "approveToken": "Please note that it is only needed to approve the token once. If your extension has multiple token approval requests, make sure to only confirm the last one while rejecting the rest.", - "blocksLeft": "{count} blocks left..." - }, - "bridgeHistory": { - "title": "History", - "showHistory": "Show history", - "clearHistory": "Clear history", - "empty": "Your transactions will appear here.", - "filterPlaceholder": "Filter by Asset ID or Ticker Symbol", - "restoreHistory": "Restore history", - "statusAction": "Action Needed" - }, - "selectToken": { - "title": "Select a token", - "searchPlaceholder": "Filter by Asset ID, Name or Ticker Symbol", - "emptyListMessage": "No results", - "copy": "Copy Asset ID", - "successCopy": "{symbol} Asset ID is copied to the clipboard", - "assets": { - "title": "Assets" - }, - "custom": { - "title": "Custom", - "search": "Input Asset ID", - "text": "CUSTOM TOKENS", - "alreadyAttached": "This token was already attached", - "notFound": "Token not found" - } - }, - "createPair": { - "title": "Create a pair", - "deposit": "Deposit", - "balance": "Balance", - "pricePool": "Prices and fees", - "shareOfPool": "Share of pool", - "firstPerSecond": "@:firstPerSecond", - "firstSecondPoolTokens": "{first}-{second} Pool", - "connect": "Connect wallet", - "supply": "Supply", - "yourPosition": "Your position", - "yourPositionEstimated": "Your position (estimated)", - "youWillReceive": "You will receive", - "remove": "remove", - "add": "ADD", - "ok": "OK", - "networkFee": "@:networkFeeText", - "alreadyCreated": "Token pair is already created", - "firstLiquidityProvider": "You are the first liquidity provider", - "firstLiquidityProviderInfo": "The ratio of tokens you add will set the price of this pool.Once you are happy with the rate click supply to review." - }, - "confirmSupply": { - "title": "Your pool share will be", - "outputDescription": "Output is estimated. If the price changes more than {slippageTolerance}% your transaction will revert.", - "poolTokensBurned": "{first}-{second} Pool Tokens Burned", - "price": "Price" - }, - "addLiquidity": { - "title": "Add liquidity", - "pairIsNotCreated": "@:pairIsNotCreated", - "firstPerSecond": "@:firstPerSecond" - }, - "removeLiquidity": { - "title": "Remove liquidity", - "liquidity": "liquidity", - "balance": "Balance", - "amount": "Amount", - "input": "Input", - "output": "Output", - "price": "Price", - "remove": "Remove", - "description": "Removing pool tokens converts your position back into underlying tokens at the current rate, proportional to your share of the pool. Accrued fees are included in the amounts you receive.", - "outputMessage": "Output is estimated. If the price changes more than {slippageTolerance}% your transaction will revert.", - "confirmTitle": "You will receive", - "shareOfPool": "Share of pool after transaction", - "locked": "{percent} of your pool is in staking" - }, - "dexSettings": { - "title": "Settings", - "marketAlgorithm": "@.upper:marketAlgorithmText", - "marketAlgorithmTooltip": { - "main": " - option to choose between Primary Market (TBC), Secondary Market (XYK) or a combined smart algorithm for guaranteed best price for any given transaction." - }, - "slippageTolerance": "SLIPPAGE TOLERANCE", - "slippageToleranceHint": "Your transaction will revert if the price changes unfavorably by more than this percentage.", - "slippageToleranceValidation": { - "warning": "Your transaction may fail", - "frontrun": "Your transaction may be frontrun", - "error": "Enter a valid slippage percentage" - }, - "custom": "CUSTOM", - "transactionDeadline": "TRANSACTION DEADLINE", - "transactionDeadlineHint": "Transaction will be cancelled if it is pending for more than this long.", - "nodeAddress": "NODE ADDRESS", - "ip": "IP", - "port": "PORT", - "min": "MIN", - "marketAlgorithms": { - "SMART": "{smartAlgorithm} liquidity routing ensures the best price for any transaction by combining only the best price options from all available markets. When available, Token Bonding Curve ({tbcAlgorithm}) will be used for liquidity as long as the asset price is more affordable than from other sources, upon which the {xycAlgorithm} pool is utilized.", - "TBC": "{tbcAlgorithm} — buying only from the Token Bonding Curve (Primary Market). There is a possibility that the price can become unfavorable compared to the {xycAlgorithm} pool (Secondary Market), but the value received from the vested rewards might turn out to be much more favorable over time.", - "XYK": "{xycAlgorithm} — buying only from the XYK Pool (Secondary Market). Traditional XYK pool swap." - }, - "charts": "Charts", - "сhartsDescription": "View charts for token prices" - }, - "resultDialog": { - "title": "Transaction submitted", - "ok": "OK" - }, - "rewards": { - "title": "Claim Rewards", - "changeAccount": "@:changeAccountText", - "connected": "@:connectedText", - "networkFee": "@:networkFeeText", - "andText": "and", - "claiming": { - "pending": "Claiming...", - "success": "Claimed successfully" - }, - "transactions": { - "confimation": "Confirm {order} of {total} transactions...", - "success": "You will receive your rewards shortly", - "failed": "{order} of {total} transactions failed. @:retryText" - }, - "signing": { - "extension": "{PolkadotJs} browser extension", - "accounts": "your {Sora} and {Ethereum} accounts respectively" - }, - "hint": { - "connectExternalAccount": "Connect an {Ethereum} account to check for available PSWAP and VAL rewards.", - "connectAccounts": "To claim your PSWAP and VAL rewards you need to connect both your {Sora} and {Ethereum} accounts.", - "connectAnotherAccount": "Connect another {Ethereum} account to check for available PSWAP and VAL rewards.", - "howToClaimRewards": "To claim your {symbols} rewards you need to sign {count} {transactions} in {destination}. Rewards will be deposited to your {Sora} account." - }, - "action": { - "connectWallet": "@:connectWalletText", - "connectExternalWallet": "Connect {Ethereum} account", - "signAndClaim": "Sign and claim", - "pendingInternal": "{Sora} transaction pending...", - "pendingExternal": "{Ethereum} transaction pending...", - "retry": "@:retryText", - "checkRewards": "Check", - "insufficientBalance": "@:insufficientBalanceText" - }, - "notification": { - "empty": "No available claims for this account" - }, - "events": { - "XorErc20": "XOR ERC-20", - "SoraFarmHarvest": "{Sora}.farm harvest", - "NtfAirdrop": "NFT Airdrop", - "LiquidityProvision": "Fees gained from liquidity provision", - "BuyOnBondingCurve": "buying from the TBC", - "MarketMakerVolume": "Market Making", - "LiquidityProvisionFarming": "Farming" - }, - "vested": "vested", - "forText": "for", - "totalVested": "Total rewards", - "claimableAmountDoneVesting": "Claimable rewards", - "groups": { - "strategic": "Strategic Rewards", - "external": "Rewards for the connected {Ethereum} account", - "crowdloan": "Crowdloan rewards" - }, - "Rewards": "Rewards", - "ReferralProgram": "@:referralProgram.title" - }, - "provider": { - "default": "{Ethereum} provider", - "metamask": "{Metamask}", - "messages": { - "checkExtension": "{name} extension is busy, please check it", - "extensionLogin": "Please login to your {name} extension", - "installExtension": "{name} extension is not found. Please install it!\n\nAlready installed extension? Please reload the page", - "reloadPage": "Reload page" - } - }, - "selectLanguageDialog": { - "title": "Language" - }, - "tokens": { - "title": "Listed Tokens", - "symbol": "Symbol", - "name": "Name", - "assetId": "Asset ID" + "title": "Swap Any Token", + "first": "Go beyond the limits of current DEXs by adding tokens from the {Polkadot} ecosystem as well as other blockchains.", + "second": "Create, list and trade your own tokens on the {Sora} network.", + "third": "Our core infrastructure uses Parity Substrate, which is more scalable than {Ethereum}, and does not use expensive mining for consensus." }, - "memorandum": "{AppName} Memorandum and Terms of Services", - "FAQ": "{AppName} FAQ", - "connectedAccount": "Connected account", - "selectNodeConnected": "Connected to: {chain}", - "moonpayText": "MoonPay", + "pswap": { + "title": "PSWAP Tokens", + "first": "PSWAP was created by community governance by voting on its release. It is a utility and governance token used to reward liquidity providers on {AppName}. Unlike most other reward tokens, PSWAP is burned with transactions and decreases in supply over time.", + "second": "The {percent}% fee for every swap on the {AppName} DEX is used to buy back PSWAP tokens, which are then burned. At first, 90% of burned PSWAP tokens are reminted to allocate to liquidity providers, but with time this percentage will decrease to 35% after 4 years." + }, + "links": { + "first": { + "title": "Become a {Sora} Validator", + "desc": "Secure the future of the {Sora} network and decentralized apps like {AppName}, and earn rewards along the way by becoming a {Sora} validator." + }, + "second": { + "title": "Connect a Chain to {Sora}", + "desc": "Grow the decentralized world economy by connecting more chains to {Sora} and {AppName} using the {Hashi} bridge protocol." + } + }, + "network": "{AppName} is built on the {Sora} Network, focusing on interoperability to connect the rest of the crypto ecosystem to {Polkadot}." + }, + "exchange": { + "Swap": "Swap", + "Pool": "Pool", + "balance": "Balance", + "insufficientBalance": "@:insufficientBalanceText", + "price": "Price", + "transactionSubmitted": "Transaction submitted", + "transactionMessage": "{firstToken} and {secondToken}", + "confirm": "Confirm", + "ok": "OK" + }, + "swap": { + "connectWallet": "@:connectWalletText", + "estimated": "estimated", + "slippageTolerance": "Slippage Tolerance", + "minReceived": "Minimum Received", + "maxSold": "Maximum Sold", + "minReceivedTooltip": "Your transaction will revert if there is a large, unfavorable price movement before it is confirmed.", + "priceImpact": "Price Impact", + "priceImpactTooltip": "The difference between the market price and estimated price due to trade size.", + "liquidityProviderFee": "Liquidity Provider Fee", + "liquidityProviderFeeTooltip": "A portion of each trade ({liquidityProviderFee}%) goes to liquidity providers as a protocol incentive.", + "networkFee": "@:networkFeeText", + "pairIsNotCreated": "@:pairIsNotCreated", + "firstPerSecond": "@:firstPerSecond", + "insufficientAmount": "Insufficient {tokenSymbol} amount", + "insufficientLiquidity": "Insufficient liquidity", + "confirmSwap": "Confirm swap", + "swapOutputMessage": "Output is estimated. You will receive at least {transactionValue} or the transaction will revert.", + "rewardsForSwap": "PSWAP Strategic Rewards", + "swapInputMessage": "Input is estimated. You will sell maximum {transactionValue} or the transaction will revert.", + "route": "Route", + "errorFetching": "Error fetching the data" + }, + "pool": { + "connectWallet": "@:connectWalletText", + "connectToWallet": "Connect an account to view your liquidity.", + "liquidityNotFound": "No liquidity found.", + "addLiquidity": "Add liquidity", + "removeLiquidity": "Remove liquidity", + "createPair": "Create a pair", + "pooledToken": "{tokenSymbol} Pooled", + "pairTokens": "{pair} Pool Tokens", + "poolShare": "Your pool share", + "unknownAsset": "@:unknownAssetText", + "description": "When you add liquidity, you are given pool tokens representing your position. These tokens automatically earn fees proportional to your share of the pool, and can be redeemed at any time.", + "strategicBonusApy": "Strategic Bonus APY" + }, + "bridge": { + "title": "{Hashi} Bridge", + "info": "Convert tokens between the {Sora} and {Ethereum} networks.", + "balance": "Balance", + "connectWallet": "@:connectWalletText", + "connected": "@:connectedText", + "changeAccount": "@:changeAccountText", + "changeNetwork": "@:changeNetworkText", + "next": "Next", + "connectWallets": "Connect wallets to view respective transaction history.", + "soraNetworkFee": "{Sora} Network Fee", + "ethereumNetworkFee": "{Ethereum} Network Fee", + "tooltipValue": "@:comingSoonText", + "total": "Total", + "viewHistory": "View transactions history", + "transactionSubmitted": "Transaction submitted", + "transactionMessage": "{assetA} for {assetB}", + "notRegisteredAsset": "Asset {assetSymbol} is not registered", + "selectNetwork": "Select network", + "networkInfo": "Bridge {Sora} Network with:", + "ethereum": "{Ethereum}", + "energy": "@:evm.EWC", + "copy": "Copy network address", + "soraAddress": "{Sora} address", + "ethereumAddress": "{Ethereum} address" + }, + "selectRegisteredAsset": { + "title": "Select a token", + "search": { + "title": "Tokens", + "placeholder": "Filter by Asset ID, Name or Ticker Symbol", + "networkLabelSora": "{Sora} network tokens", + "networkLabelEthereum": "{Ethereum} network mirror tokens", + "emptyListMessage": "No results" + }, + "customAsset": { + "title": "Custom", + "customInfo": "Important! Custom tokens must be registered in {Sora}.", + "registerToken": "Register token", + "addressPlaceholder": "Asset ID", + "symbolPlaceholder": "Token symbol", + "empty": "No tokens found", + "alreadyAttached": "Token was already attached" + } + }, + "confirmBridgeTransactionDialog": { + "confirmTransaction": "Confirm transaction", + "insufficientBalance": "@:insufficientBalanceText", + "changeNetwork": "@:changeNetworkText", + "confirm": "@:confirmTransactionText", + "buttonConfirm": "@:confirmText" + }, + "bridgeTransaction": { + "details": "{from} for {to}", + "for": " for ", + "steps": { + "step": "{step} of 2", + "step1": "1st", + "step2": "2nd" + }, + "status": { + "pending": "{step} transactions pending...", + "failed": "{step} transactions failed. @:(retryText).", + "confirm": "Confirm 2nd of 2 transactions...", + "complete": "Complete", + "convertionComplete": "Conversion complete" + }, + "statuses": { + "waiting": "Waiting", + "ready": "Ready", + "pending": "Pending", + "frozen": "Frozen", + "failed": "Transaction failed", + "done": "Complete", + "waitingForConfirmation": "Waiting for confirmation..." + }, + "viewInEtherscan": "View in {Etherscan}", + "networkTitle": "{network} transaction", + "transactionHash": "Transaction hash", + "networkInfo": { + "status": "Status", + "date": "Date", + "amount": "Amount", + "transactionFee": "Transaction Fee", + "total": "Total" + }, + "successCopy": "Transaction hash is copied to the clipboard", + "ethereum": "{Ethereum}", + "sora": "{Sora}", + "pending": "{network} transaction pending...", + "retry": "@:retryText", + "metamask": "{Metamask}", + "confirm": "@:confirmTransactionText", + "newTransaction": "Create new transaction", + "changeNetwork": "@:changeNetworkText", + "connectWallet": "@:connectWalletText", + "changeAccount": "@:changeAccountText in {Metamask}", + "expectedAddress": "Expected address in {Metamask}", + "title": "Bridge Transaction", + "expectedMetaMaskAddress": "Expected address in {Metamask}:", + "allowToken": "Allow {AppName} to use your {tokenSymbol}", + "approveToken": "Please note that it is only needed to approve the token once. If your extension has multiple token approval requests, make sure to only confirm the last one while rejecting the rest.", + "blocksLeft": "{count} blocks left..." + }, + "bridgeHistory": { + "title": "History", + "showHistory": "Show history", + "clearHistory": "Clear history", + "empty": "Your transactions will appear here.", + "filterPlaceholder": "Filter by Asset ID or Ticker Symbol", + "restoreHistory": "Restore history", + "statusAction": "Action Needed" + }, + "selectToken": { + "title": "Select a token", + "searchPlaceholder": "Filter by Asset ID, Name or Ticker Symbol", + "emptyListMessage": "No results", + "copy": "Copy Asset ID", + "successCopy": "{symbol} Asset ID is copied to the clipboard", + "assets": { + "title": "Assets" + }, + "custom": { + "title": "Custom", + "search": "Input Asset ID", + "text": "CUSTOM TOKENS", + "alreadyAttached": "This token was already attached", + "notFound": "Token not found" + } + }, + "createPair": { + "title": "Create a pair", + "deposit": "Deposit", + "balance": "Balance", + "pricePool": "Prices and fees", + "shareOfPool": "Share of pool", + "firstPerSecond": "@:firstPerSecond", + "firstSecondPoolTokens": "{first}-{second} Pool", + "connect": "Connect wallet", + "supply": "Supply", + "yourPosition": "Your position", + "yourPositionEstimated": "Your position (estimated)", + "youWillReceive": "You will receive", + "remove": "remove", + "add": "ADD", + "ok": "OK", + "networkFee": "@:networkFeeText", + "alreadyCreated": "Token pair is already created", + "firstLiquidityProvider": "You are the first liquidity provider", + "firstLiquidityProviderInfo": "The ratio of tokens you add will set the price of this pool.
Once you are happy with the rate click supply to review." + }, + "confirmSupply": { + "title": "Your pool share will be", + "outputDescription": "Output is estimated. If the price changes more than {slippageTolerance}% your transaction will revert.", + "poolTokensBurned": "{first}-{second} Pool Tokens Burned", + "price": "Price" + }, + "addLiquidity": { + "title": "Add liquidity", + "pairIsNotCreated": "@:pairIsNotCreated", + "firstPerSecond": "@:firstPerSecond" + }, + "removeLiquidity": { + "title": "Remove liquidity", + "liquidity": "liquidity", + "balance": "Balance", + "amount": "Amount", + "input": "Input", + "output": "Output", + "price": "Price", + "remove": "Remove", + "description": "Removing pool tokens converts your position back into underlying tokens at the current rate, proportional to your share of the pool. Accrued fees are included in the amounts you receive.", + "outputMessage": "Output is estimated. If the price changes more than {slippageTolerance}% your transaction will revert.", + "confirmTitle": "You will receive", + "shareOfPool": "Share of pool after transaction", + "locked": "{percent} of your pool is in staking" + }, + "dexSettings": { + "title": "Settings", + "marketAlgorithm": "@.upper:marketAlgorithmText", + "marketAlgorithmTooltip": { + "main": " - option to choose between Primary Market (TBC), Secondary Market (XYK) or a combined smart algorithm for guaranteed best price for any given transaction." + }, + "slippageTolerance": "SLIPPAGE TOLERANCE", + "slippageToleranceHint": "Your transaction will revert if the price changes unfavorably by more than this percentage.", + "slippageToleranceValidation": { + "warning": "Your transaction may fail", + "frontrun": "Your transaction may be frontrun", + "error": "Enter a valid slippage percentage" + }, + "custom": "CUSTOM", + "transactionDeadline": "TRANSACTION DEADLINE", + "transactionDeadlineHint": "Transaction will be cancelled if it is pending for more than this long.", + "nodeAddress": "NODE ADDRESS", + "ip": "IP", + "port": "PORT", + "min": "MIN", + "marketAlgorithms": { + "SMART": "{smartAlgorithm} liquidity routing ensures the best price for any transaction by combining only the best price options from all available markets. When available, Token Bonding Curve ({tbcAlgorithm}) will be used for liquidity as long as the asset price is more affordable than from other sources, upon which the {xycAlgorithm} pool is utilized.", + "TBC": "{tbcAlgorithm} — buying only from the Token Bonding Curve (Primary Market). There is a possibility that the price can become unfavorable compared to the {xycAlgorithm} pool (Secondary Market), but the value received from the vested rewards might turn out to be much more favorable over time.", + "XYK": "{xycAlgorithm} — buying only from the XYK Pool (Secondary Market). Traditional XYK pool swap." + }, + "charts": "Charts", + "сhartsDescription": "View charts for token prices" + }, + "resultDialog": { + "title": "Transaction submitted", + "ok": "OK" + }, + "rewards": { + "title": "Claim Rewards", + "changeAccount": "@:changeAccountText", + "connected": "@:connectedText", + "networkFee": "@:networkFeeText", + "andText": "and", + "claiming": { + "pending": "Claiming...", + "success": "Claimed successfully" + }, + "transactions": { + "confimation": "Confirm {order} of {total} transactions...", + "success": "You will receive your rewards shortly", + "failed": "{order} of {total} transactions failed. @:retryText" + }, + "signing": { + "extension": "{PolkadotJs} browser extension", + "accounts": "your {Sora} and {Ethereum} accounts respectively" + }, + "hint": { + "connectExternalAccount": "Connect an {Ethereum} account to check for available PSWAP and VAL rewards.", + "connectAccounts": "To claim your PSWAP and VAL rewards you need to connect both your {Sora} and {Ethereum} accounts.", + "connectAnotherAccount": "Connect another {Ethereum} account to check for available PSWAP and VAL rewards.", + "howToClaimRewards": "To claim your {symbols} rewards you need to sign {count} {transactions} in {destination}. Rewards will be deposited to your {Sora} account." + }, + "action": { + "connectWallet": "@:connectWalletText", + "connectExternalWallet": "Connect {Ethereum} account", + "signAndClaim": "Sign and claim", + "pendingInternal": "{Sora} transaction pending...", + "pendingExternal": "{Ethereum} transaction pending...", + "retry": "@:retryText", + "checkRewards": "Check", + "insufficientBalance": "@:insufficientBalanceText" + }, + "notification": { + "empty": "No available claims for this account" + }, + "events": { + "XorErc20": "XOR ERC-20", + "SoraFarmHarvest": "{Sora}.farm harvest", + "NtfAirdrop": "NFT Airdrop", + "LiquidityProvision": "Fees gained from liquidity provision", + "BuyOnBondingCurve": "buying from the TBC", + "MarketMakerVolume": "Market Making", + "LiquidityProvisionFarming": "Farming" + }, + "vested": "vested", "forText": "for", - "moonpay": { - "notifications": { - "success": { - "title": "Tokens purchased", - "text": "Token purchase is finished. The {Hashi} bridge transaction will start automatically as soon as the tokens have been received in the connected {Ethereum} account. It is safe to close this window and continue using {AppName}. There will be a notification about the bridge transaction when ready." - }, - "supportError": { - "title": "Token not supported", - "text": "Unfortunately the token purchased via @:moonpayText is not yet supported by the {Hashi} bridge in {AppName}. Normally only the supported tokens should be available for purchase via MoonPay in {AppName}, hence something must have gone wrong somewhere. Please don’t hesitate to let the community know about this case in the {AppName} Telegram group<\/a>." - }, - "feeError": { - "title": "Not enough ETH for the bridge tx", - "text": "Unfortunately the {Hashi} bridge transaction has failed due to there not being enough ETH to pay for the {Ethereum} network transation fees. Please add more ETH and try again." - }, - "transactionError": { - "title": "Transaction has failed", - "text": "Unfortunately it appears that the @:moonpayText transaction has failed. Please try again. For @:moonpayText support go to https:\/\/support.moonpay.com<\/a>" - }, - "amountError": { - "title": "Insufficient balance", - "text": "Unfortunately the {Hashi} bridge transaction has failed due to there not being enough tokens for transaction. Please check your {Ethereum} account balance and try again." - }, - "accountAddressError": { - "title": "Wrong {Ethereum} account", - "text": "Unfortunately, the {Hashi} bridge transaction failed due to the recipient address of the tokens in the @:moonpayText order does not match your current {Ethereum} account address. Please switch {Ethereum} account in extension and try again." - } - }, - "buttons": { - "buy": "Buy Tokens", - "history": "Purchase History", - "transfer": "Start bridge", - "view": "View bridge transaction" - }, - "history": { - "title": "Purchase history", - "empty": "@:noDataText" - }, - "confirmations": { - "txReady": "Transaction Ready For Bridge" - }, - "tooltips": { - "transfer": "Tokens successfully purchased!\nClick to start the bridge transaction" - } - }, - "light": "Light", - "dark": "Dark", - "headerMenu": { - "showBalances": "Show Balances", - "hideBalances": "Hide Balances", - "settings": "Settings", - "switchTheme": "Switch to {theme} Mode", - "switchLanguage": "Choose Language", - "selectNode": "@:selectNodeText" - }, - "sentText": "Sent", - "learnMoreText": "Learn more", - "marketMakerCountdown": { - "title": "Market Maker Countdown", - "blocks": "blocks", - "daysLeft": "days left", - "txs": "TXs", - "volume": "MM TX volume", - "description": "20 million PSWAP \/ month will be distributed to market makers with at least 500 tx \/ month valued over 1 XOR." - }, - "confirmNextTxFailure": { - "header": "Attention", - "info": "Your XOR balance will be less than {fee} XOR after this transaction. You won’t be able to pay for the network fee for another transaction.", - "payoff": "You would have to use the Bridge to get XOR from other networks, get sent XOR from another {Sora} account, or swap any other token already in your account into XOR.", - "button": "Yes, I understand the risk" - }, - "blockNumberText": "Block number", - "referralProgram": { - "title": "Referral Program", - "connectAccount": "To invite users you need to connect your {Sora} account.", - "bondedXOR": "XOR Bonded", - "referralsNumber": "{number} referrals", - "startInviting": "Bond XOR to refer others", - "preview": "Invite new users and get 10% from their transaction fees.To start, bond any amount of XOR. Learn more<\/a>", - "deposit": "Deposit", - "balance": "Balance", - "networkFee": "@:networkFeeText", - "insufficientBalance": "@:insufficientBalanceText", - "insufficientBondedBalance": "Insufficient bonded balance", - "action": { - "connectWallet": "@:connectWalletText", - "empty": "Enter amount of {tokenSymbol}", - "startInviting": "Bond {tokenSymbol} to start inviting", - "bondMore": "Bond More", - "bond": "Bond", - "unbond": "Unbond", - "copyLink": "Copy link" - }, - "transactionDetails": "Transaction Details", - "receivedRewards": "Received rewards", - "invitationLink": "Invitation link", - "successCopy": "Referral link is copied to the clipboard", - "bondTitle": "Bond XOR", - "unbondTitle": "Unbond XOR", - "confirm": { - "text": "Confirm", - "bond": "Confirm bond", - "unbond": "Confirm unbond", - "inviteTitle": "You have been invited to {AppName}", - "inviteDescription": "For every transaction, 10% of the fee will go to your referrer, without any extra cost to you.", - "signInvitation": "Approve", - "freeOfCharge": "This action is free of charge", - "hasReferrerTitle": "You’ve already set your referrer", - "hasReferrerDescription": "Unfortunately, you can only set one", - "ok": "OK" - }, - "referrer": { - "title": "Add your referrer", - "titleReferrer": "Your referrer", - "placeholder": "Enter invitation link or code", - "label": "Invitation link or code", - "approve": "Approve", - "approved": "Approved", - "description": "You can get referred to {AppName},type in the link or code of the referrer", - "referredBy": "You’ve been referred by {referrer}", - "info": "When you’ll pay a fee for transaction,10% will go to your referrer", - "referredLablel": "Referred address" - }, - "insufficientBondedAmount": "To invite more referrals, bond at least {inviteUserFee} XOR" - }, - "transactionDetailsText": "Transaction Details", - "createTokenTextNFT": "Create NFT", - "code": { - "download": "Download QR Code", - "upload": "Scan QR", - "invalid": "Invalid QR Code", - "import": "Import an image", - "scan": "Scan with camera", - "allowanceError": "Check your camera availability and browser permissions to use it", - "receive": "Receive", - "camera": "Camera", - "allowanceRequest": "Press “Allow” access to camera" - }, - "bridgeTransferNotification": { - "addToken": "Add {symbol} to {Metamask}", - "title": "Bridge transaction successful" - }, - "mobilePopup": { - "sideMenu": "Get {Sora} Wallet", - "header": "Download {Sora} Wallet with {polkaswapHighlight} features", - "info": "Swap tokens from different networks - {Sora}, {Ethereum}, {Polkadot}, {Kusama}. Provide liquidity pool and earn % from exchange fees." - }, - "releaseNotesText": "Release notes", - "copiedText": "Copied!", - "copyWithValue": "Copy {value}", - "copiedWithValue": "{value} is copied!", - "signAndClaimText": "Sign and claim", - "balanceText": "Balance", - "unknownAssetText": "Unknown asset", - "demeterFarming": { - "staking": { - "active": "Staking active", - "inactive": "Stake to earn additional rewards", - "stopped": "Staking stopped" - }, - "info": { - "earned": "{symbol} earned", - "fee": "Fee", - "feeTooltip": "Deposit fee is applied to your amount to stake", - "owned": "{symbol} @:balanceText", - "poolShare": "Your pool share staked", - "poolShareWillBe": "Your pool share staked will be", - "rewardToken": "Reward token", - "stake": "Your {symbol} staked", - "stakeWillBe": "Your {symbol} stake will be", - "totalLiquidityLocked": "Total liquidity locked" - }, - "actions": { - "add": "Stake more", - "claim": "Claim rewards", - "remove": "Remove stake", - "start": "Start staking" - }, - "amountAdd": "Amount to stake", - "amountRemove": "Amount to remove", - "poweredBy": "Powered by Demeter Farming", - "calculator": "Calculator", - "results": "Results", - "rewards": "{symbol} rewards" + "totalVested": "Total rewards", + "claimableAmountDoneVesting": "Claimable rewards", + "groups": { + "strategic": "Strategic Rewards", + "external": "Rewards for the connected {Ethereum} account", + "crowdloan": "Crowdloan rewards" + }, + "Rewards": "Rewards", + "ReferralProgram": "@:referralProgram.title" + }, + "provider": { + "default": "{Ethereum} provider", + "metamask": "{Metamask}", + "messages": { + "checkExtension": "{name} extension is busy, please check it", + "extensionLogin": "Please login to your {name} extension", + "installExtension": "{name} extension is not found. Please install it!\n\nAlready installed extension? Please reload the page", + "reloadPage": "Reload page" + } + }, + "selectLanguageDialog": { + "title": "Language" + }, + "tokens": { + "title": "Listed Tokens", + "symbol": "Symbol", + "name": "Name", + "assetId": "Asset ID" + }, + "memorandum": "{AppName} Memorandum and Terms of Services", + "FAQ": "{AppName} FAQ", + "connectedAccount": "Connected account", + "selectNodeConnected": "Connected to: {chain}", + "moonpayText": "MoonPay", + "forText": "for", + "moonpay": { + "notifications": { + "success": { + "title": "Tokens purchased", + "text": "Token purchase is finished. The {Hashi} bridge transaction will start automatically as soon as the tokens have been received in the connected {Ethereum} account. It is safe to close this window and continue using {AppName}. There will be a notification about the bridge transaction when ready." + }, + "supportError": { + "title": "Token not supported", + "text": "Unfortunately the token purchased via @:moonpayText is not yet supported by the {Hashi} bridge in {AppName}. Normally only the supported tokens should be available for purchase via MoonPay in {AppName}, hence something must have gone wrong somewhere. Please don’t hesitate to let the community know about this case in the {AppName} Telegram group." + }, + "feeError": { + "title": "Not enough ETH for the bridge tx", + "text": "Unfortunately the {Hashi} bridge transaction has failed due to there not being enough ETH to pay for the {Ethereum} network transation fees. Please add more ETH and try again." + }, + "transactionError": { + "title": "Transaction has failed", + "text": "Unfortunately it appears that the @:moonpayText transaction has failed. Please try again. For @:moonpayText support go to https://support.moonpay.com" + }, + "amountError": { + "title": "Insufficient balance", + "text": "Unfortunately the {Hashi} bridge transaction has failed due to there not being enough tokens for transaction. Please check your {Ethereum} account balance and try again." + }, + "accountAddressError": { + "title": "Wrong {Ethereum} account", + "text": "Unfortunately, the {Hashi} bridge transaction failed due to the recipient address of the tokens in the @:moonpayText order does not match your current {Ethereum} account address. Please switch {Ethereum} account in extension and try again." + } + }, + "buttons": { + "buy": "Buy Tokens", + "history": "Purchase History", + "transfer": "Start bridge", + "view": "View bridge transaction" }, + "history": { + "title": "Purchase history", + "empty": "@:noDataText" + }, + "confirmations": { + "txReady": "Transaction Ready For Bridge" + }, + "tooltips": { + "transfer": "Tokens successfully purchased!\nClick to start the bridge transaction" + } + }, + "light": "Light", + "dark": "Dark", + "headerMenu": { + "showBalances": "Show Balances", + "hideBalances": "Hide Balances", + "settings": "Settings", + "switchTheme": "Switch to {theme} Mode", + "switchLanguage": "Choose Language", + "selectNode": "@:selectNodeText" + }, + "sentText": "Sent", + "learnMoreText": "Learn more", + "marketMakerCountdown": { + "title": "Market Maker Countdown", + "blocks": "blocks", + "daysLeft": "days left", + "txs": "TXs", + "volume": "MM TX volume", + "description": "20 million PSWAP / month will be distributed to market makers with at least 500 tx / month valued over 1 XOR." + }, + "confirmNextTxFailure": { + "header": "Attention", + "info": "Your XOR balance will be less than {fee} XOR after this transaction. You won’t be able to pay for the network fee for another transaction.", + "payoff": "You would have to use the Bridge to get XOR from other networks, get sent XOR from another {Sora} account, or swap any other token already in your account into XOR.", + "button": "Yes, I understand the risk" + }, + "blockNumberText": "Block number", + "referralProgram": { + "title": "Referral Program", + "connectAccount": "To invite users you need to connect your {Sora} account.", + "bondedXOR": "XOR Bonded", + "referralsNumber": "{number} referrals", + "startInviting": "Bond XOR to refer others", + "preview": "Invite new users and get 10% from their transaction fees.
To start, bond any amount of XOR. Learn more", + "deposit": "Deposit", + "balance": "Balance", + "networkFee": "@:networkFeeText", + "insufficientBalance": "@:insufficientBalanceText", + "insufficientBondedBalance": "Insufficient bonded balance", + "action": { + "connectWallet": "@:connectWalletText", + "empty": "Enter amount of {tokenSymbol}", + "startInviting": "Bond {tokenSymbol} to start inviting", + "bondMore": "Bond More", + "bond": "Bond", + "unbond": "Unbond", + "copyLink": "Copy link" + }, + "transactionDetails": "Transaction Details", + "receivedRewards": "Received rewards", + "invitationLink": "Invitation link", + "successCopy": "Referral link is copied to the clipboard", + "bondTitle": "Bond XOR", + "unbondTitle": "Unbond XOR", + "confirm": { + "text": "Confirm", + "bond": "Confirm bond", + "unbond": "Confirm unbond", + "inviteTitle": "You have been invited to {AppName}", + "inviteDescription": "For every transaction, 10% of the fee will go to your referrer, without any extra cost to you.", + "signInvitation": "Approve", + "freeOfCharge": "This action is free of charge", + "hasReferrerTitle": "You’ve already set your referrer", + "hasReferrerDescription": "Unfortunately, you can only set one", + "ok": "OK" + }, + "referrer": { + "title": "Add your referrer", + "titleReferrer": "Your referrer", + "placeholder": "Enter invitation link or code", + "label": "Invitation link or code", + "approve": "Approve", + "approved": "Approved", + "description": "You can get referred to {AppName},
type in the link or code of the referrer", + "referredBy": "You’ve been referred by {referrer}", + "info": "When you’ll pay a fee for transaction,
10% will go to your referrer", + "referredLablel": "Referred address" + }, + "insufficientBondedAmount": "To invite more referrals, bond at least {inviteUserFee} XOR" + }, + "transactionDetailsText": "Transaction Details", + "createTokenTextNFT": "Create NFT", + "code": { + "download": "Download QR Code", + "upload": "Scan QR", + "invalid": "Invalid QR Code", + "import": "Import an image", + "scan": "Scan with camera", + "allowanceError": "Check your camera availability and browser permissions to use it", + "receive": "Receive", + "camera": "Camera", + "allowanceRequest": "Press “Allow” access to camera" + }, + "bridgeTransferNotification": { + "addToken": "Add {symbol} to {Metamask}", + "title": "Bridge transaction successful" + }, + "mobilePopup": { + "sideMenu": "Get {Sora} Wallet", + "header": "Download {Sora} Wallet with {polkaswapHighlight} features", + "info": "Swap tokens from different networks - {Sora}, {Ethereum}, {Polkadot}, {Kusama}. Provide liquidity pool and earn % from exchange fees." + }, + "releaseNotesText": "Release notes", + "copiedText": "Copied!", + "copyWithValue": "Copy {value}", + "copiedWithValue": "{value} is copied!", + "signAndClaimText": "Sign and claim", + "balanceText": "Balance", + "unknownAssetText": "Unknown asset", + "demeterFarming": { "staking": { - "title": "Staking" - }, - "historyErrorMessages": { - "generalError": "Something went wrong", - "balances": { - "liquidityrestrictions": "Account liquidity restrictions prevent withdrawal" - }, - "poolxyk": { - "sourcebalanceisnotlargeenough": "Source balance is not large enough", - "targetbalanceisnotlargeenough": "Destination balance is not large enough", - "impossibletodecidevalidpairvaluesfromrangeforthispool": "Provided amounts are too diverse", - "calculatedvalueisnotmeetsrequiredboundaries": "Amounts are out of required bounds", - "unabletodepositxorlessthanminimum": "XOR lower than the minimum value (0.007)", - "zerovalueinamountparameter": "Amount parameter has zero value" - }, - "xstpool": { - "poolalreadyinitializedforpair": "Pool pair already exists", - "slippagelimitexceeded": "Slippage tolerance has not met proper limits" - }, - "referrals": { - "alreadyhasreferrer": "Account already has a referrer", - "referrerinsufficientbalance": "Referrer does not have enough of reserved balance" - }, - "vestedrewards": { - "rewardssupplyshortage": "Rewards program has already finished", - "cantcalculatereward": "Failed to perform reward calculation", - "norewardsforasset": "There are no rewards for this asset" - }, - "liquidityproxy": { - "forbiddenfilter": "Selected liquidity source is not allowed" - }, - "demeterfarmingplatform": { - "insufficientfunds": "Insufficient funds", - "insufficientlptokens": "Insufficient liquidity provision tokens", - "pooldoesnothaverewards": "Pool does not have rewards" - }, - "multicollateralbondingcurvepool": { - "pricecalculationfailed": "An error occurred while calculating the price" - } - }, - "receivedText": "Received", - "browserNotificationDialog": { - "title": "Enable browser notifications", - "info": "We will send you only relevant updates about your wallet, for example: asset balance changes", - "button": "Enable notifications", - "agree": "Yes, I understand", - "notificationBlocked": "To receive the notifications about {AppName}, please, allow the notifications in your browser's native settings", - "pointer": "Press “Allow” to turn notifications on" - }, - "assetDeposit": "Asset balance has been deposited", - "noDataText": "No data", - "ofText": "{first} of {second}", - "filter": { - "all": "All", - "token": "Currencies", - "verifiedOnly": "Show verified assets only", - "zeroBalance": "Hide 0 balance assets", - "showAssets": "Show assets", - "show": "Show" - }, - "desktop": { - "welcome": { - "header": "Welcome to {AppName}!", - "headline": "Let’s set up your account", - "text": "Create your {Sora} Network account or log into the old ones using mnemonic phrase or .json import. This allows you to securely sign transactions and manage assets in {Sora} Network.", - "createAccount": "Create an account", - "importAccount": "Import Account" - }, - "heading": { - "seedPhraseTitle": "Seed phrase", - "confirmSeedTitle": "Confirm seed phrase", - "accountDetailsTitle": "Account Details", - "importTitle": "Import account" - }, - "button": { - "next": "Next step", - "skip": "Skip", - "createAccount": "Create Account", - "importAccount": "Import account" - }, - "accountName": { - "placeholder": "Wallet name", - "desc": "This is the public name of your wallet which will be visible to everyone" - }, - "password": { - "placeholder": "Password", - "desc": "Ensure you are using a strong password for proper protection" - }, - "confirmPassword": { - "placeholder": "Confirm password" - }, - "accountMnemonic": { - "placeholder": "Mnemonic phrase" - }, - "seedAdviceText": "This is a secret seed of your account. Make sure to store it on a non-digital carrier, for example - paper", - "confirmSeedText": "Confirm the seed phrase by clicking words in the correct order", - "errorMnemonicText": "Incorrect seed phrase order", - "exportOptionText": "Export .json account file", - "exportJsonText": "You will always be able to access your account by importing that .json file. Do not share it with anyone!", - "addAccount": "Add an account", - "dialog": { - "confirmTitle": "Confirm with password", - "confirmButton": "Sign Transaction", - "savePasswordText": "Remember my password for next 15 minutes", - "extendPasswordText": "Extend period without password by 15 minutes" - }, - "errorMessages": { - "password": "Password did not match", - "passwords": "Passwords did not match", - "mnemonic": "Invalid bip39 mnemonic specified", - "mnemonicLength": "Mnemonic should contain {number} words", - "jsonFields": "JSON file does not have required fields" - } - }, - "hashiBridgeText": "{Hashi} bridge", - "disclaimerTitle": "Disclaimer:" -} \ No newline at end of file + "active": "Staking active", + "inactive": "Stake to earn additional rewards", + "stopped": "Staking stopped" + }, + "info": { + "earned": "{symbol} earned", + "fee": "Fee", + "feeTooltip": "Deposit fee is applied to your amount to stake", + "owned": "{symbol} @:balanceText", + "poolShare": "Your pool share staked", + "poolShareWillBe": "Your pool share staked will be", + "rewardToken": "Reward token", + "stake": "Your {symbol} staked", + "stakeWillBe": "Your {symbol} stake will be", + "totalLiquidityLocked": "Total liquidity locked" + }, + "actions": { + "add": "Stake more", + "claim": "Claim rewards", + "remove": "Remove stake", + "start": "Start staking" + }, + "amountAdd": "Amount to stake", + "amountRemove": "Amount to remove", + "poweredBy": "Powered by Demeter Farming", + "calculator": "Calculator", + "results": "Results", + "rewards": "{symbol} rewards" + }, + "staking": { + "title": "Staking" + }, + "historyErrorMessages": { + "generalError": "Something went wrong", + "balances": { + "liquidityrestrictions": "Account liquidity restrictions prevent withdrawal" + }, + "poolxyk": { + "sourcebalanceisnotlargeenough": "Source balance is not large enough", + "targetbalanceisnotlargeenough": "Destination balance is not large enough", + "impossibletodecidevalidpairvaluesfromrangeforthispool": "Provided amounts are too diverse", + "calculatedvalueisnotmeetsrequiredboundaries": "Amounts are out of required bounds", + "unabletodepositxorlessthanminimum": "XOR lower than the minimum value (0.007)", + "zerovalueinamountparameter": "Amount parameter has zero value" + }, + "xstpool": { + "poolalreadyinitializedforpair": "Pool pair already exists", + "slippagelimitexceeded": "Slippage tolerance has not met proper limits" + }, + "referrals": { + "alreadyhasreferrer": "Account already has a referrer", + "referrerinsufficientbalance": "Referrer does not have enough of reserved balance" + }, + "vestedrewards": { + "rewardssupplyshortage": "Rewards program has already finished", + "cantcalculatereward": "Failed to perform reward calculation", + "norewardsforasset": "There are no rewards for this asset" + }, + "liquidityproxy": { + "forbiddenfilter": "Selected liquidity source is not allowed" + }, + "demeterfarmingplatform": { + "insufficientfunds": "Insufficient funds", + "insufficientlptokens": "Insufficient liquidity provision tokens", + "pooldoesnothaverewards": "Pool does not have rewards" + }, + "multicollateralbondingcurvepool": { + "pricecalculationfailed": "An error occurred while calculating the price" + } + }, + "receivedText": "Received", + "browserNotificationDialog": { + "title": "Enable browser notifications", + "info": "We will send you only relevant updates about your wallet, for example: asset balance changes", + "button": "Enable notifications", + "agree": "Yes, I understand", + "notificationBlocked": "To receive the notifications about {AppName}, please, allow the notifications in your browser's native settings", + "pointer": "Press “Allow” to turn notifications on" + }, + "assetDeposit": "Asset balance has been deposited", + "noDataText": "No data", + "ofText": "{first} of {second}", + "filter": { + "all": "All", + "token": "Currencies", + "verifiedOnly": "Show verified assets only", + "zeroBalance": "Hide 0 balance assets", + "showAssets": "Show assets", + "show": "Show" + }, + "desktop": { + "welcome": { + "header": "Welcome to {AppName}!", + "headline": "Let’s set up your account", + "text": "Create your {Sora} Network account or log into the old ones using mnemonic phrase or .json import. This allows you to securely sign transactions and manage assets in {Sora} Network.", + "createAccount": "Create an account", + "importAccount": "Import Account" + }, + "heading": { + "seedPhraseTitle": "Seed phrase", + "confirmSeedTitle": "Confirm seed phrase", + "accountDetailsTitle": "Account Details", + "importTitle": "Import account" + }, + "button": { + "next": "Next step", + "skip": "Skip", + "createAccount": "Create Account", + "importAccount": "Import account" + }, + "accountName": { + "placeholder": "Wallet name", + "desc": "This is the public name of your wallet which will be visible to everyone" + }, + "password": { + "placeholder": "Password", + "desc": "Ensure you are using a strong password for proper protection" + }, + "confirmPassword": { + "placeholder": "Confirm password" + }, + "accountMnemonic": { + "placeholder": "Mnemonic phrase" + }, + "seedAdviceText": "This is a secret seed of your account. Make sure to store it on a non-digital carrier, for example - paper", + "confirmSeedText": "Confirm the seed phrase by clicking words in the correct order", + "errorMnemonicText": "Incorrect seed phrase order", + "exportOptionText": "Export .json account file", + "exportJsonText": "You will always be able to access your account by importing that .json file. Do not share it with anyone!", + "addAccount": "Add an account", + "dialog": { + "confirmTitle": "Confirm with password", + "confirmButton": "Sign Transaction", + "savePasswordText": "Remember my password for next 15 minutes", + "extendPasswordText": "Extend period without password by 15 minutes" + }, + "errorMessages": { + "password": "Password did not match", + "passwords": "Passwords did not match", + "mnemonic": "Invalid bip39 mnemonic specified", + "mnemonicLength": "Mnemonic should contain {number} words", + "jsonFields": "JSON file does not have required fields" + } + }, + "hashiBridgeText": "{Hashi} bridge", + "disclaimerTitle": "Disclaimer:" +} diff --git a/src/router/index.ts b/src/router/index.ts index 5dcf51403..d838f16d0 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -50,6 +50,11 @@ const routes: Array = [ name: PageNames.Wallet, component: lazyView(PageNames.Wallet), }, + { + path: '/card', + name: PageNames.SoraCard, + component: lazyView(PageNames.SoraCard), + }, { path: '/bridge', component: lazyView(PageNames.BridgeContainer), diff --git a/src/store/prices/actions.ts b/src/store/prices/actions.ts index a303b0594..98e46fc6a 100644 --- a/src/store/prices/actions.ts +++ b/src/store/prices/actions.ts @@ -1,6 +1,8 @@ import { defineActions } from 'direct-vuex'; import { api } from '@soramitsu/soraneo-wallet-web'; +import { FPNumber } from '@sora-substrate/util'; +import { getXorPerEuroRatio, waitForAccountPair } from '@/utils'; import { pricesActionContext } from './../prices'; import { PricesPayload } from './types'; @@ -34,6 +36,49 @@ const actions = defineActions({ commit.resetPrices(); } }, + calculateXorRestPrice(context, xorPerEuro): void { + const { state, commit } = pricesActionContext(context); + const { totalXorBalance } = state; + const euroToPay = FPNumber.HUNDRED.add(FPNumber.ONE).sub(totalXorBalance.mul(xorPerEuro)); + const euroToPayInXor = euroToPay.div(xorPerEuro); + + commit.setXorPriceToDeposit(euroToPayInXor); + }, + async calculateXorBalanceInEuros(context, xorTotalBalance: FPNumber): Promise { + const { commit, dispatch } = pricesActionContext(context); + try { + const xorPerEuro: string = await getXorPerEuroRatio(); + const xorPerEuroFPN = FPNumber.fromNatural(xorPerEuro); + const euroBalance = xorTotalBalance.mul(xorPerEuroFPN).toNumber(); + commit.setEuroBalance(euroBalance.toString()); + + if (euroBalance < 100) { + dispatch.calculateXorRestPrice(xorPerEuroFPN); + } + } catch {} + }, + async subscribeToTotalXorBalance(context): Promise { + const { commit, rootGetters, dispatch } = pricesActionContext(context); + + commit.resetTotalXorBalanceUpdates(); + + if (!rootGetters.wallet.account.isLoggedIn) return; + + await waitForAccountPair(async () => { + const subscription = api.assets.getTotalXorBalanceObservable().subscribe((xorTotalBalance: FPNumber) => { + commit.setTotalXorBalance(xorTotalBalance); + dispatch.calculateXorBalanceInEuros(xorTotalBalance); + }); + + commit.setTotalXorBalanceUpdates(subscription); + }); + }, + async unsubscribeFromTotalXorBalance(context): Promise { + const { commit } = pricesActionContext(context); + setTimeout(() => { + commit.resetTotalXorBalanceUpdates(); + }, 1000 * 60 * 5); + }, }); export default actions; diff --git a/src/store/prices/getters.ts b/src/store/prices/getters.ts new file mode 100644 index 000000000..df7019246 --- /dev/null +++ b/src/store/prices/getters.ts @@ -0,0 +1,14 @@ +import { defineGetters } from 'direct-vuex'; +import { pricesGetterContext } from '.'; + +import { PriceState } from './types'; + +const getters = defineGetters()({ + isEuroBalanceEnough(...args): boolean { + const { state } = pricesGetterContext(args); + const euroBalance = parseInt(state.euroBalance, 10); + return euroBalance > 100; + }, +}); + +export default getters; diff --git a/src/store/prices/index.ts b/src/store/prices/index.ts index e76e60ddc..6ad8d1b54 100644 --- a/src/store/prices/index.ts +++ b/src/store/prices/index.ts @@ -1,20 +1,23 @@ import { defineModule } from 'direct-vuex'; -import { localActionContext } from '@/store'; +import { localActionContext, localGetterContext } from '@/store'; import { Module } from '@/store/consts'; import mutations from './mutations'; import state from './state'; +import getters from './getters'; import actions from './actions'; const prices = defineModule({ namespaced: true, state, + getters, mutations, actions, }); +const pricesGetterContext = (args: [any, any, any, any]) => localGetterContext(args, Module.Prices, prices); const pricesActionContext = (context: any) => localActionContext(context, Module.Prices, prices); -export { pricesActionContext }; +export { pricesActionContext, pricesGetterContext }; export default prices; diff --git a/src/store/prices/mutations.ts b/src/store/prices/mutations.ts index 9fb124704..001b07941 100644 --- a/src/store/prices/mutations.ts +++ b/src/store/prices/mutations.ts @@ -4,7 +4,7 @@ import { ZeroStringValue } from '@/consts'; import type { PriceState } from './types'; const mutations = defineMutations()({ - setPrices(state, params: PriceState): void { + setPrices(state, params: Partial): void { state.price = params.price; state.priceReversed = params.priceReversed; }, @@ -12,6 +12,22 @@ const mutations = defineMutations()({ state.price = ZeroStringValue; state.priceReversed = ZeroStringValue; }, + setXorPriceToDeposit(state, xorToDeposit): void { + state.xorToDeposit = xorToDeposit; + }, + setEuroBalance(state, euroBalance: string) { + state.euroBalance = euroBalance; + }, + setTotalXorBalance(state, balance) { + state.totalXorBalance = balance; + }, + setTotalXorBalanceUpdates(state, subscription) { + state.totalXorBalanceUpdates = subscription; + }, + resetTotalXorBalanceUpdates(state) { + state.totalXorBalanceUpdates?.unsubscribe(); + state.totalXorBalanceUpdates = null; + }, }); export default mutations; diff --git a/src/store/prices/state.ts b/src/store/prices/state.ts index e49894b70..fc2faab7e 100644 --- a/src/store/prices/state.ts +++ b/src/store/prices/state.ts @@ -1,10 +1,15 @@ import { ZeroStringValue } from '@/consts'; import type { PriceState } from './types'; +import { FPNumber } from '@sora-substrate/util'; function initialState(): PriceState { return { price: ZeroStringValue, priceReversed: ZeroStringValue, + euroBalance: ZeroStringValue, + totalXorBalance: FPNumber.ZERO, + xorToDeposit: FPNumber.ZERO, + totalXorBalanceUpdates: null, }; } diff --git a/src/store/prices/types.ts b/src/store/prices/types.ts index a602e1b88..881d2c6e6 100644 --- a/src/store/prices/types.ts +++ b/src/store/prices/types.ts @@ -1,6 +1,13 @@ +import type { Subscription } from 'rxjs'; +import { FPNumber } from '@sora-substrate/util'; + export type PriceState = { - price: string; - priceReversed: string; + price: string | undefined; + priceReversed: string | undefined; + euroBalance: string; + totalXorBalance: FPNumber; + xorToDeposit: FPNumber; + totalXorBalanceUpdates: Nullable; }; export type PricesPayload = Partial<{ diff --git a/src/styles/common.scss b/src/styles/common.scss index 082553e29..65df8379c 100644 --- a/src/styles/common.scss +++ b/src/styles/common.scss @@ -1,18 +1,18 @@ -$font-weight-100: "wght" 100; -$font-weight-200: "wght" 200; -$font-weight-300: "wght" 300; -$font-weight-400: "wght" 400; -$font-weight-500: "wght" 500; -$font-weight-600: "wght" 600; -$font-weight-700: "wght" 700; -$font-weight-800: "wght" 800; +$font-weight-100: 'wght' 100; +$font-weight-200: 'wght' 200; +$font-weight-300: 'wght' 300; +$font-weight-400: 'wght' 400; +$font-weight-500: 'wght' 500; +$font-weight-600: 'wght' 600; +$font-weight-700: 'wght' 700; +$font-weight-800: 'wght' 800; @include generic-input-lines; /* Networks Icons */ -$s-icon-sora: "\0041"; -$s-icon-eth: "\0044"; -$s-icon-energy: "\0048"; +$s-icon-sora: '\0041'; +$s-icon-eth: '\0044'; +$s-icon-energy: '\0048'; .s-icon-sora { &:before { content: $s-icon-sora; @@ -23,23 +23,26 @@ $s-icon-energy: "\0048"; content: $s-icon-eth; } } -[design-system-theme="light"] { +[design-system-theme='light'] { .s-icon--network.s-icon { &-sora { - &, &:hover { - color: #E3232C !important; + &, + &:hover { + color: #e3232c !important; } } &-eth { - &, &:hover { - color: #627EEA !important; + &, + &:hover { + color: #627eea !important; } } } } .s-icon-energy { &.s-icon--network { - &, &:hover { + &, + &:hover { color: #a566ff !important; } } @@ -53,7 +56,8 @@ h3 { text-transform: capitalize; } // TODO: fix outline issue in js ui library -.el-tooltip, .el-slider__button-wrapper { +.el-tooltip, +.el-slider__button-wrapper { outline: none; } @@ -63,19 +67,33 @@ button.el-button--max { font-variation-settings: $font-weight-800 !important; } -div.el-pagination button, div.el-collapse-item__wrap { background-color: unset !important; } -span.el-pagination__total { padding: 0 8px; } +div.el-pagination button, +div.el-collapse-item__wrap { + background-color: unset !important; +} +span.el-pagination__total { + padding: 0 8px; +} /* FORMS */ -div.history-item-operation { color: var(--s-color-theme-accent-hover) !important; } -div.transaction-row_key { text-transform: uppercase; } -div.transaction-row_value{ color: var(--s-color-base-content-quaternary) !important; font-weight: 600; } +div.history-item-operation { + color: var(--s-color-theme-accent-hover) !important; +} +div.transaction-row_key { + text-transform: uppercase; +} +div.transaction-row_value { + color: var(--s-color-base-content-quaternary) !important; + font-weight: 600; +} -i.el-notification__icon.el-icon-success, i.el-notification__icon.el-icon-success:hover { +i.el-notification__icon.el-icon-success, +i.el-notification__icon.el-icon-success:hover { color: var(--s-color-status-success) !important; } /*_______________________ CURRENT UI FIXES FOR CONSISTENCY (GENERALLY BASED ON TEST USERS FEEDBACK) _______________________*/ -button.el-button.el-tooltip.el-button--primary.el-button--medium.is-disabled.s-medium.s-border-radius-small.s-primary.s-i-position-left span { +button.el-button.el-tooltip.el-button--primary.el-button--medium.is-disabled.s-medium.s-border-radius-small.s-primary.s-i-position-left + span { font-size: var(--s-icon-font-size-mini) !important; } diff --git a/src/utils/index.ts b/src/utils/index.ts index a96e5832c..1be477352 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -173,6 +173,22 @@ export const getAssetDecimals = (asset: any, { internal = true } = {}): number | return internal ? asset.decimals : asset.externalDecimals; }; +export const getXorPerEuroRatio = async () => { + try { + const priceResult = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=sora&vs_currencies=eur'); + const parsedData = await priceResult.json(); + return parsedData.sora.eur; + } catch (error) { + console.error(error); + } +}; + +export const clearTokensFromSessionStorage = () => { + sessionStorage.removeItem('access-token'); + sessionStorage.removeItem('refresh-token'); + sessionStorage.removeItem('expiration-time'); +}; + export const formatAssetBalance = ( asset: any, { diff --git a/src/views/Bridge.vue b/src/views/Bridge.vue index 5be9bbcc2..ce414a12a 100644 --- a/src/views/Bridge.vue +++ b/src/views/Bridge.vue @@ -477,9 +477,15 @@ export default class Bridge extends Mixins( return this.formatCodecNumber(balance, decimals); } - created(): void { - // we should reset data only on created, because it's used on another bridge views - this.resetBridgeForm(); + async created(): Promise { + if (this.$route.params.xorToDeposit) { + await this.selectAsset(this.xor); + this.setSoraToEvm(false); + this.setAmount(this.$route.params.xorToDeposit); + } else { + // we should reset data only on created, because it's used on another bridge views + this.resetBridgeForm(); + } } destroyed(): void { diff --git a/src/views/SoraCard.vue b/src/views/SoraCard.vue new file mode 100644 index 000000000..0b2f505ec --- /dev/null +++ b/src/views/SoraCard.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/yarn.lock b/yarn.lock index 608a4a81b..c188a3f1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2903,6 +2903,11 @@ dependencies: source-map "^0.6.1" +"@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/verror@^1.10.3": version "1.10.5" resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.5.tgz#2a1413aded46e67a1fe2386800e291123ed75eb1" @@ -10078,6 +10083,11 @@ jszip@^3.1.0: readable-stream "~2.3.6" set-immediate-shim "~1.0.1" +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -14267,11 +14277,24 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuidv4@^6.2.13: + version "6.2.13" + resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.2.13.tgz#8f95ec5ef22d1f92c8e5d4c70b735d1c89572cb7" + integrity sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ== + dependencies: + "@types/uuid" "8.3.4" + uuid "8.3.2" + v-jsoneditor@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/v-jsoneditor/-/v-jsoneditor-1.4.5.tgz#e6164c17a9f7c36fb591d907c0c32f4375409fae" @@ -14417,6 +14440,11 @@ vue-observe-visibility@^0.4.4: resolved "https://registry.yarnpkg.com/vue-observe-visibility/-/vue-observe-visibility-0.4.6.tgz#878cb8ebcf3078e40807af29774e97105ebd519e" integrity sha512-xo0CEVdkjSjhJoDdLSvoZoQrw/H2BlzB5jrCBKGZNXN2zdZgMuZ9BKrxXDjNP2AxlcCoKc8OahI3F3r3JGLv2Q== +vue-plugin-load-script@^2.x.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/vue-plugin-load-script/-/vue-plugin-load-script-2.1.1.tgz#5c16fbb428dae38440022dbf7ab02bf0b2429e26" + integrity sha512-IViO0hNj4O39M8I1taX74B5PR5RI7IrlEt+dvAjOk3NRLwQ7ZrdexUo9+K++KBzGPJtaVL1+emTyMWeOtjZojw== + vue-property-decorator@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz#266a2eac61ba6527e2e68a6933cfb98fddab5457"