From 43ba47d656ba340e6c508ab8703156e8e04ed212 Mon Sep 17 00:00:00 2001 From: yauheni-deriv <103182683+yauheni-deriv@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:44:02 +0300 Subject: [PATCH 001/104] refactor: update close icon style (#8894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: update close icon style * fix: authenticate notification for mobile add * chore: :green_heart: trigger build --------- Co-authored-by: “yauheni-kryzhyk-deriv” <“yauheni@deriv.me”> Co-authored-by: Likhith Kolayari <98398322+likhith-deriv@users.noreply.github.com> Co-authored-by: Likhith Kolayari --- .../Containers/app-notification-messages.jsx | 39 ++++++++++--------- .../components/app-notification-message.scss | 7 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/packages/core/src/App/Containers/app-notification-messages.jsx b/packages/core/src/App/Containers/app-notification-messages.jsx index 8a6a94f0b2da..a9e8fc5a03dc 100644 --- a/packages/core/src/App/Containers/app-notification-messages.jsx +++ b/packages/core/src/App/Containers/app-notification-messages.jsx @@ -107,38 +107,39 @@ const AppNotificationMessages = ({ const is_not_marked_notification = !marked_notifications.includes(message.key); const is_non_hidden_notification = isMobile() ? [ - 'unwelcome', - 'contract_sold', - 'dp2p', - 'install_pwa', - 'tnc', - 'need_fa', + 'authenticate', 'deriv_go', + 'document_needs_action', + 'dp2p', 'close_mx_mlt_account', - 'trustpilot', 'close_uk_account', - 'p2p_daily_limit_increase', - 'document_needs_action', + 'contract_sold', + 'has_changed_two_fa', 'identity', + 'install_pwa', + 'need_fa', 'poi_name_mismatch', + 'poa_address_mismatch_failure', + 'poa_address_mismatch_success', + 'poa_address_mismatch_warning', + 'poa_expired', + 'poa_failed', + 'poa_rejected_for_mt5', + 'poa_verified', 'poi_expired', 'poi_failed', 'poi_verified', - 'poa_expired', - 'resticted_mt5_with_pending_poa', - 'poa_verified', - 'poa_failed', + 'p2p_daily_limit_increase', 'resticted_mt5_with_failed_poa', - 'poa_rejected_for_mt5', - 'poa_address_mismatch_warning', - 'poa_address_mismatch_success', - 'poa_address_mismatch_failure', - 'svg_needs_poi_poa', + 'resticted_mt5_with_pending_poa', 'svg_needs_poa', - 'has_changed_two_fa', 'svg_needs_poi', + 'svg_needs_poi_poa', 'svg_poi_expired', 'switched_to_real', + 'tnc', + 'trustpilot', + 'unwelcome', ].includes(message.key) || message.type === 'p2p_completed_order' : true; diff --git a/packages/core/src/sass/app/_common/components/app-notification-message.scss b/packages/core/src/sass/app/_common/components/app-notification-message.scss index c67fc8c18d59..83254c5c4318 100644 --- a/packages/core/src/sass/app/_common/components/app-notification-message.scss +++ b/packages/core/src/sass/app/_common/components/app-notification-message.scss @@ -76,7 +76,7 @@ } &__close-button { position: absolute; - top: 0.4rem; + top: 1.05rem; right: 1.6rem; visibility: visible; background: none; @@ -92,8 +92,9 @@ &:after { content: '\0000D7'; font-size: 30px; - font-weight: 300; + font-weight: 400; color: var(--text-prominent); + font-family: monospace; } } &__icon { @@ -113,7 +114,7 @@ left: -25px; bottom: -5px; pointer-events: none; - opacity: 0.07; + opacity: 0.08; z-index: 0; &--header-only { From 6d31e2ce77b31e115fe17a8bfa83907d14877763 Mon Sep 17 00:00:00 2001 From: Shaheer <122449658+shaheer-deriv@users.noreply.github.com> Date: Fri, 9 Jun 2023 18:03:01 +0400 Subject: [PATCH 002/104] Shaheer/wall 565/language related fixes (#8880) * fix: :bug: amina/8234/ uses language from deriv com in deriv app * fix: :bug: syncs cookie name with deriv com * chore: :construction: tests cookie storage from deriv com * revert: :rewind: tests for deriv com language cookie --- .../Elements/LiveChat/use-livechat.ts | 2 +- packages/core/src/Stores/client-store.js | 30 +++++++++++-------- packages/shared/src/utils/storage/storage.ts | 4 ++- packages/shared/src/utils/url/constants.ts | 1 + packages/shared/src/utils/url/helpers.ts | 3 ++ packages/translations/src/i18next/i18next.ts | 2 +- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts b/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts index 7e5c9bf7e796..68d923a16422 100644 --- a/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts +++ b/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts @@ -44,7 +44,7 @@ const useLiveChat = (has_cookie_account = false, active_loginid?: string) => { let client_last_name = ''; const domain = /^(.)*deriv\.(com|me|be)$/gi.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME - : 'binary.sx'; + : deriv_urls.DERIV_TEST_LINK_DOMAIN; const client_information = Cookies.getJSON('client_information', { domain, }); diff --git a/packages/core/src/Stores/client-store.js b/packages/core/src/Stores/client-store.js index d52a1fd5a7a9..59647b2679b4 100644 --- a/packages/core/src/Stores/client-store.js +++ b/packages/core/src/Stores/client-store.js @@ -1,12 +1,12 @@ +import Cookies from 'js-cookie'; import * as SocketCache from '_common/base/socket_cache'; - import { CFD_PLATFORMS, LocalStore, State, - deriv_urls, excludeParamsFromUrlQuery, filterUrlQuery, + getCurrentdomain, getPropertyValue, getUrlBinaryBot, getUrlSmartTrader, @@ -18,7 +18,6 @@ import { isStaging, isTestLink, redirectToLogin, - removeCookies, routes, setCurrencies, toMoment, @@ -27,13 +26,12 @@ import { import { WS, requestLogout } from 'Services'; import { action, computed, makeObservable, observable, reaction, runInAction, toJS, when } from 'mobx'; import { getAccountTitle, getClientAccountType, getAvailableAccount } from './Helpers/client'; -import { getLanguage, localize } from '@deriv/translations'; +import { getLanguage, localize, isLanguageAvailable } from '@deriv/translations'; import { getRegion, isEuCountry, isMultipliersOnly, isOptionsBlocked } from '_common/utility'; import BaseStore from './base-store'; import BinarySocket from '_common/base/socket_base'; import BinarySocketGeneral from 'Services/socket-general'; -import Cookies from 'js-cookie'; import { buildCurrenciesList } from './Modules/Trading/Helpers/currency'; import moment from 'moment'; import { setDeviceDataCookie } from './Helpers/device'; @@ -44,6 +42,7 @@ const storage_key = 'client.accounts'; const store_name = 'client_store'; const eu_shortcode_regex = new RegExp('^(maltainvest|malta|iom)$'); const eu_excluded_regex = new RegExp('^mt$'); +const current_domain = getCurrentdomain(); export default class ClientStore extends BaseStore { loginid; @@ -1185,8 +1184,6 @@ export default class ClientStore extends BaseStore { }; setCookieAccount() { - const domain = /deriv\.(com|me)/.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME : 'binary.sx'; - // eslint-disable-next-line max-len const { loginid, @@ -1213,14 +1210,16 @@ export default class ClientStore extends BaseStore { preferred_language, user_id, }; - Cookies.set('region', getRegion(landing_company_shortcode, residence), { domain }); - Cookies.set('client_information', client_information, { domain }); + Cookies.set('region', getRegion(landing_company_shortcode, residence), { current_domain }); + Cookies.set('client_information', client_information, { current_domain }); // need to find other way to get the boolean value and set this cookie since `this.is_p2p_enabled` is deprecated and we can't use hooks here - Cookies.set('is_p2p_disabled', !this.is_p2p_enabled, { domain }); + Cookies.set('is_p2p_disabled', !this.is_p2p_enabled, { current_domain }); this.has_cookie_account = true; } else { - removeCookies('region', 'client_information', 'is_p2p_disabled'); + Cookies.remove('region', { current_domain }); + Cookies.remove('client_information', { current_domain }); + Cookies.remove('is_p2p_disabled', { current_domain }); this.has_cookie_account = false; } } @@ -1569,6 +1568,10 @@ export default class ClientStore extends BaseStore { ]; const authorize_response = await this.setUserLogin(login_new_user); + const getLanguageFromDerivCom = () => { + const lang_from_deriv_com = Cookies.get('user_language')?.toUpperCase(); + return isLanguageAvailable(lang_from_deriv_com) ? lang_from_deriv_com : undefined; + }; if (action_param === 'signup') { this.root_store.ui.setIsNewAccount(); @@ -1644,8 +1647,11 @@ export default class ClientStore extends BaseStore { runInAction(() => { this.is_populating_account_list = false; }); - const language = authorize_response.authorize.preferred_language; const stored_language = LocalStore.get(LANGUAGE_KEY); + const language = + stored_language || // if login from deriv app, language from local storage + getLanguageFromDerivCom() || // if login from deriv.com, language from cookie + authorize_response.authorize.preferred_language; if (language !== 'EN' && stored_language && language !== stored_language) { window.history.replaceState({}, document.title, urlForLanguage(language)); await this.root_store.common.changeSelectedLanguage(language); diff --git a/packages/shared/src/utils/storage/storage.ts b/packages/shared/src/utils/storage/storage.ts index 0c66975d32f4..a2435f7dae63 100644 --- a/packages/shared/src/utils/storage/storage.ts +++ b/packages/shared/src/utils/storage/storage.ts @@ -156,7 +156,9 @@ export const CookieStorage = function (this: TCookieStorageThis, cookie_name: st this.domain = cookie_domain || /* eslint-disable no-nested-ternary */ - (hostname.includes('binary.sx') ? 'binary.sx' : deriv_urls.DERIV_HOST_NAME); + (hostname.includes(deriv_urls.DERIV_TEST_LINK_DOMAIN) + ? deriv_urls.DERIV_TEST_LINK_DOMAIN + : deriv_urls.DERIV_HOST_NAME); /* eslint-enable no-nested-ternary */ this.path = '/'; this.expires = new Date('Thu, 1 Jan 2037 12:00:00 GMT'); diff --git a/packages/shared/src/utils/url/constants.ts b/packages/shared/src/utils/url/constants.ts index cc288d8d4615..398110b08e50 100644 --- a/packages/shared/src/utils/url/constants.ts +++ b/packages/shared/src/utils/url/constants.ts @@ -19,6 +19,7 @@ export const deriv_urls = Object.freeze({ SMARTTRADER_STAGING: `https://staging-smarttrader.${domain_url}`, BINARYBOT_PRODUCTION: `https://bot.${domain_url}`, BINARYBOT_STAGING: `https://staging-bot.${domain_url}`, + DERIV_TEST_LINK_DOMAIN: 'binary.sx', }); export const whatsapp_url = 'https://wa.me/35699578341'; diff --git a/packages/shared/src/utils/url/helpers.ts b/packages/shared/src/utils/url/helpers.ts index 999cd695b6a5..8649b320c951 100644 --- a/packages/shared/src/utils/url/helpers.ts +++ b/packages/shared/src/utils/url/helpers.ts @@ -59,3 +59,6 @@ export const isStaging = (domain = window.location.hostname) => { return is_staging_deriv_app; }; + +export const getCurrentdomain = () => + /deriv\.(com|me)/.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME : deriv_urls.DERIV_TEST_LINK_DOMAIN; diff --git a/packages/translations/src/i18next/i18next.ts b/packages/translations/src/i18next/i18next.ts index 3c2c8cae0c3f..c2d04dc0e7ed 100644 --- a/packages/translations/src/i18next/i18next.ts +++ b/packages/translations/src/i18next/i18next.ts @@ -50,7 +50,7 @@ const isStaging = () => /staging-app\.deriv\.com/i.test(window.location.hostname const isLocal = () => /localhost\.binary\.sx/i.test(window.location.hostname); -const isLanguageAvailable = (lang: string) => { +export const isLanguageAvailable = (lang: string) => { if (!lang) return false; const selected_language = lang.toUpperCase(); From c8a02f2be6bd17fd12aacba7c768b6e6f81fa2bb Mon Sep 17 00:00:00 2001 From: Shayan Khaleghparast <100833613+shayan-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 06:52:48 +0330 Subject: [PATCH 003/104] Shayan/ Remove exchange_rates legacy codes (#8820) * feat: added comment to some places where the code should be changed * refactor: removing legacy codes in cashier transfer page [WIP] * refactor: removed api_call from cashier transfer * refactor: updated cahsier withdrawal * refactor: updated PercentageSelector tests * refactor: updated crypto_fiat_converter_store tests * fix: minor ts error fixed * refactor: removed WS from CryptoFiatConverterStore params * refactor: updated AccountTransferStore tests * refactor: updated WithdrawStore tests * revert: reverted TRootStore type * fix: resolved pr comments * fix: checking test coverage issue * chore: Empty-Commit * ci: :green_heart: trigger build * ci: :green_heart: trigger build * chore: moved the type to the top of the file * fix: added missed props in one of the test cases --------- Co-authored-by: Ali(Ako) Hosseini Co-authored-by: amina-deriv <84661147+amina-deriv@users.noreply.github.com> --- .../crypto-fiat-converter.tsx | 28 +++++++++--- .../__tests__/percentage-selector.spec.tsx | 43 +++++++++++++++--- .../percentage-selector.tsx | 25 +++++++---- .../account-transfer-form.tsx | 5 ++- .../crypto-withdraw-form.tsx | 3 +- .../__tests__/account-transfer-store.spec.ts | 12 ++--- .../crypto-fiat-converter-store.spec.ts | 45 +++++++------------ .../stores/__tests__/withdraw-store.spec.ts | 4 +- .../src/stores/account-transfer-store.ts | 5 ++- packages/cashier/src/stores/cashier-store.ts | 2 +- .../src/stores/crypto-fiat-converter-store.ts | 25 ++++------- packages/cashier/src/stores/withdraw-store.ts | 5 ++- packages/core/src/Stores/common-store.js | 7 --- .../exchange_currency_rate.js | 7 --- packages/core/src/_common/base/socket_base.js | 3 -- 15 files changed, 123 insertions(+), 96 deletions(-) delete mode 100644 packages/core/src/Utils/ExchangeCurrencyRate/exchange_currency_rate.js diff --git a/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.tsx b/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.tsx index 11e057b0c066..5d808da12b4c 100644 --- a/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.tsx +++ b/packages/cashier/src/components/crypto-fiat-converter/crypto-fiat-converter.tsx @@ -6,6 +6,7 @@ import { localize, Localize } from '@deriv/translations'; import { observer } from '@deriv/stores'; import { TReactChangeEvent } from '../../types'; import { useCashierStore } from '../../stores/useCashierStores'; +import { useExchangeRate } from '@deriv/hooks'; import './crypto-fiat-converter.scss'; type TTimerProps = { @@ -22,9 +23,15 @@ type TCryptoFiatConverterProps = { onChangeConverterFromAmount: ( event: { target: { value: string } }, from_currency: string, - to_currency: string + to_currency: string, + converted_amount?: number + ) => void; + onChangeConverterToAmount: ( + event: TReactChangeEvent, + from_currency: string, + to_currency: string, + converted_amount?: number ) => void; - onChangeConverterToAmount: (event: TReactChangeEvent, from_currency: string, to_currency: string) => void; resetConverter: VoidFunction; to_currency: string; validateFromAmount: VoidFunction; @@ -75,6 +82,7 @@ const CryptoFiatConverter = observer( validateToAmount, }: TCryptoFiatConverterProps) => { const { crypto_fiat_converter } = useCashierStore(); + const { getRate } = useExchangeRate(); const { converter_from_amount, @@ -107,7 +115,10 @@ const CryptoFiatConverter = observer( setArrowIconDirection('right'); }} onChange={(e: TReactChangeEvent) => { - onChangeConverterFromAmount(e, from_currency, to_currency); + const from_rate = getRate(from_currency || ''); + const to_rate = getRate(to_currency || ''); + const converted_amount = (Number(e.target.value) * to_rate) / from_rate; + onChangeConverterFromAmount(e, from_currency, to_currency, converted_amount); handleChange(e); }} type='text' @@ -143,7 +154,10 @@ const CryptoFiatConverter = observer( setArrowIconDirection('left'); }} onChange={(e: TReactChangeEvent) => { - onChangeConverterToAmount(e, to_currency, from_currency); + const from_rate = getRate(from_currency || ''); + const to_rate = getRate(to_currency || ''); + const converted_amount = (Number(e.target.value) * from_rate) / to_rate; + onChangeConverterToAmount(e, to_currency, from_currency, converted_amount); handleChange(e); }} type='text' @@ -160,10 +174,14 @@ const CryptoFiatConverter = observer( {is_timer_visible && ( { + const from_rate = getRate(from_currency || ''); + const to_rate = getRate(to_currency || ''); + const converted_amount = (Number(converter_from_amount) * to_rate) / from_rate; onChangeConverterFromAmount( { target: { value: converter_from_amount } }, from_currency, - to_currency + to_currency, + converted_amount ); }} /> diff --git a/packages/cashier/src/components/percentage-selector/__tests__/percentage-selector.spec.tsx b/packages/cashier/src/components/percentage-selector/__tests__/percentage-selector.spec.tsx index 10f459cee8b1..0d845b8187ed 100644 --- a/packages/cashier/src/components/percentage-selector/__tests__/percentage-selector.spec.tsx +++ b/packages/cashier/src/components/percentage-selector/__tests__/percentage-selector.spec.tsx @@ -1,27 +1,52 @@ import React from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; import PercentageSelector from '../percentage-selector'; +import { mockStore } from '@deriv/stores'; +import CashierProviders from '../../../cashier-providers'; +import CryptoFiatConverter from '../../crypto-fiat-converter'; describe('', () => { const getCalculatedAmount = jest.fn(); + let mockRootStore: ReturnType, mockProps: React.ComponentProps; const percentage_selector_props = { amount: 100, - currency: 'USD', from_account: '', getCalculatedAmount, percentage: 0, should_percentage_reset: false, to_account: '', + from_currency: 'USD', + to_currency: 'BTC', }; + beforeEach(() => { + mockRootStore = mockStore({ + exchange_rates: { + data: { + rates: { + USD: 1, + BTC: 2, + }, + }, + }, + }); + }); it('should render the component', () => { - render(); + render( + + + + ); expect(screen.getByTestId('dt_percentage_selector_id')).toBeInTheDocument(); }); it('should calculate the percentage amount on click of percentage block', () => { - render(); + render( + + + + ); fireEvent.click(screen.getByTestId('dt_percentage_selector_block_id_1')); expect(screen.getByText(`25% of available balance (100.00 USD)`)).toBeInTheDocument(); @@ -37,7 +62,11 @@ describe('', () => { }); it('should reset the percentage block upon clicking twice', () => { - render(); + render( + + + + ); fireEvent.click(screen.getByTestId('dt_percentage_selector_block_id_1')); fireEvent.click(screen.getByTestId('dt_percentage_selector_block_id_1')); @@ -61,7 +90,11 @@ describe('', () => { }); it('should reset the percentage', () => { - render(); + render( + + + + ); expect(screen.getByText('0% of available balance (100.00 USD)')).toBeInTheDocument(); }); diff --git a/packages/cashier/src/components/percentage-selector/percentage-selector.tsx b/packages/cashier/src/components/percentage-selector/percentage-selector.tsx index 530c6a596ef9..ded3ba8c4c4d 100644 --- a/packages/cashier/src/components/percentage-selector/percentage-selector.tsx +++ b/packages/cashier/src/components/percentage-selector/percentage-selector.tsx @@ -3,30 +3,33 @@ import { Text } from '@deriv/components'; import { formatMoney, getCurrencyDisplayCode, getDecimalPlaces } from '@deriv/shared'; import { Localize } from '@deriv/translations'; import { TReactMouseEvent } from '../../types'; +import { useExchangeRate } from '@deriv/hooks'; type TPercentageSelectorProps = { amount: number; - currency: string; from_account?: string; - getCalculatedAmount: (amount: string) => void; + getCalculatedAmount: (amount: string, converted_amount: number) => void; percentage: number; should_percentage_reset: boolean; to_account?: string; + from_currency: string; + to_currency: string; }; type TCalculateAmountInputEvent = { target: { id: number } }; const PercentageSelector = ({ amount, - currency, from_account, getCalculatedAmount, percentage, should_percentage_reset, to_account, + from_currency, + to_currency, }: TPercentageSelectorProps) => { const [selected_percentage, setSelectedPercentage] = React.useState('0'); - + const { getRate } = useExchangeRate(); React.useEffect(() => { if (should_percentage_reset) { for (let i = 1; i <= 4; i++) { @@ -48,11 +51,17 @@ const PercentageSelector = ({ const calculateAmount = (e: TCalculateAmountInputEvent | TReactMouseEvent, percent: number) => { let new_percentage = percent; - const is_percentage_selected = percent > 0 && percent <= selected_percentage; + const is_percentage_selected = percent > 0 && percent <= Number(selected_percentage); if (is_percentage_selected) new_percentage -= 25; setSelectedPercentage(new_percentage || 0); - getCalculatedAmount((amount * (new_percentage / 100)).toFixed(getDecimalPlaces(currency))); + const from_rate = getRate(from_currency || ''); + const to_rate = getRate(to_currency || ''); + const converted_amount = (amount * (new_percentage / 100) * to_rate) / from_rate; + getCalculatedAmount( + (amount * (new_percentage / 100)).toFixed(getDecimalPlaces(from_currency)), + converted_amount + ); for (let i = 1; i <= 4; i++) { const percentage_selector_block = document.getElementById(String(i)); @@ -68,8 +77,8 @@ const PercentageSelector = ({ } } }; - const format_amount = formatMoney(currency, amount, true); - const currency__display_code = getCurrencyDisplayCode(currency); + const format_amount = formatMoney(from_currency, amount, true); + const currency__display_code = getCurrencyDisplayCode(from_currency); return (
diff --git a/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.tsx b/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.tsx index 5188d2819725..1d124290e4b9 100644 --- a/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.tsx +++ b/packages/cashier/src/pages/account-transfer/account-transfer-form/account-transfer-form.tsx @@ -58,7 +58,7 @@ const AccountOption = ({ account, idx }: TAccountsList) => { @@ -529,12 +529,13 @@ const AccountTransferForm = observer(
{
{ const spyValidateTransferFromAmount = jest.spyOn(account_transfer_store, 'validateTransferFromAmount'); account_transfer_store.setSelectedFrom({ currency: 'USD' }); account_transfer_store.setSelectedTo({ currency: 'BTC' }); - account_transfer_store.setTransferPercentageSelectorResult('10'); + account_transfer_store.setTransferPercentageSelectorResult('10', 11.01); const { onChangeConverterFromAmount, setConverterFromAmount } = account_transfer_store.root_store.modules.cashier.crypto_fiat_converter; expect(setConverterFromAmount).toHaveBeenCalledWith('10'); expect(spyValidateTransferFromAmount).toHaveBeenCalledTimes(1); - expect(onChangeConverterFromAmount).toHaveBeenCalledWith({ target: { value: '10' } }, 'USD', 'BTC'); + expect(onChangeConverterFromAmount).toHaveBeenCalledWith({ target: { value: '10' } }, 'USD', 'BTC', 11.01); }); it('should set transfer percentage selector result if selected_from.balance = 0', () => { const spyValidateTransferFromAmount = jest.spyOn(account_transfer_store, 'validateTransferFromAmount'); account_transfer_store.setSelectedFrom({ balance: 0, currency: 'USD' }); account_transfer_store.setSelectedTo({ currency: 'BTC' }); - account_transfer_store.setTransferPercentageSelectorResult('0'); + account_transfer_store.setTransferPercentageSelectorResult('0', 11.01); const { onChangeConverterFromAmount, setConverterFromAmount } = account_transfer_store.root_store.modules.cashier.crypto_fiat_converter; expect(setConverterFromAmount).toHaveBeenCalledWith('0'); expect(spyValidateTransferFromAmount).toHaveBeenCalledTimes(1); - expect(onChangeConverterFromAmount).toHaveBeenCalledWith({ target: { value: '0' } }, 'USD', 'BTC'); + expect(onChangeConverterFromAmount).toHaveBeenCalledWith({ target: { value: '0' } }, 'USD', 'BTC', 11.01); }); it('should reset crypto fiat converter if amount = 0 and selected_from.balance > 0', () => { account_transfer_store.setSelectedFrom({ balance: 10, currency: 'USD' }); - account_transfer_store.setTransferPercentageSelectorResult('0'); + account_transfer_store.setTransferPercentageSelectorResult('0', 11.01); expect( account_transfer_store.root_store.modules.cashier.crypto_fiat_converter.resetConverter @@ -781,7 +781,7 @@ describe('AccountTransferStore', () => { }); it('should set timer visibility and percentage selector selection status to false when calling setTransferPercentageSelectorResult method', () => { - account_transfer_store.setTransferPercentageSelectorResult('10'); + account_transfer_store.setTransferPercentageSelectorResult('10', 11.01); const { crypto_fiat_converter, general_store } = account_transfer_store.root_store.modules.cashier; expect(crypto_fiat_converter.setIsTimerVisible).toHaveBeenCalledWith(false); diff --git a/packages/cashier/src/stores/__tests__/crypto-fiat-converter-store.spec.ts b/packages/cashier/src/stores/__tests__/crypto-fiat-converter-store.spec.ts index 01e0e61ce4e0..590438bcc017 100644 --- a/packages/cashier/src/stores/__tests__/crypto-fiat-converter-store.spec.ts +++ b/packages/cashier/src/stores/__tests__/crypto-fiat-converter-store.spec.ts @@ -1,23 +1,10 @@ -import { TWebSocket, TRootStore } from '../../types'; +import { TRootStore } from '../../types'; import { mockStore } from '@deriv/stores'; import CryptoFiatConverterStore from '../crypto-fiat-converter-store'; -let crypto_fiat_converter_store: CryptoFiatConverterStore, - root_store: ReturnType, - WS: DeepPartial; +let crypto_fiat_converter_store: CryptoFiatConverterStore, root_store: ReturnType; beforeEach(() => { - WS = { - send: jest.fn().mockResolvedValue({ - exchange_rates: { - base_currency: 'USD', - date: 1650868989, - rates: { - AED: 3.67, - }, - }, - }), - }; root_store = mockStore({ modules: { cashier: { @@ -38,8 +25,16 @@ beforeEach(() => { }, }, }, + exchange_rates: { + data: { + rates: { + USD: 1, + AED: 3.67, + }, + }, + }, }); - crypto_fiat_converter_store = new CryptoFiatConverterStore(WS as TWebSocket, root_store as TRootStore); + crypto_fiat_converter_store = new CryptoFiatConverterStore(root_store as TRootStore); }); describe('CryptoFiatConverterStore', () => { @@ -79,12 +74,6 @@ describe('CryptoFiatConverterStore', () => { expect(crypto_fiat_converter_store.is_timer_visible).toBeFalsy(); }); - it('should get the exchange rates', async () => { - const exchange_rate = await crypto_fiat_converter_store.getExchangeRate('USD', 'AED'); - - expect(exchange_rate).toEqual(3.67); - }); - it('should call function validateWithdrawFromAmount when account transfer container and general store container are different', () => { crypto_fiat_converter_store.validateFromAmount(); @@ -157,7 +146,7 @@ describe('CryptoFiatConverterStore', () => { }); it('should set converter_to_amount with an amount when onChangeConverterFromAmount is called', async () => { - await crypto_fiat_converter_store.onChangeConverterFromAmount({ target: { value: '3' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterFromAmount({ target: { value: '3' } }, 'USD', 'AED', 11.01); expect(crypto_fiat_converter_store.converter_to_amount).toEqual('11.01'); expect(crypto_fiat_converter_store.is_timer_visible).toBeTruthy(); @@ -167,7 +156,7 @@ describe('CryptoFiatConverterStore', () => { }); it('should reset converter details when onChangeConverterToAmount is called without passing target value', async () => { - await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '' } }, 'USD', 'AED', 11.01); expect( crypto_fiat_converter_store.root_store.modules.cashier.general_store.percentageSelectorSelectionStatus @@ -180,14 +169,14 @@ describe('CryptoFiatConverterStore', () => { }); it('should set converter_to_amount with an amount when target value is passed', async () => { - await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED', 11.01); expect(crypto_fiat_converter_store.converter_to_amount).toEqual('3'); }); it('should clear converter_from_amount, converter_from_error, is_timer_visible and setAccountTransferAmount when converter_to_error has error', async () => { crypto_fiat_converter_store.setConverterToError('Something went wrong'); - await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED', 11.01); expect(crypto_fiat_converter_store.converter_from_amount).toEqual(''); expect(crypto_fiat_converter_store.converter_from_error).toEqual(''); @@ -198,7 +187,7 @@ describe('CryptoFiatConverterStore', () => { }); it('should set converter_from_amount with an amount when onChangeConverterToAmount is called', async () => { - await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED', 11.01); expect(crypto_fiat_converter_store.converter_from_amount).toEqual('11.01'); expect(crypto_fiat_converter_store.is_timer_visible).toBeTruthy(); @@ -209,7 +198,7 @@ describe('CryptoFiatConverterStore', () => { it('should set is_timer_visible to false when converter_from_error has error', async () => { crypto_fiat_converter_store.setConverterFromError('Something went wrong'); - await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED'); + await crypto_fiat_converter_store.onChangeConverterToAmount({ target: { value: '3' } }, 'USD', 'AED', 11.01); expect(crypto_fiat_converter_store.is_timer_visible).toBeFalsy(); expect( diff --git a/packages/cashier/src/stores/__tests__/withdraw-store.spec.ts b/packages/cashier/src/stores/__tests__/withdraw-store.spec.ts index c9f9a1d63df0..06b9a5051fae 100644 --- a/packages/cashier/src/stores/__tests__/withdraw-store.spec.ts +++ b/packages/cashier/src/stores/__tests__/withdraw-store.spec.ts @@ -283,11 +283,11 @@ describe('WithdrawStore', () => { const { percentageSelectorSelectionStatus } = withdraw_store.root_store.modules.cashier.general_store; const spyValidateWithdrawFromAmount = jest.spyOn(withdraw_store, 'validateWithdrawFromAmount'); - withdraw_store.setWithdrawPercentageSelectorResult('100'); + withdraw_store.setWithdrawPercentageSelectorResult('100', 1000); expect(setConverterFromAmount).toHaveBeenCalledWith('100'); expect(spyValidateWithdrawFromAmount).toHaveBeenCalled(); - withdraw_store.setWithdrawPercentageSelectorResult('0'); + withdraw_store.setWithdrawPercentageSelectorResult('0', 0); expect(resetConverter).toHaveBeenCalled(); expect(setIsTimerVisible).toHaveBeenCalledWith(false); expect(percentageSelectorSelectionStatus).toHaveBeenCalledWith(false); diff --git a/packages/cashier/src/stores/account-transfer-store.ts b/packages/cashier/src/stores/account-transfer-store.ts index e5f7e5244c85..1a916334619b 100644 --- a/packages/cashier/src/stores/account-transfer-store.ts +++ b/packages/cashier/src/stores/account-transfer-store.ts @@ -661,7 +661,7 @@ export default class AccountTransferStore { this.setTransferLimit(); }; - setTransferPercentageSelectorResult(amount: string) { + setTransferPercentageSelectorResult(amount: string, exchanged_amount: number) { const { crypto_fiat_converter, general_store } = this.root_store.modules.cashier; const selected_from_currency = this.selected_from.currency; @@ -673,7 +673,8 @@ export default class AccountTransferStore { crypto_fiat_converter.onChangeConverterFromAmount( { target: { value: amount } }, selected_from_currency, - selected_to_currency + selected_to_currency, + exchanged_amount ); } else { crypto_fiat_converter.resetConverter(); diff --git a/packages/cashier/src/stores/cashier-store.ts b/packages/cashier/src/stores/cashier-store.ts index babe286b5ea3..231cb419865e 100644 --- a/packages/cashier/src/stores/cashier-store.ts +++ b/packages/cashier/src/stores/cashier-store.ts @@ -28,7 +28,7 @@ export default class CashierStore { constructor(public root_store: TRootStore, public WS: TWebSocket) { this.account_transfer = new AccountTransferStore(WS, root_store); - this.crypto_fiat_converter = new CryptoFiatConverterStore(WS, root_store); + this.crypto_fiat_converter = new CryptoFiatConverterStore(root_store); this.deposit = new DepositStore(WS, root_store); this.error = new ErrorStore(); this.error_dialog = new ErrorDialogStore(); diff --git a/packages/cashier/src/stores/crypto-fiat-converter-store.ts b/packages/cashier/src/stores/crypto-fiat-converter-store.ts index 113b6db4dd5d..b1cb90070bcf 100644 --- a/packages/cashier/src/stores/crypto-fiat-converter-store.ts +++ b/packages/cashier/src/stores/crypto-fiat-converter-store.ts @@ -1,9 +1,9 @@ import { action, observable, makeObservable } from 'mobx'; import { getDecimalPlaces } from '@deriv/shared'; -import { TRootStore, TWebSocket } from '../types'; +import { TRootStore } from '../types'; export default class CryptoFiatConverterStore { - constructor(public WS: TWebSocket, public root_store: TRootStore) { + constructor(public root_store: TRootStore) { makeObservable(this, { converter_from_amount: observable, converter_to_amount: observable, @@ -16,7 +16,6 @@ export default class CryptoFiatConverterStore { setConverterToError: action.bound, setIsTimerVisible: action.bound, resetTimer: action.bound, - getExchangeRate: action.bound, validateFromAmount: action.bound, validateToAmount: action.bound, onChangeConverterFromAmount: action.bound, @@ -55,14 +54,6 @@ export default class CryptoFiatConverterStore { this.setIsTimerVisible(false); } - async getExchangeRate(from_currency?: string, to_currency?: string) { - const { exchange_rates } = await this.WS.send({ - exchange_rates: 1, - base_currency: from_currency, - }); - return to_currency ? exchange_rates?.rates?.[to_currency] : ''; - } - validateFromAmount() { const { account_transfer, general_store, withdraw } = this.root_store.modules.cashier; @@ -86,7 +77,8 @@ export default class CryptoFiatConverterStore { async onChangeConverterFromAmount( { target }: { target: { value: string } }, from_currency?: string, - to_currency?: string + to_currency?: string, + converted_amount?: number ): Promise { const { account_transfer, general_store } = this.root_store.modules.cashier; @@ -102,9 +94,8 @@ export default class CryptoFiatConverterStore { this.setIsTimerVisible(false); account_transfer.setAccountTransferAmount(''); } else { - const rate = await this.getExchangeRate(from_currency, to_currency); const decimals = getDecimalPlaces(to_currency || ''); - const amount = (Number(rate) * Number(target.value)).toFixed(decimals); + const amount = converted_amount?.toFixed(decimals) || '1'; if (+amount || this.converter_from_amount) { this.setConverterToAmount(amount); } else { @@ -123,7 +114,8 @@ export default class CryptoFiatConverterStore { async onChangeConverterToAmount( { target }: { target: { value: string } }, from_currency: string, - to_currency: string + to_currency: string, + converted_amount?: number ): Promise { const { account_transfer, general_store } = this.root_store.modules.cashier; @@ -137,9 +129,8 @@ export default class CryptoFiatConverterStore { this.setIsTimerVisible(false); account_transfer.setAccountTransferAmount(''); } else { - const rate = await this.getExchangeRate(from_currency, to_currency); const decimals = getDecimalPlaces(to_currency); - const amount = (Number(rate) * Number(target.value)).toFixed(decimals); + const amount = converted_amount?.toFixed(decimals) || '1'; if (+amount || this.converter_to_amount) { this.setConverterFromAmount(amount); } else { diff --git a/packages/cashier/src/stores/withdraw-store.ts b/packages/cashier/src/stores/withdraw-store.ts index 9ec944c6b8e9..57115d19b350 100644 --- a/packages/cashier/src/stores/withdraw-store.ts +++ b/packages/cashier/src/stores/withdraw-store.ts @@ -298,7 +298,7 @@ export default class WithdrawStore { this.is_10k_withdrawal_limit_reached = is_limit_reached; } - setWithdrawPercentageSelectorResult(amount: string) { + setWithdrawPercentageSelectorResult(amount: string, exchanged_amount: number) { const { client, modules } = this.root_store; const { crypto_fiat_converter, general_store } = modules.cashier; const { currency, current_fiat_currency } = client; @@ -309,7 +309,8 @@ export default class WithdrawStore { crypto_fiat_converter.onChangeConverterFromAmount( { target: { value: amount } }, currency, - current_fiat_currency || 'USD' + current_fiat_currency || 'USD', + exchanged_amount ); } else { crypto_fiat_converter.resetConverter(); diff --git a/packages/core/src/Stores/common-store.js b/packages/core/src/Stores/common-store.js index c32704bcbe29..f90edb3f719f 100644 --- a/packages/core/src/Stores/common-store.js +++ b/packages/core/src/Stores/common-store.js @@ -52,7 +52,6 @@ export default class CommonStore extends BaseStore { routeTo: action.bound, addRouteHistoryItem: action.bound, changeSelectedLanguage: action.bound, - getExchangeRate: action.bound, routeBackInApp: action.bound, }); } @@ -305,12 +304,6 @@ export default class CommonStore extends BaseStore { isCurrentLanguage = lang => lang === this.current_language; - getExchangeRate = async (from_currency, to_currency) => { - const { exchange_rates } = await BinarySocket.exchange_rates(from_currency); - - return exchange_rates?.rates?.[to_currency]; - }; - routeBackInApp(history, additional_platform_path = []) { let route_to_item_idx = -1; const route_to_item = this.app_routing_history.find((history_item, idx) => { diff --git a/packages/core/src/Utils/ExchangeCurrencyRate/exchange_currency_rate.js b/packages/core/src/Utils/ExchangeCurrencyRate/exchange_currency_rate.js deleted file mode 100644 index 50e78e3b1197..000000000000 --- a/packages/core/src/Utils/ExchangeCurrencyRate/exchange_currency_rate.js +++ /dev/null @@ -1,7 +0,0 @@ -import BinarySocket from '_common/base/socket_base'; - -export const getExchangeRate = async (from_currency, to_currency) => { - const { exchange_rates } = await BinarySocket.exchange_rates(from_currency); - - return exchange_rates?.rates?.[to_currency]; -}; diff --git a/packages/core/src/_common/base/socket_base.js b/packages/core/src/_common/base/socket_base.js index 96b62c2c87fa..fa77222da03b 100644 --- a/packages/core/src/_common/base/socket_base.js +++ b/packages/core/src/_common/base/socket_base.js @@ -180,8 +180,6 @@ const BinarySocketBase = (() => { const cashier = (action, parameters = {}) => deriv_api.send({ cashier: action, ...parameters }); - const exchange_rates = from_currency => deriv_api.send({ exchange_rates: 1, base_currency: from_currency }); - const cashierPayments = ({ provider, transaction_type }) => deriv_api.send({ cashier_payments: 1, provider, transaction_type }); @@ -426,7 +424,6 @@ const BinarySocketBase = (() => { buyAndSubscribe, sell, cashier, - exchange_rates, cashierPayments, subscribeCashierPayments, cancelCryptoTransaction, From c542e4385a17bc73e649eab040f9630402388e83 Mon Sep 17 00:00:00 2001 From: henry-deriv <118344354+henry-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:24:58 +0800 Subject: [PATCH 004/104] henry/93255/fix: push accumulators to top of trade types dropdown (#8241) * fix: push accumulators to top of trade types dropdown * fix: sort order done * fix: refactor * fix: refactor --------- Co-authored-by: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> --- .../Components/Form/ContractType/contract-type-widget.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.jsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.jsx index e5af0112a3d1..2d8096d809dd 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-widget.jsx @@ -84,9 +84,7 @@ const ContractTypeWidget = ({ is_equal, name, value, list, onChange, languageCha const list_with_category = () => { const contract_type_category_icon = getContractTypeCategoryIcons(); - - // Order the list based on categories provided in order_arr - const order_arr = ['Vanillas', 'Ups & Downs', 'Highs & Lows', 'Digits', 'Accumulators']; + const order_arr = ['Accumulators', 'Multipliers', 'Vanillas', 'Ups & Downs', 'Highs & Lows', 'Digits']; const ordered_list = list.sort((a, b) => order_arr.indexOf(a.key) - order_arr.indexOf(b.key)); const accumulators_category = ordered_list.filter(({ label }) => label === localize('Accumulators')); const multipliers_category = ordered_list.filter(({ label }) => label === localize('Multipliers')); From 54f6d7badf4db6404b77342547b75b3e29300ca3 Mon Sep 17 00:00:00 2001 From: adrienne-deriv <103016120+adrienne-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:28:18 +0800 Subject: [PATCH 005/104] Adrienne / Sanitized rename utility function from regular expression injection (#8317) * fix: escaped html for redirects * chore: sanitized link by escaping html * chore: removed old code * chore: updated regex * chore: sanitized rename script for valid file names * chore: sanitized argument input from regex * chore: removed old changes * chore: removed imports for escape-string-regexp --------- Co-authored-by: Jim Daniels Wasswa <104334373+jim-deriv@users.noreply.github.com> Co-authored-by: Ali(Ako) Hosseini --- packages/components/utils/rename.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/components/utils/rename.js b/packages/components/utils/rename.js index fa322912a230..a891b1fd47e3 100644 --- a/packages/components/utils/rename.js +++ b/packages/components/utils/rename.js @@ -6,8 +6,18 @@ const { join } = require('path'); const { readdirSync, renameSync } = require('fs'); +const escapeStringRegExp = str => { + const matchOperatorsRegex = /[|\\{}()[\]^$+*?.-]/g; + + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRegex, '\\$&'); +}; + const [dir, search, replace] = process.argv.slice(2); -const match = RegExp(search, 'g'); +const match = RegExp(escapeStringRegExp(search), 'g'); const files = readdirSync(dir); files From d0957a3977f000841fb078fc202c5ce1a8f43dae Mon Sep 17 00:00:00 2001 From: Farzin Mirzaie <72082844+farzin-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:38:25 +0800 Subject: [PATCH 006/104] Farzin/R&D/WALL-746/FeatureFlag (#8855) * feat(stores): :sparkles: add `FeatureFlagsStore` * feat(hooks): :sparkles: add `useFeatureFlags` * feat(core): :sparkles: add flag manager to the endpoint page * fix(stores): :green_heart: fix CI fail * ci: :green_heart: trigger build * perf(hooks): :zap: use `reduce()` instead of `map().reduce()` * perf(hooks): :zap: memoize the result of `useFeatureFlags` --------- Co-authored-by: Farzin Mirzaie --- .../core/src/Modules/Endpoint/Endpoint.jsx | 25 ++++++++++++++ .../src/__tests__/useFeatureFlags.spec.tsx | 34 +++++++++++++++++++ packages/hooks/src/index.ts | 3 +- packages/hooks/src/useFeatureFlags.ts | 24 +++++++++++++ packages/stores/src/mockStore.ts | 5 +++ packages/stores/src/storeProvider.tsx | 3 +- packages/stores/src/stores/BaseStore.ts | 6 ++-- .../stores/src/stores/FeatureFlagsStore.ts | 31 +++++++++++++++++ packages/stores/src/stores/index.ts | 1 + packages/stores/types.ts | 3 +- 10 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 packages/hooks/src/__tests__/useFeatureFlags.spec.tsx create mode 100644 packages/hooks/src/useFeatureFlags.ts create mode 100644 packages/stores/src/stores/FeatureFlagsStore.ts diff --git a/packages/core/src/Modules/Endpoint/Endpoint.jsx b/packages/core/src/Modules/Endpoint/Endpoint.jsx index d6fdb0321f89..0c8235950fd6 100644 --- a/packages/core/src/Modules/Endpoint/Endpoint.jsx +++ b/packages/core/src/Modules/Endpoint/Endpoint.jsx @@ -2,6 +2,30 @@ import React from 'react'; import { Field, Form, Formik } from 'formik'; import { Button, Input, Checkbox, Text } from '@deriv/components'; import { getDebugServiceWorker, getAppId, getSocketURL, PlatformContext, isMobile } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; + +const FeatureFlagsSection = observer(() => { + const { feature_flags } = useStore(); + + if (!feature_flags.data) return null; + + return ( +
+ + Feature flags + + {Object.keys(feature_flags.data).map(flag => ( +
+ feature_flags.update(old => ({ ...old, [flag]: e.target.checked }))} + /> +
+ ))} +
+ ); +}); const InputField = props => { return ( @@ -149,6 +173,7 @@ const Endpoint = () => { text='Reset to original settings' secondary /> + )} diff --git a/packages/hooks/src/__tests__/useFeatureFlags.spec.tsx b/packages/hooks/src/__tests__/useFeatureFlags.spec.tsx new file mode 100644 index 000000000000..203c81870a29 --- /dev/null +++ b/packages/hooks/src/__tests__/useFeatureFlags.spec.tsx @@ -0,0 +1,34 @@ +import * as React from 'react'; +import { StoreProvider, mockStore } from '@deriv/stores'; +import { renderHook } from '@testing-library/react-hooks'; +import useFeatureFlags from '../useFeatureFlags'; + +describe('useFeatureFlags', () => { + test('should return false for the test flag', async () => { + // @ts-expect-error Using a test flag key for testing purposes. + const mock = mockStore({ feature_flags: { data: { test_flag: false } } }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + + const { result } = renderHook(() => useFeatureFlags(), { wrapper }); + + // @ts-expect-error Using a test flag key for testing purposes. + expect(result.current.is_test_flag_enabled).toBe(false); + }); + + test('should return true for the test flag', async () => { + // @ts-expect-error Using a test flag key for testing purposes. + const mock = mockStore({ feature_flags: { data: { test_flag: true } } }); + + const wrapper = ({ children }: { children: JSX.Element }) => ( + {children} + ); + + const { result } = renderHook(() => useFeatureFlags(), { wrapper }); + + // @ts-expect-error Using a test flag key for testing purposes. + expect(result.current.is_test_flag_enabled).toBe(true); + }); +}); diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index d114601b9ad6..653f867cea6a 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -7,14 +7,15 @@ export { default as useCashierLocked } from './useCashierLocked'; export { default as useCountdown } from './useCountdown'; export { default as useDepositLocked } from './useDepositLocked'; export { default as useExchangeRate } from './useExchangeRate'; +export { default as useFeatureFlags } from './useFeatureFlags'; export { default as useFiatAccountList } from './useFiatAccountList'; export { default as useHasActiveRealAccount } from './useHasActiveRealAccount'; export { default as useHasCryptoCurrency } from './useHasCryptoCurrency'; export { default as useHasFiatCurrency } from './useHasFiatCurrency'; export { default as useHasMaltaInvestAccount } from './useHasMaltaInvestAccount'; export { default as useHasSetCurrency } from './useHasSetCurrency'; -export { default as useHasSwapFreeAccount } from './useHasSwapFreeAccount'; export { default as useHasSvgAccount } from './useHasSvgAccount'; +export { default as useHasSwapFreeAccount } from './useHasSwapFreeAccount'; export { default as useHasUSDCurrency } from './useHasUSDCurrency'; export { default as useIsP2PEnabled } from './useIsP2PEnabled'; export { default as useIsRealAccountNeededForCashier } from './useIsRealAccountNeededForCashier'; diff --git a/packages/hooks/src/useFeatureFlags.ts b/packages/hooks/src/useFeatureFlags.ts new file mode 100644 index 000000000000..a82cab7463c6 --- /dev/null +++ b/packages/hooks/src/useFeatureFlags.ts @@ -0,0 +1,24 @@ +import { useMemo } from 'react'; +import { useStore } from '@deriv/stores'; + +const useFeatureFlags = () => { + const { feature_flags } = useStore(); + + const result = useMemo(() => { + // Safe to do null assertions here as we are setting default values in the store. + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const flags = feature_flags.data!; + + return Object.keys(flags).reduce( + (previous, current) => ({ + ...previous, + // @ts-expect-error current key is always present in the object, Hence can ignore the TS error. + [`is_${current}_enabled`]: Boolean(flags[current]), + }), + {} as Record<`is_${keyof typeof flags}_enabled`, boolean> + ); + }, [feature_flags.data]); + + return result; +}; +export default useFeatureFlags; diff --git a/packages/stores/src/mockStore.ts b/packages/stores/src/mockStore.ts index 4d07ef9b09a3..fdc85c41b3ec 100644 --- a/packages/stores/src/mockStore.ts +++ b/packages/stores/src/mockStore.ts @@ -338,6 +338,11 @@ const mock = (): TStores & { is_mock: boolean } => { update: jest.fn(), unmount: jest.fn(), }, + feature_flags: { + data: undefined, + update: jest.fn(), + unmount: jest.fn(), + }, }; }; diff --git a/packages/stores/src/storeProvider.tsx b/packages/stores/src/storeProvider.tsx index ab00119d668f..73a35d0b28f3 100644 --- a/packages/stores/src/storeProvider.tsx +++ b/packages/stores/src/storeProvider.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useMemo } from 'react'; import { ExchangeRatesProvider } from './providers'; import StoreContext from './storeContext'; -import { ExchangeRatesStore } from './stores'; +import { ExchangeRatesStore, FeatureFlagsStore } from './stores'; import type { TCoreStores, TStores } from '../types'; const StoreProvider = ({ children, store }: React.PropsWithChildren<{ store: TCoreStores }>) => { @@ -13,6 +13,7 @@ const StoreProvider = ({ children, store }: React.PropsWithChildren<{ store: TCo return { ...store, exchange_rates: new ExchangeRatesStore(), + feature_flags: new FeatureFlagsStore(), }; }, [store]); diff --git a/packages/stores/src/stores/BaseStore.ts b/packages/stores/src/stores/BaseStore.ts index bebe983a7acf..246a87d5e75d 100644 --- a/packages/stores/src/stores/BaseStore.ts +++ b/packages/stores/src/stores/BaseStore.ts @@ -4,14 +4,16 @@ import { makePersistable, stopPersisting } from 'mobx-persist-store'; export default class BaseStore { data: T | undefined = undefined; - constructor(name: string) { + constructor(name: string, onHydrationDone?: VoidFunction) { makeObservable(this, { data: observable, update: action.bound, unmount: action.bound, }); - makePersistable(this, { name, properties: ['data'], storage: window.localStorage }); + makePersistable(this, { name, properties: ['data'], storage: window.localStorage }).then(() => + onHydrationDone?.() + ); } update(data: NonNullable | ((previous?: T) => NonNullable)) { diff --git a/packages/stores/src/stores/FeatureFlagsStore.ts b/packages/stores/src/stores/FeatureFlagsStore.ts new file mode 100644 index 000000000000..d37e6fbbfe54 --- /dev/null +++ b/packages/stores/src/stores/FeatureFlagsStore.ts @@ -0,0 +1,31 @@ +import BaseStore from './BaseStore'; + +const FLAGS = { + foo: false, + bar: false, + baz: false, + // Add your flag here 🚀 +} satisfies Record; + +export default class FeatureFlagsStore extends BaseStore<{ [k in keyof typeof FLAGS]: boolean }> { + constructor() { + super('FeatureFlagsStore', () => { + // Set the default values for the first time. + if (!this.data) this.update(FLAGS); + + // Update the store data if a new flag was added or removed. + if (this.data && Object.keys(this.data).length !== Object.keys(FLAGS).length) { + this.update(old => { + const data = FLAGS; + + Object.keys(FLAGS).forEach(flag => { + // @ts-expect-error flag key is always present in the object, Hence can ignore the TS error. + if (old[flag] !== undefined) data[flag] = old[flag]; + }); + + return data; + }); + } + }); + } +} diff --git a/packages/stores/src/stores/index.ts b/packages/stores/src/stores/index.ts index c4936e6f5429..83324af5936b 100644 --- a/packages/stores/src/stores/index.ts +++ b/packages/stores/src/stores/index.ts @@ -1 +1,2 @@ export { default as ExchangeRatesStore } from './ExchangeRatesStore'; +export { default as FeatureFlagsStore } from './FeatureFlagsStore'; diff --git a/packages/stores/types.ts b/packages/stores/types.ts index a90c88e9ae7e..8c1584c0acdc 100644 --- a/packages/stores/types.ts +++ b/packages/stores/types.ts @@ -10,7 +10,7 @@ import type { } from '@deriv/api-types'; import type { Moment } from 'moment'; import type { RouteComponentProps } from 'react-router'; -import type { ExchangeRatesStore } from './src/stores'; +import type { ExchangeRatesStore, FeatureFlagsStore } from './src/stores'; type TAccount = NonNullable[0] & { balance?: number; @@ -386,4 +386,5 @@ export type TCoreStores = { export type TStores = TCoreStores & { exchange_rates: ExchangeRatesStore; + feature_flags: FeatureFlagsStore; }; From e4d2bbd7566fd172be5a341b47ca29baec3ef460 Mon Sep 17 00:00:00 2001 From: Farzin Mirzaie <72082844+farzin-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:42:30 +0800 Subject: [PATCH 007/104] Farzin/WALL-979/Add `@deriv/utils` (#8912) * feat(utils): :sparkles: add `@deriv/utils` * fix(utils): :memo: resolve PR comments * ci: :green_heart: trigger build * fix(api): :adhesive_bandage: Fix `useRequest` redundant array wrapper type for `mutate` function --------- Co-authored-by: Farzin Mirzaie --- .circleci/config.yml | 7 +++++ .../api/src/__tests__/useRequest.spec.tsx | 2 +- packages/api/src/useRequest.ts | 25 ++++++++++++----- packages/appstore/package.json | 1 - .../funds-protection/funds-protection.tsx | 2 +- packages/hooks/src/useVerifyEmail.ts | 4 +-- packages/utils/jest.config.js | 5 ++++ packages/utils/package.json | 10 +++++++ .../__tests__/unFormatLocaleString.spec.tsx | 27 +++++++++++++++++++ packages/utils/src/index.ts | 1 + packages/utils/src/unFormatLocaleString.ts | 17 ++++++++++++ packages/utils/tsconfig.json | 4 +++ 12 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 packages/utils/jest.config.js create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/__tests__/unFormatLocaleString.spec.tsx create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/unFormatLocaleString.ts create mode 100644 packages/utils/tsconfig.json diff --git a/.circleci/config.yml b/.circleci/config.yml index fcccf2ac8b06..caf112fddd87 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -76,6 +76,7 @@ commands: - "packages/stores/node_modules" - "packages/trader/node_modules" - "packages/translations/node_modules" + - "packages/utils/node_modules" # VERIFY_CACHE_FOLDERS_END (DO NOT REMOVE) build: @@ -260,6 +261,9 @@ jobs: - run: name: "Check TypeScript for @deriv/hooks" command: npx tsc --project packages/hooks/tsconfig.json -noEmit + - run: + name: "Check TypeScript for @deriv/utils" + command: npx tsc --project packages/utils/tsconfig.json -noEmit - run: name: "Check TypeScript for @deriv/stores" command: npx tsc --project packages/stores/tsconfig.json -noEmit @@ -269,6 +273,9 @@ jobs: - run: name: "Check tests for @deriv/hooks" command: bash ./scripts/check-tests.sh packages/hooks/src + - run: + name: "Check tests for @deriv/utils" + command: bash ./scripts/check-tests.sh packages/utils/src - build - run: name: "Run tests" diff --git a/packages/api/src/__tests__/useRequest.spec.tsx b/packages/api/src/__tests__/useRequest.spec.tsx index bd4a4ce3ac65..06bd67f359f4 100644 --- a/packages/api/src/__tests__/useRequest.spec.tsx +++ b/packages/api/src/__tests__/useRequest.spec.tsx @@ -22,7 +22,7 @@ describe('useRequest', () => { const { result, waitFor } = renderHook(() => useRequest('verify_email'), { wrapper }); - result.current.mutate([{ payload: { verify_email: 'john@example.com', type: 'request_email' } }]); + result.current.mutate({ payload: { verify_email: 'john@example.com', type: 'request_email' } }); await waitFor(() => result.current.isSuccess, { timeout: 10000 }); diff --git a/packages/api/src/useRequest.ts b/packages/api/src/useRequest.ts index b0e4e36c2bfe..4d98dd4eda8c 100644 --- a/packages/api/src/useRequest.ts +++ b/packages/api/src/useRequest.ts @@ -1,3 +1,4 @@ +import { useCallback } from 'react'; import { useMutation } from '@tanstack/react-query'; import { send } from './utils'; import type { @@ -8,13 +9,23 @@ import type { TSocketResponseData, } from '../types'; -// Todo: Get rid of redundant array wrapper for the props argument. -const useRequest = (name: T, options?: TSocketRequestMutationOptions) => - useMutation, unknown, TSocketAcceptableProps>(props => { - const prop = props?.[0]; - const payload = prop && 'payload' in prop ? (prop.payload as TSocketRequestPayload) : undefined; +const useRequest = (name: T, options?: TSocketRequestMutationOptions) => { + const { mutate: _mutate, ...rest } = useMutation, unknown, TSocketAcceptableProps>( + props => { + const prop = props?.[0]; + const payload = prop && 'payload' in prop ? (prop.payload as TSocketRequestPayload) : undefined; - return send(name, payload); - }, options); + return send(name, payload); + }, + options + ); + + const mutate = useCallback((...payload: TSocketAcceptableProps) => _mutate(payload), [_mutate]); + + return { + mutate, + ...rest, + }; +}; export default useRequest; diff --git a/packages/appstore/package.json b/packages/appstore/package.json index 0913bdf71744..c41dc858fab8 100644 --- a/packages/appstore/package.json +++ b/packages/appstore/package.json @@ -29,7 +29,6 @@ "@deriv/cashier": "^1.0.0", "@deriv/components": "^1.0.0", "@deriv/cfd": "^1.0.0", - "@deriv/hooks": "^1.0.0", "@deriv/shared": "^1.0.0", "@deriv/stores": "^1.0.0", "@deriv/trader": "^3.8.0", diff --git a/packages/cashier/src/components/funds-protection/funds-protection.tsx b/packages/cashier/src/components/funds-protection/funds-protection.tsx index d864c5c49aa2..b0820c21e53c 100644 --- a/packages/cashier/src/components/funds-protection/funds-protection.tsx +++ b/packages/cashier/src/components/funds-protection/funds-protection.tsx @@ -30,7 +30,7 @@ const FundsProtection = () => { /> }

-
diff --git a/packages/hooks/src/useVerifyEmail.ts b/packages/hooks/src/useVerifyEmail.ts index 49dd50798e36..2d7a4de86d42 100644 --- a/packages/hooks/src/useVerifyEmail.ts +++ b/packages/hooks/src/useVerifyEmail.ts @@ -6,7 +6,7 @@ import useCountdown from './useCountdown'; const RESEND_COUNTDOWN = 60; const useVerifyEmail = ( - type: Parameters>['mutate']>[0][0]['payload']['type'] + type: Parameters>['mutate']>[0]['payload']['type'] ) => { const WS = useRequest('verify_email'); const counter = useCountdown({ from: RESEND_COUNTDOWN }); @@ -22,7 +22,7 @@ const useVerifyEmail = ( setSentCount(old => old + 1); - WS.mutate([{ payload: { verify_email: client.email, type } }]); + WS.mutate({ payload: { verify_email: client.email, type } }); }; return { diff --git a/packages/utils/jest.config.js b/packages/utils/jest.config.js new file mode 100644 index 000000000000..207910d7e732 --- /dev/null +++ b/packages/utils/jest.config.js @@ -0,0 +1,5 @@ +const baseConfigForPackages = require('../../jest.config.base'); + +module.exports = { + ...baseConfigForPackages, +}; diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 000000000000..31de5471d9c6 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,10 @@ +{ + "name": "@deriv/utils", + "private": true, + "version": "1.0.0", + "main": "src/index.ts", + "dependencies": {}, + "devDependencies": { + "typescript": "^4.6.3" + } +} diff --git a/packages/utils/src/__tests__/unFormatLocaleString.spec.tsx b/packages/utils/src/__tests__/unFormatLocaleString.spec.tsx new file mode 100644 index 000000000000..06c070021149 --- /dev/null +++ b/packages/utils/src/__tests__/unFormatLocaleString.spec.tsx @@ -0,0 +1,27 @@ +import unFormatLocaleString from '../unFormatLocaleString'; + +describe('unFormatLocaleString', () => { + test('should unformat correctly when the number is less than 3 digits', () => { + const result = unFormatLocaleString('123', 'en-US'); + + expect(result).toBe('123'); + }); + + test('should unformat correctly when the number is more than 3 digits', () => { + const result = unFormatLocaleString('123,456', 'en-US'); + + expect(result).toBe('123456'); + }); + + test('should unformat correctly when the number is more than 3 digits and has decimals', () => { + const result = unFormatLocaleString('123,456.78', 'en-US'); + + expect(result).toBe('123456.78'); + }); + + test('should unformat correctly when the number is more than 3 digits and has decimals and is in spanish', () => { + const result = unFormatLocaleString('123.456,78', 'es-ES'); + + expect(result).toBe('123456.78'); + }); +}); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 000000000000..607e6f4da105 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1 @@ +export { default as unFormatLocaleString } from './unFormatLocaleString'; diff --git a/packages/utils/src/unFormatLocaleString.ts b/packages/utils/src/unFormatLocaleString.ts new file mode 100644 index 000000000000..8af6f29a6572 --- /dev/null +++ b/packages/utils/src/unFormatLocaleString.ts @@ -0,0 +1,17 @@ +const unFormatLocaleString = (input: string, locale: Intl.LocalesArgument) => { + const parts = (12345.6789).toLocaleString(locale).match(/(\D+)/g); + + if (parts && parts.length > 1) { + const is_reverse = parts[parts.length - 1] !== '.'; + const decimal = parts[parts.length - 1]; + const thousand = parts[0]; + + if (is_reverse) return input.replaceAll(decimal, 'temp').replaceAll(thousand, '').replaceAll('temp', '.'); + + return input.replaceAll(thousand, ''); + } + + return input; +}; + +export default unFormatLocaleString; diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 000000000000..1567d5b3db71 --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src"] +} From 07625f4f422e10084a440fc34f975fb89c0ab856 Mon Sep 17 00:00:00 2001 From: vinu-deriv <100689171+vinu-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 07:46:33 +0400 Subject: [PATCH 008/104] fix: fix the imports in journal-notifications (#8841) --- packages/bot-web-ui/src/utils/journal-notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot-web-ui/src/utils/journal-notifications.js b/packages/bot-web-ui/src/utils/journal-notifications.js index b18b42d56871..793de19203a5 100644 --- a/packages/bot-web-ui/src/utils/journal-notifications.js +++ b/packages/bot-web-ui/src/utils/journal-notifications.js @@ -1,5 +1,5 @@ import { localize } from '@deriv/translations'; -import { messageWithButton, arrayAsMessage } from '@deriv/components'; +import { messageWithButton, arrayAsMessage } from 'Components'; const showErrorMessageWithButton = (message, block_id, showErrorMessage, centerAndHighlightBlock) => { showErrorMessage( From 691f369d9be09b23e2b19697912e6ec714a54824 Mon Sep 17 00:00:00 2001 From: shontzu <108507236+shontzu-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:51:58 +0800 Subject: [PATCH 009/104] shontzu/PRODQA-975/DerivX-Topup-page-shows-DerivX-Demo-Swap-Free-accountderiv X demo topup modal have swap-free term on it (#8888) * fix: deriv X demo topup modal doesnt have swap-free term on it * fix: codecov --- .../__tests__/cfd-top-up-demo-modal.spec.js | 1 - .../src/Containers/cfd-top-up-demo-modal.tsx | 25 ++++++++++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/cfd/src/Containers/__tests__/cfd-top-up-demo-modal.spec.js b/packages/cfd/src/Containers/__tests__/cfd-top-up-demo-modal.spec.js index 2116f05466a6..27a3f4b65e2b 100644 --- a/packages/cfd/src/Containers/__tests__/cfd-top-up-demo-modal.spec.js +++ b/packages/cfd/src/Containers/__tests__/cfd-top-up-demo-modal.spec.js @@ -79,7 +79,6 @@ describe('CFDTopUpDemoModal', () => { render(); expect(screen.getByText('Fund top up')).toBeInTheDocument(); expect(screen.getByText('Current balance')).toBeInTheDocument(); - expect(screen.getByText('Demo Financial account')).toBeInTheDocument(); expect(screen.queryByTestId('dt_top_up_virtual_description')).toBeInTheDocument(); expect(screen.getByRole('button', { name: /Top up/i })).toBeInTheDocument(); }); diff --git a/packages/cfd/src/Containers/cfd-top-up-demo-modal.tsx b/packages/cfd/src/Containers/cfd-top-up-demo-modal.tsx index db55141ebe3d..1bd8a101bd64 100644 --- a/packages/cfd/src/Containers/cfd-top-up-demo-modal.tsx +++ b/packages/cfd/src/Containers/cfd-top-up-demo-modal.tsx @@ -1,7 +1,7 @@ import React from 'react'; import SuccessDialog from '../Components/success-dialog.jsx'; import { Icon, Modal, Button, Money, Text } from '@deriv/components'; -import { getCFDPlatformLabel } from '@deriv/shared'; +import { getCFDPlatformLabel, CFD_PLATFORMS } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; import { DetailsOfEachMT5Loginid } from '@deriv/api-types'; import RootStore from '../Stores/index'; @@ -43,10 +43,27 @@ const CFDTopUpDemoModal = ({ topUpVirtual, }: TCFDTopUpDemoModalProps) => { const getAccountTitle = React.useCallback(() => { + let title = ''; if ((!mt5_companies && !dxtrade_companies) || !current_account) return ''; - return mt5_companies[current_account.category as keyof TMtCompanies][ - current_account.type as keyof TMtCompanies['demo' | 'real'] - ].title; + + switch (platform) { + case CFD_PLATFORMS.MT5: + title = + mt5_companies[current_account.category as keyof TMtCompanies][ + current_account.type as keyof TMtCompanies['demo' | 'real'] + ].title; + break; + case CFD_PLATFORMS.DXTRADE: + title = + dxtrade_companies[current_account.category as keyof TDxCompanies][ + current_account.type as keyof TDxCompanies['demo' | 'real'] + ].title; + break; + default: + break; + } + + return title; }, [mt5_companies, dxtrade_companies, current_account]); const onCloseSuccess = () => { From c55a07f1ed05b3cedd66dac1a02648d590136634 Mon Sep 17 00:00:00 2001 From: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:55:25 +0800 Subject: [PATCH 010/104] chore: :sparkles: added survicate script for dbot (#8923) * chore: :sparkles: added survicate script for dbot * chore: :sparkeles: moved survicate to app component --- packages/bot-web-ui/src/app/app-content.jsx | 10 ++++---- packages/bot-web-ui/src/app/app.tsx | 27 ++++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/bot-web-ui/src/app/app-content.jsx b/packages/bot-web-ui/src/app/app-content.jsx index 092d785287ac..d8444ab4bb5f 100644 --- a/packages/bot-web-ui/src/app/app-content.jsx +++ b/packages/bot-web-ui/src/app/app-content.jsx @@ -1,6 +1,7 @@ import React from 'react'; +import { ApiHelpers, ServerTime, setColors } from '@deriv/bot-skeleton'; import { Loading } from '@deriv/components'; -import { ServerTime, ApiHelpers, setColors } from '@deriv/bot-skeleton'; +import { observer, useStore } from '@deriv/stores'; import { Audio, BotFooterExtensions, @@ -9,12 +10,11 @@ import { NetworkToastPopup, RoutePromptDialog, } from 'Components'; -import BlocklyLoading from '../components/blockly-loading'; +import BotBuilder from 'Components/dashboard/bot-builder'; +import GTM from 'Utils/gtm'; import { MobxContentProvider } from 'Stores/connect'; -import { observer, useStore } from '@deriv/stores'; import { useDBotStore } from 'Stores/useDBotStore'; -import GTM from 'Utils/gtm'; -import BotBuilder from 'Components/dashboard/bot-builder'; +import BlocklyLoading from '../components/blockly-loading'; import './app.scss'; const AppContent = observer(() => { diff --git a/packages/bot-web-ui/src/app/app.tsx b/packages/bot-web-ui/src/app/app.tsx index a5883ffc118c..1d938f5c0caa 100644 --- a/packages/bot-web-ui/src/app/app.tsx +++ b/packages/bot-web-ui/src/app/app.tsx @@ -1,7 +1,7 @@ import '../public-path'; // Leave this here (at the top)! OK boss! import React from 'react'; +import type { TRootStore, TWebSocket } from 'Types'; import AppContent from './app-content'; -import type { TWebSocket, TRootStore } from 'Types'; import DBotProviders from './dbot-providers'; type TAppProps = { @@ -14,6 +14,31 @@ type TAppProps = { const App = ({ passthrough }: TAppProps) => { const { root_store, WS } = passthrough; + React.useEffect(() => { + const initSurvicate = () => { + if (document.getElementById('dbot-survicate')) { + const survicate_box = document.getElementById('survicate-box') || undefined; + if (survicate_box) { + survicate_box.style.display = 'block'; + } + return; + } + const script = document.createElement('script'); + script.id = 'dbot-survicate'; + script.async = true; + script.src = 'https://survey.survicate.com/workspaces/83b651f6b3eca1ab4551d95760fe5deb/web_surveys.js'; + document.body.appendChild(script); + }; + + initSurvicate(); + return () => { + const survicate_box = document.getElementById('survicate-box') || undefined; + if (survicate_box) { + survicate_box.style.display = 'none'; + } + }; + }, []); + return ( From a431f4c29cae907d1288a6e32f0a1b19417712b7 Mon Sep 17 00:00:00 2001 From: Jim Daniels Wasswa <104334373+jim-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:03:29 +0800 Subject: [PATCH 011/104] Jim | Hamza/88557/replace-connect-with-use-store-trader-parent (#8270) * chore: add useTraderStores * chore: add trader-providers * refactor: replace MobxContentProvider with TraderProviders * chore: update trader to trade * refactor: replace connect in Trader package v1.0 (#76) * refactor: contract-replay, contract-drawer and contract-drawer-card to use useStore (#77) * Jim/93585/replace connect with usestore in market countdown timer market unavailable trade modals unsupported contract modal (#79) * refactor: remove connect from market-countdown-timer * refactor: remove connect from market-unavailable * refactor: remove connect from trade-modals * refactor: move is_visible prop to market-unavailable * refactor: remove connect from unsupported-contract-modal * Hamza/93474/replace connect with use trader store (#78) * refactor: replace connect in Trader package v1.0 * refactor: replace connect with useTraderStore v1.2 * refactor: replace connect with useTraderStore v1.2.1 * refactor: replace connect with useTraderStore v1.2.2 * refactor: replace connect with useTraderStore v1.2.3 * Hamza/93474/replace connect with use trader store (#80) * refactor: replace connect in Trader package v1.0 * refactor: replace connect with useTraderStore v1.2 * refactor: replace connect with useTraderStore v1.2.1 * refactor: replace connect with useTraderStore v1.2.2 * refactor: replace connect with useTraderStore v1.2.3 * refactor: replace connect with useTraderStore v1.3 * refactor: replace connect with useTraderStore v1.4 * Jim/93604/replace connect with use store in positions drawer positions modal card toggle positions mobile time picker populate header (#81) * refactor: remove connect from positions-drawer * refactor: remove connect from positions-modal-card * refactor: remove connect from toggle-positions-mobile * refactor: remove connect from time-picker * refactor: remove connect from populate-header * Jim/93667/replace connect with use store in trade header extensions trade settings extensions progress slider stream routes (#83) * refactor: remove connect from positions-drawer * refactor: remove connect from positions-modal-card * refactor: remove connect from toggle-positions-mobile * refactor: remove connect from time-picker * refactor: remove connect from populate-header * refactor: remove connect from trade-footer-extensions * refactor: migrate trade-header-extensions to ts and remove connect from it * refactor: migrate trade-settings-extensions to ts and remove connect from it * refactor: remove connect from progress-slider-stream and routes * chore: update mocstore with new fields * Hamza/93474/replace connect with use trader store (#82) * refactor: replace connect in Trader package v1.0 * refactor: replace connect with useTraderStore v1.2 * refactor: replace connect with useTraderStore v1.2.1 * refactor: replace connect with useTraderStore v1.2.2 * refactor: replace connect with useTraderStore v1.2.3 * refactor: replace connect with useTraderStore v1.3 * refactor: replace connect with useTraderStore v1.4 * refactor: replace connect with useTraderStore v1.5 * refactor: replace connect with useTraderStore v1.5.1 * refactor: replace connect with useTraderStore v1.5.2 * refactor: replace connect with useTraderStore v1.5.3 test failing fixed * refactor: replace connect with useTraderStore v1.5.4 * Jim/88556/replace connect with use store in settings chart accumulators stats contract replay widget contract and toolbar widgets (#84) * chore: removeconnectsettings-chart/accumulators-stats/contract-replay-widget/contracttoolbar-widgets * refactor: remove connect from accumulators-stats.spec * refactor: replace connect in top-widgets_cancel-deal-mobile_risk-management-info_mobile-widget * Hamza/93474/replace connect with use trader store (#85) * refactor: replace connect in Trader package v1.0 * refactor: replace connect with useTraderStore v1.2 * refactor: replace connect with useTraderStore v1.2.1 * refactor: replace connect with useTraderStore v1.2.2 * refactor: replace connect with useTraderStore v1.2.3 * refactor: replace connect with useTraderStore v1.3 * refactor: replace connect with useTraderStore v1.4 * refactor: replace connect with useTraderStore v1.5 * refactor: replace connect with useTraderStore v1.5.1 * refactor: replace connect with useTraderStore v1.5.2 * refactor: replace connect with useTraderStore v1.5.3 test failing fixed * refactor: replace connect with useTraderStore v1.5.4 * refactor: replace the connect with useStore v1.6 * fix: reverted the duration-wrapper * fix: the duration-wrapper * refactor: replace connect in top-widgets_cancel-deal-mobile_risk-management-info_mobile-widget (#86) * refactor: restore component structure to its original form * refactor: remove MobxContentProvider * refactor: replace connect in strike, vanilla-trade-type, screen-small, chart-widgets, and test * Jim/93866/replace_connect_with_usestore_in_strike_vanilla-trade-type_screen-small_chart-widgets_and_test (#87) * refactor: replace connect in top-widgets_cancel-deal-mobile_risk-management-info_mobile-widget * refactor: restore component structure to its original form * refactor: remove MobxContentProvider * refactor: replace connect in strike, vanilla-trade-type, screen-small, chart-widgets, and test * Hamza/93474/replace connect with use trader store (#88) * refactor: replace connect in Trader package v1.0 * refactor: replace connect with useTraderStore v1.2 * refactor: replace connect with useTraderStore v1.2.1 * refactor: replace connect with useTraderStore v1.2.2 * refactor: replace connect with useTraderStore v1.2.3 * refactor: replace connect with useTraderStore v1.3 * refactor: replace connect with useTraderStore v1.4 * refactor: replace connect with useTraderStore v1.5 * refactor: replace connect with useTraderStore v1.5.1 * refactor: replace connect with useTraderStore v1.5.2 * refactor: replace connect with useTraderStore v1.5.3 test failing fixed * refactor: replace connect with useTraderStore v1.5.4 * refactor: replace the connect with useStore v1.6 * fix: reverted the duration-wrapper * fix: the duration-wrapper * fix: contract not bought error config missing from props * refactor: remove connect function definition and connectwithcontractupdates * Jim/93908/remove-connect-and-connect-with-contract-updates-definitions from trader (#89) * refactor: replace connect in top-widgets_cancel-deal-mobile_risk-management-info_mobile-widget * refactor: restore component structure to its original form * refactor: remove MobxContentProvider * refactor: replace connect in strike, vanilla-trade-type, screen-small, chart-widgets, and test * refactor: remove connect function definition and connectwithcontractupdates * refactor: address whitespace comments, type exportsclear * chore: remove unused invalid import * chore: add type keyword on import statement * chore: add whitespace * refactor: remove passthrough.root_store * chore: restore props * chore: remove sonarcloud bug * refactor: wrap allowequalsmobile in a div to make it collapsible --------- Co-authored-by: Muhammad Hamza <120543468+hamza-deriv@users.noreply.github.com> --- .../src/components/u-i-loader/ui-loader.tsx | 4 +- packages/stores/src/mockStore.ts | 3 + packages/stores/types.ts | 9 + .../ContractDrawer/contract-drawer-card.jsx | 318 ++++---- .../ContractDrawer/contract-drawer.jsx | 280 ++++--- .../market-unavailable.jsx | 67 +- .../unsupported-contract-modal.jsx | 49 +- .../PositionsDrawer/positions-drawer.jsx | 112 ++- .../PositionsDrawer/positions-modal-card.jsx | 731 +++++++++--------- .../toggle-positions-mobile.jsx | 235 +++--- .../Elements/market-countdown-timer.jsx | 13 +- .../Form/TimePicker/time-picker.jsx | 188 +++-- .../App/Containers/Modals/trade-modals.jsx | 60 +- .../progress-slider-stream.jsx | 17 +- .../src/App/Containers/Routes/routes.jsx | 46 +- .../SettingsModal/settings-chart.jsx | 76 +- .../src/App/Containers/populate-header.jsx | 62 +- .../Containers/trade-footer-extensions.jsx | 30 +- ...nsions.jsx => trade-header-extensions.tsx} | 58 +- ...ions.jsx => trade-settings-extensions.tsx} | 32 +- packages/trader/src/App/app.tsx | 42 +- .../__tests__/accumulators-stats.spec.js | 56 +- .../AccumulatorsStats/accumulators-stats.jsx | 18 +- .../Containers/contract-replay-widget.jsx | 61 +- .../Contract/Containers/contract-replay.jsx | 275 +++---- .../Modules/Contract/Containers/contract.jsx | 36 +- .../SmartChart/Components/control-widgets.jsx | 41 +- .../SmartChart/Components/toolbar-widgets.jsx | 20 +- .../SmartChart/Components/top-widgets.jsx | 14 +- .../Multiplier/cancel-deal-mobile.jsx | 211 +++-- .../Multiplier/risk-management-info.jsx | 37 +- .../Components/Elements/mobile-widget.jsx | 53 +- .../Form/DatePicker/trading-date-picker.jsx | 60 +- .../Form/Purchase/cancel-deal-info.jsx | 13 +- .../Form/TimePicker/trading-time-picker.jsx | 42 +- .../Accumulator/__tests__/accumulator.spec.js | 32 +- .../accumulators-info-display.spec.js | 24 +- .../TradeParams/Accumulator/accumulator.jsx | 37 +- .../accumulators-amount-mobile.jsx | 34 +- .../Accumulator/accumulators-info-display.jsx | 22 +- .../Duration/advanced-duration.jsx | 230 +++--- .../TradeParams/Duration/duration-mobile.jsx | 589 +++++++------- .../TradeParams/Duration/duration-wrapper.jsx | 90 ++- .../TradeParams/Duration/simple-duration.jsx | 125 ++- .../TradeParams/Multiplier/cancel-deal.jsx | 51 +- .../Multiplier/expiration-modal.jsx | 17 +- .../TradeParams/Multiplier/expiration.jsx | 17 +- .../Form/TradeParams/Multiplier/info.jsx | 203 +++-- .../TradeParams/Multiplier/multiplier.jsx | 22 +- .../Form/TradeParams/Multiplier/stop-loss.jsx | 65 +- .../TradeParams/Multiplier/take-profit.jsx | 65 +- .../Form/TradeParams/Multiplier/widgets.jsx | 41 +- .../Form/TradeParams/amount-mobile.jsx | 372 +++++---- .../Components/Form/TradeParams/amount.jsx | 100 +-- .../Components/Form/TradeParams/barrier.jsx | 59 +- .../Form/TradeParams/last-digit.jsx | 13 +- .../Components/Form/TradeParams/strike.jsx | 44 +- .../Form/TradeParams/vanilla-trade-types.jsx | 17 +- .../Trading/Components/Form/screen-small.jsx | 81 +- .../Multiplier/multiplier-amount-modal.jsx | 41 +- .../Multiplier/multiplier-options.jsx | 19 +- .../Multiplier/risk-management-dialog.jsx | 40 +- .../Trading/Containers/allow-equals.jsx | 17 +- .../Trading/Containers/chart-widgets.jsx | 59 +- .../Trading/Containers/contract-type.jsx | 52 +- .../Modules/Trading/Containers/purchase.jsx | 103 +-- .../Containers/radio-group-options-modal.jsx | 33 +- .../src/Modules/Trading/Containers/test.jsx | 27 +- .../Trading/Containers/toast-popup.jsx | 19 +- .../Containers/trade-params-mobile.jsx | 316 ++++---- .../Trading/Containers/trade-params.jsx | 14 +- .../src/Modules/Trading/Containers/trade.jsx | 234 ++---- .../Modules/Trading/Helpers/multiplier.js | 13 - packages/trader/src/Stores/connect.js | 31 - .../trader/src/Stores/useTraderStores.tsx | 22 + packages/trader/src/trader-providers.tsx | 14 + 76 files changed, 2987 insertions(+), 3786 deletions(-) rename packages/trader/src/App/Containers/{trade-header-extensions.jsx => trade-header-extensions.tsx} (55%) rename packages/trader/src/App/Containers/{trade-settings-extensions.jsx => trade-settings-extensions.tsx} (68%) delete mode 100644 packages/trader/src/Stores/connect.js create mode 100644 packages/trader/src/Stores/useTraderStores.tsx create mode 100644 packages/trader/src/trader-providers.tsx diff --git a/packages/components/src/components/u-i-loader/ui-loader.tsx b/packages/components/src/components/u-i-loader/ui-loader.tsx index 34ce92b6b06a..beb8f24586a6 100644 --- a/packages/components/src/components/u-i-loader/ui-loader.tsx +++ b/packages/components/src/components/u-i-loader/ui-loader.tsx @@ -1,10 +1,12 @@ import React from 'react'; import classNames from 'classnames'; +import Loadable from 'react-loadable'; type TUILoader = { className?: string; classNameBlock?: string; -}; +} & Loadable.LoadingComponentProps; + const UILoader = ({ className, classNameBlock }: TUILoader) => { const block_class = classNames(classNameBlock, 'block-ui'); const loading_class = classNames('block-ui__loading', className); diff --git a/packages/stores/src/mockStore.ts b/packages/stores/src/mockStore.ts index fdc85c41b3ec..5a4ae83af7a2 100644 --- a/packages/stores/src/mockStore.ts +++ b/packages/stores/src/mockStore.ts @@ -136,6 +136,7 @@ const mock = (): TStores & { is_mock: boolean } => { is_trading_experience_incomplete: false, is_virtual: false, is_withdrawal_lock: false, + is_populating_account_list: false, landing_company_shortcode: '', local_currency_config: { currency: '', @@ -262,6 +263,8 @@ const mock = (): TStores & { is_mock: boolean } => { is_real_acc_signup_on: false, is_need_real_account_for_cashier_modal_visible: false, toggleNeedRealAccountForCashierModal: jest.fn(), + populateHeaderExtensions: jest.fn(), + populateSettingsExtensions: jest.fn(), setShouldShowCooldownModal: jest.fn(), }, traders_hub: { diff --git a/packages/stores/types.ts b/packages/stores/types.ts index 8c1584c0acdc..81c6c886a067 100644 --- a/packages/stores/types.ts +++ b/packages/stores/types.ts @@ -12,6 +12,12 @@ import type { Moment } from 'moment'; import type { RouteComponentProps } from 'react-router'; import type { ExchangeRatesStore, FeatureFlagsStore } from './src/stores'; +type TPopulateSettingsExtensionsMenuItem = { + icon: string; + label: string; + value: (props: T) => JSX.Element; +}; + type TAccount = NonNullable[0] & { balance?: number; }; @@ -165,6 +171,7 @@ type TClientStore = { is_virtual: boolean; is_withdrawal_lock: boolean; landing_company_shortcode: string; + is_populating_account_list: boolean; local_currency_config: { currency: string; decimal_places?: number; @@ -296,6 +303,8 @@ type TUiStore = { is_real_acc_signup_on: boolean; is_need_real_account_for_cashier_modal_visible: boolean; toggleNeedRealAccountForCashierModal: () => void; + populateHeaderExtensions: (header_items: JSX.Element | null) => void; + populateSettingsExtensions: (menu_items: Array | null) => void; setShouldShowCooldownModal: (value: boolean) => void; }; diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx index 294ddb4ecb87..6f7c2ecd4fe9 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer-card.jsx @@ -4,196 +4,172 @@ import React from 'react'; import { DesktopWrapper, MobileWrapper, Collapsible, ContractCard, useHover } from '@deriv/components'; import { isCryptoContract, isDesktop, getEndTime, getSymbolDisplayName } from '@deriv/shared'; import { getCardLabels, getContractTypeDisplay } from 'Constants/contract'; -import { connect } from 'Stores/connect'; import { getMarketInformation } from 'Utils/Helpers/market-underlying'; import { SwipeableContractDrawer } from './swipeable-components.jsx'; import MarketClosedContractOverlay from './market-closed-contract-overlay.jsx'; -import { connectWithContractUpdate } from 'Stores/Modules/Trading/Helpers/multiplier'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; -const ContractDrawerCard = ({ - active_symbols, - addToast, - contract_info, - contract_update, - currency, - current_focus, - getContractById, - is_accumulator, - is_market_closed, - is_mobile, - is_multiplier, - is_vanilla, - is_sell_requested, - is_collapsed, - onClickCancel, - onClickSell, - onSwipedUp, - onSwipedDown, - removeToast, - result, - setCurrentFocus, - server_time, - should_show_cancellation_warning, - status, - toggleCancellationWarning, - toggleContractAuditDrawer, -}) => { - const [hover_ref, should_hide_closed_overlay] = useHover(); +const ContractDrawerCard = observer( + ({ + contract_info, + contract_update, + currency, + is_accumulator, + is_market_closed, + is_mobile, + is_multiplier, + is_vanilla, + is_sell_requested, + is_collapsed, + onClickCancel, + onClickSell, + onSwipedUp, + onSwipedDown, + result, + server_time, + status, + toggleContractAuditDrawer, + }) => { + const { ui, contract_trade } = useStore(); + const { active_symbols } = useTraderStore(); + const { + addToast, + current_focus, + removeToast, + should_show_cancellation_warning, + setCurrentFocus, + toggleCancellationWarning, + } = ui; + const { getContractById } = contract_trade; + const [hover_ref, should_hide_closed_overlay] = useHover(); - const { profit, underlying: symbol } = contract_info; - const is_sold = !!getEndTime(contract_info); - const display_name = getSymbolDisplayName(active_symbols, getMarketInformation(contract_info.shortcode).underlying); + const { profit, underlying: symbol } = contract_info; + const is_sold = !!getEndTime(contract_info); + const display_name = getSymbolDisplayName( + active_symbols, + getMarketInformation(contract_info.shortcode).underlying + ); - const is_crypto = isCryptoContract(contract_info.underlying); - const has_progress_slider = !is_multiplier || (is_crypto && is_multiplier); + const is_crypto = isCryptoContract(contract_info.underlying); + const has_progress_slider = !is_multiplier || (is_crypto && is_multiplier); - const card_header = ( - - ); + const card_header = ( + + ); - const card_body = ( - - ); + const card_body = ( + + ); - const card_footer = ( - - ); + const card_footer = ( + + ); - const contract_el = ( - - {card_header} - {card_body} - - ); + const contract_el = ( + + {card_header} + {card_body} + + ); - const contract_card = ( - -
0 && !result, - 'dc-contract-card--red': is_mobile && !is_multiplier && profit < 0 && !result, - 'contract-card__market-closed--disabled': is_market_closed && should_hide_closed_overlay, - })} - ref={hover_ref} + const contract_card = ( + - {is_market_closed && !getEndTime(contract_info) && ( -
- -
- )} - {contract_el} - {card_footer} -
-
- ); - - const has_swipeable_drawer = is_sold || is_multiplier || is_accumulator || is_vanilla; - - return ( - - {contract_card} - - 0 && !result, + 'dc-contract-card--red': is_mobile && !is_multiplier && profit < 0 && !result, + 'contract-card__market-closed--disabled': is_market_closed && should_hide_closed_overlay, + })} + ref={hover_ref} > - {has_swipeable_drawer && ( - + {is_market_closed && !getEndTime(contract_info) && ( +
+ +
)} - {contract_card} -
-
-
- ); -}; + {contract_el} + {card_footer} + + + ); + + const has_swipeable_drawer = is_sold || is_multiplier || is_accumulator || is_vanilla; + + return ( + + {contract_card} + + + {has_swipeable_drawer && ( + + )} + {contract_card} + + + + ); + } +); ContractDrawerCard.propTypes = { - active_symbols: PropTypes.array, - addToast: PropTypes.func, - contract_info: PropTypes.object, - contract_update: PropTypes.object, currency: PropTypes.string, - current_focus: PropTypes.string, - getContractById: PropTypes.func, is_accumulator: PropTypes.bool, is_collapsed: PropTypes.bool, - is_market_closed: PropTypes.bool, - is_mobile: PropTypes.bool, - is_multiplier: PropTypes.bool, - is_vanilla: PropTypes.bool, - is_sell_requested: PropTypes.bool, onClickCancel: PropTypes.func, onClickSell: PropTypes.func, - onSwipedDown: PropTypes.func, - onSwipedUp: PropTypes.func, - status: PropTypes.string, - removeToast: PropTypes.func, - result: PropTypes.any, - server_time: PropTypes.object, - setCurrentFocus: PropTypes.func, - should_show_cancellation_warning: PropTypes.bool, - toggleCancellationWarning: PropTypes.func, - toggleContractAuditDrawer: PropTypes.func, }; - -export default connect(({ modules, ui, contract_trade }) => ({ - active_symbols: modules.trade.active_symbols, - addToast: ui.addToast, - current_focus: ui.current_focus, - getContractById: contract_trade.getContractById, - removeToast: ui.removeToast, - should_show_cancellation_warning: ui.should_show_cancellation_warning, - setCurrentFocus: ui.setCurrentFocus, - toggleCancellationWarning: ui.toggleCancellationWarning, -}))(ContractDrawerCard); +export default ContractDrawerCard; diff --git a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx index 11620824a1d2..daaad6f0f55e 100644 --- a/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx +++ b/packages/trader/src/App/Components/Elements/ContractDrawer/contract-drawer.jsx @@ -14,33 +14,87 @@ import { } from '@deriv/shared'; import ContractAudit from 'App/Components/Elements/ContractAudit'; import { PositionsCardLoader } from 'App/Components/Elements/ContentLoader'; -import { connect } from 'Stores/connect'; import ContractDrawerCard from './contract-drawer-card.jsx'; import { SwipeableContractAudit } from './swipeable-components.jsx'; +import { observer, useStore } from '@deriv/stores'; -const ContractDrawer = ({ - contract_info, - contract_update, - contract_update_history, - is_accumulator, - is_mobile, - is_sell_requested, - is_dark_theme, - is_market_closed, - is_multiplier, - is_vanilla, - onClickCancel, - onClickSell, - server_time, - status, - toggleHistoryTab, -}) => { - const { currency, exit_tick_display_value, is_sold } = contract_info; - const contract_drawer_ref = React.useRef(); - const contract_drawer_card_ref = React.useRef(); - const [should_show_contract_audit, setShouldShowContractAudit] = React.useState(false); +const ContractDrawer = observer( + ({ + contract_info, + contract_update, + contract_update_history, + is_accumulator, + is_sell_requested, + is_dark_theme, + is_market_closed, + is_multiplier, + is_vanilla, + onClickCancel, + onClickSell, + status, + toggleHistoryTab, + }) => { + const { common, ui } = useStore(); + const { server_time } = common; + const { is_mobile } = ui; + const { currency, exit_tick_display_value, is_sold } = contract_info; + const contract_drawer_ref = React.useRef(); + const contract_drawer_card_ref = React.useRef(); + const [should_show_contract_audit, setShouldShowContractAudit] = React.useState(false); + + const getBodyContent = () => { + const exit_spot = + isUserSold(contract_info) && !is_multiplier && !is_accumulator ? '-' : exit_tick_display_value; + + const contract_audit = ( + + ); + + return ( + + setShouldShowContractAudit(true)} + onSwipedDown={() => setShouldShowContractAudit(false)} + server_time={server_time} + status={status} + toggleContractAuditDrawer={() => setShouldShowContractAudit(!should_show_contract_audit)} + /> + {contract_audit} + + ); + }; + + if (!contract_info) return null; + + // For non-binary contract, the status is always null, so we check for is_expired in contract_info + const fallback_result = contract_info.status || contract_info.is_expired; - const getBodyContent = () => { const exit_spot = isUserSold(contract_info) && !is_multiplier && !is_accumulator ? '-' : exit_tick_display_value; @@ -62,142 +116,74 @@ const ContractDrawer = ({ /> ); - return ( - - setShouldShowContractAudit(true)} - onSwipedDown={() => setShouldShowContractAudit(false)} - server_time={server_time} - status={status} - toggleContractAuditDrawer={() => setShouldShowContractAudit(!should_show_contract_audit)} - /> - {contract_audit} - - ); - }; - - if (!contract_info) return null; - - // For non-binary contract, the status is always null, so we check for is_expired in contract_info - const fallback_result = contract_info.status || contract_info.is_expired; - - const exit_spot = isUserSold(contract_info) && !is_multiplier && !is_accumulator ? '-' : exit_tick_display_value; - - const contract_audit = ( - - ); - - const body_content = fallback_result ? ( - getBodyContent() - ) : ( -
- -
- ); - - const contract_drawer = ( - -
-
- {body_content} -
- {should_show_contract_audit && ( - -
- - {contract_audit} - -
-
- )} + const body_content = fallback_result ? ( + getBodyContent() + ) : ( +
+
- - ); + ); - return ( - - {contract_drawer} - + const contract_drawer = ( +
- - {contract_drawer} - +
+ {body_content} +
+ {should_show_contract_audit && ( + +
+ + {contract_audit} + +
+
+ )}
-
-
- ); -}; + + ); + + return ( + + {contract_drawer} + +
+ + {contract_drawer} + +
+
+
+ ); + } +); ContractDrawer.propTypes = { - contract_info: PropTypes.object, - contract_update: PropTypes.object, - contract_update_history: PropTypes.array, is_accumulator: PropTypes.bool, - is_chart_loading: PropTypes.bool, - is_dark_theme: PropTypes.bool, - is_market_closed: PropTypes.bool, - is_mobile: PropTypes.bool, is_multiplier: PropTypes.bool, is_vanilla: PropTypes.bool, - is_history_tab_active: PropTypes.bool, - is_sell_requested: PropTypes.bool, - onClickCancel: PropTypes.func, - onClickContractUpdate: PropTypes.func, - onClickSell: PropTypes.func, - server_time: PropTypes.object, - status: PropTypes.string, toggleHistoryTab: PropTypes.func, }; -export default withRouter( - connect(({ common, ui }) => ({ - server_time: common.server_time, - is_mobile: ui.is_mobile, - }))(ContractDrawer) -); +export default withRouter(ContractDrawer); diff --git a/packages/trader/src/App/Components/Elements/Modals/MarketUnavailableModal/market-unavailable.jsx b/packages/trader/src/App/Components/Elements/Modals/MarketUnavailableModal/market-unavailable.jsx index 393581f4c099..7fbe8ba71f49 100644 --- a/packages/trader/src/App/Components/Elements/Modals/MarketUnavailableModal/market-unavailable.jsx +++ b/packages/trader/src/App/Components/Elements/Modals/MarketUnavailableModal/market-unavailable.jsx @@ -3,47 +3,44 @@ import React from 'react'; import { Dialog } from '@deriv/components'; import { getPlatformSettings } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; -const MarketUnavailableModal = ({ disableApp, enableApp, is_loading, is_visible, onCancel, onConfirm }) => ( - - { + const { ui } = useStore(); + const { disableApp, enableApp, is_loading, has_only_forward_starting_contracts: is_visible } = ui; + + return ( + - -); + })} + onConfirm={onConfirm} + onCancel={onCancel} + is_mobile_full_width={false} + is_visible={is_visible} + disableApp={disableApp} + enableApp={enableApp} + is_loading={is_loading} + > + + + ); +}); MarketUnavailableModal.propTypes = { - disableApp: PropTypes.func, - enableApp: PropTypes.func, - is_loading: PropTypes.bool, - is_visible: PropTypes.bool, onCancel: PropTypes.func, onConfirm: PropTypes.func, }; -export default connect(({ ui }) => ({ - disableApp: ui.disableApp, - enableApp: ui.enableApp, - is_loading: ui.is_loading, -}))(MarketUnavailableModal); +export default MarketUnavailableModal; diff --git a/packages/trader/src/App/Components/Elements/Modals/UnsupportedContractModal/unsupported-contract-modal.jsx b/packages/trader/src/App/Components/Elements/Modals/UnsupportedContractModal/unsupported-contract-modal.jsx index 4958fdce118c..3cd1b28434ff 100644 --- a/packages/trader/src/App/Components/Elements/Modals/UnsupportedContractModal/unsupported-contract-modal.jsx +++ b/packages/trader/src/App/Components/Elements/Modals/UnsupportedContractModal/unsupported-contract-modal.jsx @@ -2,37 +2,34 @@ import PropTypes from 'prop-types'; import React from 'react'; import { Dialog } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import { website_name } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; -const UnsupportedContractModal = ({ disableApp, enableApp, is_loading, is_visible, onConfirm, onClose }) => ( - - - -); +const UnsupportedContractModal = observer(({ onConfirm, onClose }) => { + const { ui } = useStore(); + const { disableApp, enableApp, is_loading, is_unsupported_contract_modal_visible: is_visible } = ui; + + return ( + + + + ); +}); UnsupportedContractModal.propTypes = { - disableApp: PropTypes.func, - enableApp: PropTypes.func, - is_loading: PropTypes.bool, - is_visible: PropTypes.bool, onClose: PropTypes.func, onConfirm: PropTypes.func, }; -export default connect(({ ui }) => ({ - disableApp: ui.disableApp, - enableApp: ui.enableApp, - is_loading: ui.is_loading, -}))(UnsupportedContractModal); +export default UnsupportedContractModal; diff --git a/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-drawer.jsx b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-drawer.jsx index 355de07f1470..669b36df7498 100644 --- a/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-drawer.jsx +++ b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-drawer.jsx @@ -1,5 +1,4 @@ import classNames from 'classnames'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; import PropTypes from 'prop-types'; import React from 'react'; import { NavLink } from 'react-router-dom'; @@ -8,8 +7,9 @@ import { Icon, DataList, Text, PositionsDrawerCard } from '@deriv/components'; import { routes, useNewRowTransition } from '@deriv/shared'; import { localize } from '@deriv/translations'; import EmptyPortfolioMessage from '../EmptyPortfolioMessage'; -import { connect } from 'Stores/connect'; import { filterByContractType } from './helpers'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; const PositionsDrawerCardItem = ({ row: portfolio_position, @@ -56,17 +56,33 @@ const PositionsDrawerCardItem = ({ ); }; -const PositionsDrawer = ({ - all_positions, - error, - is_positions_drawer_on, - onHoverPosition, - symbol, - toggleDrawer, - trade_contract_type, - onMount, - ...props -}) => { +const PositionsDrawer = observer(({ ...props }) => { + const { symbol, contract_type: trade_contract_type } = useTraderStore(); + const { client, common, contract_trade, portfolio, ui } = useStore(); + const { currency } = client; + const { server_time } = common; + const { getContractById } = contract_trade; + const { + all_positions, + error, + onHoverPosition, + onMount, + onClickCancel, + onClickSell, + removePositionById: onClickRemove, + } = portfolio; + const { + is_mobile, + is_positions_drawer_on, + togglePositionsDrawer: toggleDrawer, + addToast, + current_focus, + removeToast, + setCurrentFocus, + should_show_cancellation_warning, + toggleCancellationWarning, + toggleUnsupportedContractModal, + } = ui; const drawer_ref = React.useRef(null); const list_ref = React.useRef(null); const scrollbar_ref = React.useRef(null); @@ -91,7 +107,26 @@ const PositionsDrawer = ({ ( - + )} keyMapper={row => row.id} row_gap={8} @@ -140,57 +175,12 @@ const PositionsDrawer = ({
); -}; +}); PositionsDrawer.propTypes = { - all_positions: MobxPropTypes.arrayOrObservableArray, children: PropTypes.node, - error: PropTypes.string, - is_mobile: PropTypes.bool, - is_positions_drawer_on: PropTypes.bool, onChangeContractUpdate: PropTypes.func, onClickContractUpdate: PropTypes.func, - onHoverPosition: PropTypes.func, - onMount: PropTypes.func, - symbol: PropTypes.string, - toggleDrawer: PropTypes.func, - currency: PropTypes.string, - server_time: PropTypes.object, - addToast: PropTypes.func, - current_focus: PropTypes.string, - onClickCancel: PropTypes.func, - onClickSell: PropTypes.func, - onClickRemove: PropTypes.func, - getContractById: PropTypes.func, - removeToast: PropTypes.func, - setCurrentFocus: PropTypes.func, - should_show_cancellation_warning: PropTypes.bool, - toggleCancellationWarning: PropTypes.func, - toggleUnsupportedContractModal: PropTypes.func, - trade_contract_type: PropTypes.string, }; -export default connect(({ modules, ui, client, common, portfolio, contract_trade }) => ({ - all_positions: portfolio.all_positions, - error: portfolio.error, - onHoverPosition: portfolio.onHoverPosition, - onMount: portfolio.onMount, - symbol: modules.trade.symbol, - trade_contract_type: modules.trade.contract_type, - is_mobile: ui.is_mobile, - is_positions_drawer_on: ui.is_positions_drawer_on, - toggleDrawer: ui.togglePositionsDrawer, - currency: client.currency, - server_time: common.server_time, - addToast: ui.addToast, - current_focus: ui.current_focus, - onClickCancel: portfolio.onClickCancel, - onClickSell: portfolio.onClickSell, - onClickRemove: portfolio.removePositionById, - getContractById: contract_trade.getContractById, - removeToast: ui.removeToast, - setCurrentFocus: ui.setCurrentFocus, - should_show_cancellation_warning: ui.should_show_cancellation_warning, - toggleCancellationWarning: ui.toggleCancellationWarning, - toggleUnsupportedContractModal: ui.toggleUnsupportedContractModal, -}))(PositionsDrawer); +export default PositionsDrawer; diff --git a/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-modal-card.jsx b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-modal-card.jsx index a1a935447ba9..29e1edb72785 100644 --- a/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-modal-card.jsx +++ b/packages/trader/src/App/Components/Elements/PositionsDrawer/positions-modal-card.jsx @@ -20,423 +20,425 @@ import { } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { BinaryLink } from 'App/Components/Routes'; -import { connect } from 'Stores/connect'; -import { connectWithContractUpdate } from 'Stores/Modules/Trading/Helpers/multiplier'; import { PositionsCardLoader } from 'App/Components/Elements/ContentLoader'; import { getContractTypeDisplay, getCardLabels } from 'Constants/contract'; import { getMarketInformation } from 'Utils/Helpers/market-underlying'; import ResultMobile from './result-mobile.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const PositionsModalCard = ({ - active_symbols, - addToast, - className, - contract_info, - contract_update, - currency, - current_focus, - current_tick, - getContractById, - id, - indicative, - is_loading, - is_mobile, - is_sell_requested, - is_unsupported, - onClickSell, - profit_loss, - onClickCancel, - removeToast, - result, - sell_price, - server_time, - setCurrentFocus, - should_show_cancellation_warning, - status, - toggleCancellationWarning, - togglePositions, - toggleUnsupportedContractModal, - type, -}) => { - const loader_el = ( -
- -
- ); - const is_multiplier = isMultiplierContract(contract_info.contract_type); - const is_accumulator = isAccumulatorContract(contract_info.contract_type); - const is_vanilla = isVanillaContract(contract_info.contract_type); - const is_crypto = isCryptoContract(contract_info.underlying); - const has_progress_slider = !is_multiplier || (is_crypto && is_multiplier); - const has_ended = !!getEndTime(contract_info); - const fallback_result = profit_loss >= 0 ? 'won' : 'lost'; - const total_profit = getTotalProfit(contract_info); +const PositionsModalCard = observer( + ({ + className, + contract_info, + contract_update, + currency, + current_tick, + id, + indicative, + is_loading, + is_sell_requested, + is_unsupported, + onClickSell, + profit_loss, + onClickCancel, + result, + sell_price, + status, + togglePositions, + toggleUnsupportedContractModal, + type, + }) => { + const { ui, common, contract_trade } = useStore(); + const { active_symbols } = useTraderStore(); + const { server_time } = common; + const { getContractById } = contract_trade; + const { + addToast, + current_focus, + is_mobile, + removeToast, + setCurrentFocus, + should_show_cancellation_warning, + toggleCancellationWarning, + } = ui; + const loader_el = ( +
+ +
+ ); + const is_multiplier = isMultiplierContract(contract_info.contract_type); + const is_accumulator = isAccumulatorContract(contract_info.contract_type); + const is_vanilla = isVanillaContract(contract_info.contract_type); + const is_crypto = isCryptoContract(contract_info.underlying); + const has_progress_slider = !is_multiplier || (is_crypto && is_multiplier); + const has_ended = !!getEndTime(contract_info); + const fallback_result = profit_loss >= 0 ? 'won' : 'lost'; + const total_profit = getTotalProfit(contract_info); - const should_show_sell = hasContractEntered(contract_info) && isOpen(contract_info); - const display_name = getSymbolDisplayName(active_symbols, getMarketInformation(contract_info.shortcode).underlying); + const should_show_sell = hasContractEntered(contract_info) && isOpen(contract_info); + const display_name = getSymbolDisplayName( + active_symbols, + getMarketInformation(contract_info.shortcode).underlying + ); - const contract_options_el = ( - -
-
- - - {contract_info.display_name} - -
-
- -
- -
- +
+
+ + + {contract_info.display_name} +
- -
- -
-
-
- {result ? localize('Profit/Loss:') : localize('Potential profit/loss:')} +
+
-
- {!result ? localize('Indicative price:') : localize('Payout:')} -
-
0, - })} - > - +
+ +
+ +
+ +
+
- {status === 'profit' && } - {status === 'loss' && } + {result ? localize('Profit/Loss:') : localize('Potential profit/loss:')}
-
-
-
+ {!result ? localize('Indicative price:') : localize('Payout:')} +
+
0, })} > - {status === 'profit' && } - {status === 'loss' && } + +
+ {status === 'profit' && } + {status === 'loss' && } +
+
+
+ +
+ {status === 'profit' && } + {status === 'loss' && } +
-
-
-
- - {localize('Purchase price:')} - - - - -
-
- - {localize('Potential payout:')} - - - {contract_info.payout ? ( - - ) : ( - -i - )} - +
+
+ + {localize('Purchase price:')} + + + + +
+
+ + {localize('Potential payout:')} + + + {contract_info.payout ? ( + + ) : ( + -i + )} + +
+ + {result || !!contract_info.is_sold ? ( + + ) : ( + + )}
+ + ); - {result || !!contract_info.is_sold ? ( - - ) : ( - + 0 && !result, + 'dc-contract-card--red': !is_multiplier && profit_loss < 0 && !result, + })} + to={{ + pathname: `/contract/${contract_info.contract_id}`, + }} + > + - )} -
- - ); - - const contract_vanilla_el = ( - - 0 && !result, - 'dc-contract-card--red': !is_multiplier && profit_loss < 0 && !result, - })} - to={{ - pathname: `/contract/${contract_info.contract_id}`, - }} - > - - - -
-
-
- - {localize('Buy price:')} - - - - -
-
- - {localize('Contract value:')} - - - - + + +
+
+
+ + {localize('Buy price:')} + + + + +
+
+ + {localize('Contract value:')} + + + + +
-
-
-
- - {localize('Entry spot:')} - - - - -
-
- - {localize('Strike:')} - - - - +
+
+ + {localize('Entry spot:')} + + + + +
+
+ + {localize('Strike:')} + + + + +
-
- {result || !!contract_info.is_sold ? ( - - ) : ( - - )} -
-
-
{getCardLabels().TOTAL_PROFIT_LOSS}
-
0, - })} - > - + {result || !!contract_info.is_sold ? ( + + ) : ( + + )} +
+
+
{getCardLabels().TOTAL_PROFIT_LOSS}
0, })} > - {status === 'profit' && } - {status === 'loss' && } + +
+ {status === 'profit' && } + {status === 'loss' && } +
-
- + + ); + + const custom_card_header = ( + - - ); - - const custom_card_header = ( - - ); + ); - const custom_card_body = ( - - ); - - const custom_card_footer = ( - - ); - - const custom_contract_el = ( - - - {custom_card_header} - {custom_card_body} - {custom_card_footer} - - - ); + is_positions + is_sold={!!contract_info.is_sold} + has_progress_slider={is_mobile && has_progress_slider && !has_ended} + removeToast={removeToast} + server_time={server_time} + setCurrentFocus={setCurrentFocus} + should_show_cancellation_warning={should_show_cancellation_warning} + status={status} + toggleCancellationWarning={toggleCancellationWarning} + /> + ); - const options_el = is_vanilla ? contract_vanilla_el : contract_options_el; - const contract_el = is_multiplier || is_accumulator ? custom_contract_el : options_el; + const custom_card_footer = ( + + ); - return ( -
- {is_unsupported ? ( -
toggleUnsupportedContractModal(true)} + const custom_contract_el = ( + + - {contract_info.underlying ? contract_el : loader_el} -
- ) : ( - - + + ); + + const options_el = is_vanilla ? contract_vanilla_el : contract_options_el; + const contract_el = is_multiplier || is_accumulator ? custom_contract_el : options_el; + + return ( +
+ {is_unsupported ? ( +
toggleUnsupportedContractModal(true)} > {contract_info.underlying ? contract_el : loader_el} - - - )} -
- ); -}; +
+ ) : ( + + + {contract_info.underlying ? contract_el : loader_el} + + + )} +
+ ); + } +); PositionsModalCard.propTypes = { - active_symbols: PropTypes.array, - addToast: PropTypes.func, className: PropTypes.string, contract_info: PropTypes.object, contract_update: PropTypes.object, currency: PropTypes.string, - current_focus: PropTypes.string, current_tick: PropTypes.number, duration: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), duration_unit: PropTypes.string, exit_spot: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - getContractById: PropTypes.func, id: PropTypes.number, indicative: PropTypes.number, is_loading: PropTypes.bool, - is_mobile: PropTypes.bool, is_sell_requested: PropTypes.bool, is_unsupported: PropTypes.bool, is_valid_to_sell: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]), @@ -444,30 +446,13 @@ PositionsModalCard.propTypes = { onClickSell: PropTypes.func, onClickCancel: PropTypes.func, profit_loss: PropTypes.number, - removeToast: PropTypes.func, result: PropTypes.string, sell_price: PropTypes.number, sell_time: PropTypes.number, - server_time: PropTypes.object, - setCurrentFocus: PropTypes.func, - should_show_cancellation_warning: PropTypes.bool, status: PropTypes.string, - toggleCancellationWarning: PropTypes.func, togglePositions: PropTypes.func, toggleUnsupportedContractModal: PropTypes.func, type: PropTypes.string, }; -export default connect(({ common, ui, contract_trade, modules }) => ({ - active_symbols: modules.trade.active_symbols, - addToast: ui.addToast, - current_focus: ui.current_focus, - getContractById: contract_trade.getContractById, - is_mobile: ui.is_mobile, - removeToast: ui.removeToast, - server_time: common.server_time, - setCurrentFocus: ui.setCurrentFocus, - should_show_cancellation_warning: ui.should_show_cancellation_warning, - toggleCancellationWarning: ui.toggleCancellationWarning, - updateLimitOrder: contract_trade.updateLimitOrder, -}))(PositionsModalCard); +export default PositionsModalCard; diff --git a/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx b/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx index 8e462cf5fe35..ceaa48693b70 100644 --- a/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx +++ b/packages/trader/src/App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx @@ -7,131 +7,126 @@ import { NavLink } from 'react-router-dom'; import EmptyPortfolioMessage from '../EmptyPortfolioMessage'; import PositionsModalCard from 'App/Components/Elements/PositionsDrawer/positions-modal-card.jsx'; import { filterByContractType } from 'App/Components/Elements/PositionsDrawer/helpers'; -import { connect } from 'Stores/connect'; import TogglePositions from './toggle-positions.jsx'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; -const TogglePositionsMobile = ({ - active_positions_count, - all_positions, - currency, - disableApp, - enableApp, - error, - is_empty, - is_positions_drawer_on, - onClickSell, - onClickRemove, - onClickCancel, - symbol, - togglePositionsDrawer, - toggleUnsupportedContractModal, - trade_contract_type, -}) => { - let filtered_positions = []; +const TogglePositionsMobile = observer( + ({ + active_positions_count, + all_positions, + currency, + disableApp, + enableApp, + error, + is_empty, + onClickSell, + onClickCancel, + toggleUnsupportedContractModal, + }) => { + const { portfolio, ui } = useStore(); + const { symbol, contract_type: trade_contract_type } = useTraderStore(); + const { removePositionById: onClickRemove } = portfolio; + const { togglePositionsDrawer, is_positions_drawer_on } = ui; + let filtered_positions = []; - const closeModal = () => { - filtered_positions.slice(0, 5).map(position => { - const { contract_info } = position; - if (contract_info?.is_sold) { - onClickRemove(contract_info.contract_id); - } - }); - togglePositionsDrawer(); - }; + const closeModal = () => { + filtered_positions.slice(0, 5).map(position => { + const { contract_info } = position; + if (contract_info?.is_sold) { + onClickRemove(contract_info.contract_id); + } + }); + togglePositionsDrawer(); + }; - filtered_positions = all_positions.filter( - p => - p.contract_info && - symbol === p.contract_info.underlying && - filterByContractType(p.contract_info, trade_contract_type) - ); + filtered_positions = all_positions.filter( + p => + p.contract_info && + symbol === p.contract_info.underlying && + filterByContractType(p.contract_info, trade_contract_type) + ); - // Show only 5 most recent open contracts - const body_content = ( - - - {filtered_positions.slice(0, 5).map(portfolio_position => ( - - + + {filtered_positions.slice(0, 5).map(portfolio_position => ( + - - ))} - - - ); - - return ( - - - - -
- - - {localize('Recent positions')} - -
- -
-
-
- {is_empty || error ? : body_content} -
-
- - - {localize('Go to Reports')} + + + ))} + + + ); + + return ( + + + + +
+ + + {localize('Recent positions')} - -
-
-
-
- ); -}; -// TODO: Needs to be connected to store due to issue with trade-header-extensions not updating all_positions prop -// Fixes issue with positions not updated in positions modal -export default connect(({ modules, ui, portfolio }) => ({ - symbol: modules.trade.symbol, - trade_contract_type: modules.trade.contract_type, - onClickRemove: portfolio.removePositionById, - togglePositionsDrawer: ui.togglePositionsDrawer, - is_positions_drawer_on: ui.is_positions_drawer_on, -}))(TogglePositionsMobile); +
+ +
+
+
+ {is_empty || error ? : body_content} +
+
+ + + {localize('Go to Reports')} + + +
+
+
+
+ ); + } +); + +export default TogglePositionsMobile; diff --git a/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx b/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx index 21fe0b757be3..833af29df84f 100644 --- a/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx +++ b/packages/trader/src/App/Components/Elements/market-countdown-timer.jsx @@ -5,7 +5,8 @@ import moment from 'moment'; import { Text } from '@deriv/components'; import { useIsMounted, WS, convertTimeFormat, isMarketClosed } from '@deriv/shared'; import { Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; // check market in coming 7 days const days_to_check_before_exit = 7; @@ -43,7 +44,8 @@ const calculateTimeLeft = remaining_time_to_open => { : {}; }; -const MarketCountdownTimer = ({ active_symbols, is_main_page, setIsTimerLoading, onMarketOpen, symbol }) => { +const MarketCountdownTimer = observer(({ is_main_page, setIsTimerLoading, onMarketOpen, symbol }) => { + const { active_symbols } = useTraderStore(); const isMounted = useIsMounted(); const [when_market_opens, setWhenMarketOpens] = React.useState({}); const [time_left, setTimeLeft] = React.useState(calculateTimeLeft(when_market_opens?.remaining_time_to_open)); @@ -195,16 +197,13 @@ const MarketCountdownTimer = ({ active_symbols, is_main_page, setIsTimerLoading,
); -}; +}); MarketCountdownTimer.propTypes = { - active_symbols: PropTypes.array, is_main_page: PropTypes.bool, setIsTimerLoading: PropTypes.func, onMarketOpen: PropTypes.func, symbol: PropTypes.string.isRequired, }; -export default connect(({ modules }) => ({ - active_symbols: modules.trade.active_symbols, -}))(MarketCountdownTimer); +export default MarketCountdownTimer; diff --git a/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx b/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx index 3a9f38707fbc..5e38be3e7836 100644 --- a/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx +++ b/packages/trader/src/App/Components/Form/TimePicker/time-picker.jsx @@ -1,115 +1,115 @@ import classNames from 'classnames'; -import { observer } from 'mobx-react'; import PropTypes from 'prop-types'; import React from 'react'; import { CSSTransition } from 'react-transition-group'; import { Icon, InputField } from '@deriv/components'; -import { connect } from 'Stores/connect'; import Dialog from './dialog.jsx'; +import { observer, useStore } from '@deriv/stores'; const class_prefix = 'time-picker'; -const TimePicker = ({ - current_focus, - end_times, - is_nativepicker, - name, - onChange, - padding, - placeholder, - selected_time, - setCurrentFocus, - start_times, - validation_errors, -}) => { - const [is_open, setIsOpen] = React.useState(false); - const [wrapper_ref, setWrapperRef] = React.useState(null); +const TimePicker = observer( + ({ + end_times, + is_nativepicker, + name, + onChange, + padding, + placeholder, + selected_time, + start_times, + validation_errors, + }) => { + const { ui } = useStore(); + const { current_focus, setCurrentFocus } = ui; + const [is_open, setIsOpen] = React.useState(false); + const [wrapper_ref, setWrapperRef] = React.useState(null); - React.useEffect(() => { - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }); + React.useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }); - const toggleDropDown = () => { - setIsOpen(!is_open); - }; + const toggleDropDown = () => { + setIsOpen(!is_open); + }; - const handleChange = arg => { - // To handle nativepicker; - const value = typeof arg === 'object' ? arg.target.selected_time : arg; + const handleChange = arg => { + // To handle nativepicker; + const value = typeof arg === 'object' ? arg.target.selected_time : arg; - if (value !== selected_time) { - onChange({ target: { name, value } }); - } - }; + if (value !== selected_time) { + onChange({ target: { name, value } }); + } + }; - const saveRef = node => { - if (!node) return; - setWrapperRef(node); - }; + const saveRef = node => { + if (!node) return; + setWrapperRef(node); + }; - const handleClickOutside = event => { - if (!wrapper_ref?.contains(event.target) && is_open) { - setIsOpen(false); - } - }; + const handleClickOutside = event => { + if (!wrapper_ref?.contains(event.target) && is_open) { + setIsOpen(false); + } + }; - return ( -
- {is_nativepicker ? ( - - ) : ( - - + {is_nativepicker ? ( + - - - + - - - )} -
- ); -}; + + + + + + )} +
+ ); + } +); TimePicker.propTypes = { - current_focus: PropTypes.string, end_times: PropTypes.array, is_clearable: PropTypes.bool, is_nativepicker: PropTypes.bool, @@ -118,14 +118,8 @@ TimePicker.propTypes = { padding: PropTypes.string, placeholder: PropTypes.string, selected_time: PropTypes.string, - setCurrentFocus: PropTypes.func, start_times: PropTypes.array, validation_errors: PropTypes.array, }; -export default observer( - connect(({ ui }) => ({ - current_focus: ui.current_focus, - setCurrentFocus: ui.setCurrentFocus, - }))(TimePicker) -); +export default TimePicker; diff --git a/packages/trader/src/App/Containers/Modals/trade-modals.jsx b/packages/trader/src/App/Containers/Modals/trade-modals.jsx index 494e95485b37..fee15a59ea4b 100644 --- a/packages/trader/src/App/Containers/Modals/trade-modals.jsx +++ b/packages/trader/src/App/Containers/Modals/trade-modals.jsx @@ -1,25 +1,22 @@ import React from 'react'; import { getUrlSmartTrader, urlFor } from '@deriv/shared'; - -import { connect } from 'Stores/connect'; import UnsupportedContractModal from 'App/Components/Elements/Modals/UnsupportedContractModal'; import MarketUnavailableModal from 'App/Components/Elements/Modals/MarketUnavailableModal'; import ServicesErrorModal from 'App/Components/Elements/Modals/ServicesErrorModal'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const TradeModals = ({ - clearPurchaseInfo, - is_unsupported_contract_modal_visible, - is_market_unavailable_visible, - is_services_error_visible, - is_virtual, - is_logged_in, - toggleUnsupportedContractModal, - setHasOnlyForwardingContracts, - resetPreviousSymbol, - toggleServicesErrorModal, - resetPurchase, - services_error, -}) => { +const TradeModals = observer(() => { + const { ui, client, common } = useStore(); + const { resetPreviousSymbol, clearPurchaseInfo, requestProposal: resetPurchase } = useTraderStore(); + const { is_virtual, is_logged_in } = client; + const { services_error } = common; + const { + is_services_error_visible, + setHasOnlyForwardingContracts, + toggleServicesErrorModal, + toggleUnsupportedContractModal, + } = ui; const resetToPreviousMarket = () => { setHasOnlyForwardingContracts(false); resetPreviousSymbol(); @@ -54,17 +51,9 @@ const TradeModals = ({ return ( - + - + ); -}; +}); -export default connect(({ ui, modules, common, client }) => ({ - is_market_unavailable_visible: ui.has_only_forward_starting_contracts, - is_services_error_visible: ui.is_services_error_visible, - is_unsupported_contract_modal_visible: ui.is_unsupported_contract_modal_visible, - is_virtual: client.is_virtual, - is_logged_in: client.is_logged_in, - proposal_info: modules.trade.proposal_info, - purchase_info: modules.trade.purchase_info, - resetPreviousSymbol: modules.trade.resetPreviousSymbol, - clearPurchaseInfo: modules.trade.clearPurchaseInfo, - resetPurchase: modules.trade.requestProposal, - services_error: common.services_error, - setHasOnlyForwardingContracts: ui.setHasOnlyForwardingContracts, - toggleServicesErrorModal: ui.toggleServicesErrorModal, - toggleUnsupportedContractModal: ui.toggleUnsupportedContractModal, -}))(TradeModals); +export default TradeModals; diff --git a/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx b/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx index ad46df3b3359..487cbc036604 100644 --- a/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx +++ b/packages/trader/src/App/Containers/ProgressSliderStream/progress-slider-stream.jsx @@ -2,10 +2,14 @@ import PropTypes from 'prop-types'; import React from 'react'; import { ProgressSlider } from '@deriv/components'; import { getCurrentTick } from '@deriv/shared'; -import { connect } from 'Stores/connect'; import { getCardLabels } from 'Constants/contract'; +import { observer, useStore } from '@deriv/stores'; + +const ProgressSliderStream = observer(({ contract_info }) => { + const { common, portfolio } = useStore(); + const { server_time } = common; + const { is_loading } = portfolio; -const ProgressSliderStream = ({ contract_info, is_loading, server_time }) => { if (!contract_info) { return
; } @@ -22,15 +26,10 @@ const ProgressSliderStream = ({ contract_info, is_loading, server_time }) => { ticks_count={contract_info.tick_count} /> ); -}; +}); ProgressSliderStream.propTypes = { contract_info: PropTypes.object, - is_loading: PropTypes.bool, - server_time: PropTypes.object, }; -export default connect(({ common, portfolio }) => ({ - is_loading: portfolio.is_loading, - server_time: common.server_time, -}))(ProgressSliderStream); +export default ProgressSliderStream; diff --git a/packages/trader/src/App/Containers/Routes/routes.jsx b/packages/trader/src/App/Containers/Routes/routes.jsx index b6059af441a5..5a37e794281a 100644 --- a/packages/trader/src/App/Containers/Routes/routes.jsx +++ b/packages/trader/src/App/Containers/Routes/routes.jsx @@ -1,4 +1,3 @@ -import { PropTypes as MobxPropTypes } from 'mobx-react'; import PropTypes from 'prop-types'; import React from 'react'; import { withRouter, matchPath } from 'react-router'; @@ -7,7 +6,8 @@ import { UILoader } from '@deriv/components'; import { routes } from '@deriv/shared'; import BinaryRoutes from 'App/Components/Routes'; import getRoutesConfig from 'App/Constants/routes-config'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; const checkRoutingMatch = (route_list, path) => { return route_list.some(route => !!matchPath(path, { path: route, exact: true })); @@ -36,17 +36,14 @@ const Error = Loadable({ }, }); -const Routes = ({ - onUnmountPortfolio, - error, - has_error, - history, - is_logged_in, - is_logging_in, - passthrough, - setPromptHandler, - setTradeMountingPolicy, -}) => { +const Routes = observer(({ history, passthrough }) => { + const { client, common, ui, portfolio } = useStore(); + const { setSkipPrePostLifecycle: setTradeMountingPolicy } = useTraderStore(); + const { error, has_error } = common; + const { onUnmount: onUnmountPortfolio } = portfolio; + const { is_logged_in, is_logging_in } = client; + const { setPromptHandler } = ui; + React.useEffect(() => { if (setPromptHandler) { setPromptHandler(true, (route_to, action) => { @@ -101,30 +98,11 @@ const Routes = ({ if (has_error) return ; return ; -}; +}); Routes.propTypes = { - error: MobxPropTypes.objectOrObservableObject, - has_error: PropTypes.bool, history: PropTypes.object, - is_logged_in: PropTypes.bool, - is_logging_in: PropTypes.bool, - onUnmountPortfolio: PropTypes.func, passthrough: PropTypes.object, - setPromptHandler: PropTypes.func, - setTradeMountingPolicy: PropTypes.func, }; -// need to wrap withRouter around connect -// to prevent updates on from being blocked -export default withRouter( - connect(({ client, common, modules, ui, portfolio }) => ({ - onUnmountPortfolio: portfolio.onUnmount, - error: common.error, - has_error: common.has_error, - is_logged_in: client.is_logged_in, - is_logging_in: client.is_logging_in, - setPromptHandler: ui.setPromptHandler, - setTradeMountingPolicy: modules.trade.setSkipPrePostLifecycle, - }))(Routes) -); +export default withRouter(Routes); diff --git a/packages/trader/src/App/Containers/SettingsModal/settings-chart.jsx b/packages/trader/src/App/Containers/SettingsModal/settings-chart.jsx index e96833dfee71..255fb5e7205d 100644 --- a/packages/trader/src/App/Containers/SettingsModal/settings-chart.jsx +++ b/packages/trader/src/App/Containers/SettingsModal/settings-chart.jsx @@ -1,9 +1,8 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Checkbox } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import MediaItem, { MediaHeading, MediaIcon, MediaDescription } from 'App/Components/Elements/Media'; +import { observer, useStore } from '@deriv/stores'; // TODO: enable asset information // import OHLCDisabledLightIcon from 'Assets/SvgComponents/settings/OHLC-disabled.svg'; @@ -16,42 +15,41 @@ import IntervalDurationEnabledDarkIcon from 'Assets/SvgComponents/settings/dark/ import IntervalDurationDisabledLightIcon from 'Assets/SvgComponents/settings/interval-disabled.svg'; import IntervalDurationEnabledLightIcon from 'Assets/SvgComponents/settings/interval-enabled.svg'; -const ChartSettings = ({ is_countdown_visible, is_dark_mode, setCountdown }) => ( -
- - - - - - -
- { - setCountdown(e.target.checked); - }} - /> -
-
-
-
-); +const ChartSettings = observer(() => { + const { ui } = useStore(); + const { + is_chart_countdown_visible: is_countdown_visible, + is_dark_mode_on: is_dark_mode, + setChartCountdown: setCountdown, + } = ui; -ChartSettings.propTypes = { - is_countdown_visible: PropTypes.bool, - is_dark_mode: PropTypes.bool, - setCountdown: PropTypes.func, -}; + return ( +
+ + + + + + +
+ { + setCountdown(e.target.checked); + }} + /> +
+
+
+
+ ); +}); -export default connect(({ ui }) => ({ - is_countdown_visible: ui.is_chart_countdown_visible, - is_dark_mode: ui.is_dark_mode_on, - setCountdown: ui.setChartCountdown, -}))(ChartSettings); +export default ChartSettings; diff --git a/packages/trader/src/App/Containers/populate-header.jsx b/packages/trader/src/App/Containers/populate-header.jsx index 365522a17575..1690f023037a 100644 --- a/packages/trader/src/App/Containers/populate-header.jsx +++ b/packages/trader/src/App/Containers/populate-header.jsx @@ -1,23 +1,23 @@ import React from 'react'; import TogglePositionsMobile from 'App/Components/Elements/TogglePositions/toggle-positions-mobile.jsx'; import { filterByContractType } from 'App/Components/Elements/PositionsDrawer/helpers'; -import { connect } from 'Stores/connect'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; -import PropTypes from 'prop-types'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; + +const PopulateHeader = observer(() => { + const { portfolio, ui, client } = useStore(); + const { symbol, contract_type: trade_contract_type } = useTraderStore(); + const { currency: positions_currency } = client; + const { disableApp, enableApp } = ui; + const { + active_positions_count, + all_positions: positions, + error: positions_error, + onClickSell: onPositionsSell, + removePositionById: onPositionsRemove, + onClickCancel: onPositionsCancel, + } = portfolio; -const PopulateHeader = ({ - active_positions_count, - positions, - positions_currency, - disableApp, - enableApp, - positions_error, - onPositionsSell, - onPositionsRemove, - onPositionsCancel, - symbol, - trade_contract_type, -}) => { const symbol_positions = positions.filter( p => p.contract_info && @@ -39,32 +39,6 @@ const PopulateHeader = ({ onClickCancel={onPositionsCancel} /> ); -}; - -PopulateHeader.propTypes = { - active_positions_count: PropTypes.number, - positions: MobxPropTypes.arrayOrObservableArray, - positions_currency: PropTypes.string, - disableApp: PropTypes.func, - enableApp: PropTypes.func, - positions_error: PropTypes.string, - onPositionsSell: PropTypes.func, - onPositionsRemove: PropTypes.func, - onPositionsCancel: PropTypes.func, - symbol: PropTypes.string, - trade_contract_type: PropTypes.string, -}; +}); -export default connect(({ client, modules, ui, portfolio }) => ({ - active_positions_count: portfolio.active_positions_count, - positions: portfolio.all_positions, - positions_currency: client.currency, - disableApp: ui.disableApp, - enableApp: ui.enableApp, - positions_error: portfolio.error, - onPositionsSell: portfolio.onClickSell, - onPositionsRemove: portfolio.removePositionById, - onPositionsCancel: portfolio.onClickCancel, - symbol: modules.trade.symbol, - trade_contract_type: modules.trade.contract_type, -}))(PopulateHeader); +export default PopulateHeader; diff --git a/packages/trader/src/App/Containers/trade-footer-extensions.jsx b/packages/trader/src/App/Containers/trade-footer-extensions.jsx index cf3ace658170..702950f5ebca 100644 --- a/packages/trader/src/App/Containers/trade-footer-extensions.jsx +++ b/packages/trader/src/App/Containers/trade-footer-extensions.jsx @@ -3,16 +3,13 @@ import React from 'react'; import { withRouter } from 'react-router-dom'; import { routes } from '@deriv/shared'; import TogglePositions from 'App/Components/Elements/TogglePositions'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; -const TradeFooterExtensions = ({ - active_positions_count, - is_logged_in, - is_positions_drawer_on, - location, - populateFooterExtensions, - togglePositionsDrawer, -}) => { +const TradeFooterExtensions = observer(() => { + const { client, portfolio, ui } = useStore(); + const { is_logged_in } = client; + const { active_positions_count } = portfolio; + const { is_positions_drawer_on, populateFooterExtensions, togglePositionsDrawer } = ui; React.useEffect(() => populateFooter()); // eslint-disable-next-line react-hooks/exhaustive-deps React.useEffect(() => () => populateFooterExtensions([]), []); @@ -41,21 +38,10 @@ const TradeFooterExtensions = ({ }; return null; -}; +}); TradeFooterExtensions.propTypes = { - active_positions_count: PropTypes.number, - is_logged_in: PropTypes.bool, - is_positions_drawer_on: PropTypes.bool, location: PropTypes.object, - populateFooterExtensions: PropTypes.func, - togglePositionsDrawer: PropTypes.func, }; -export default connect(({ client, ui, portfolio }) => ({ - active_positions_count: portfolio.active_positions_count, - is_logged_in: client.is_logged_in, - is_positions_drawer_on: ui.is_positions_drawer_on, - populateFooterExtensions: ui.populateFooterExtensions, - togglePositionsDrawer: ui.togglePositionsDrawer, -}))(withRouter(TradeFooterExtensions)); +export default withRouter(TradeFooterExtensions); diff --git a/packages/trader/src/App/Containers/trade-header-extensions.jsx b/packages/trader/src/App/Containers/trade-header-extensions.tsx similarity index 55% rename from packages/trader/src/App/Containers/trade-header-extensions.jsx rename to packages/trader/src/App/Containers/trade-header-extensions.tsx index 023c69f1bd6f..f3aeb1f025f2 100644 --- a/packages/trader/src/App/Containers/trade-header-extensions.jsx +++ b/packages/trader/src/App/Containers/trade-header-extensions.tsx @@ -1,31 +1,34 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { when } from 'mobx'; import { MobileWrapper } from '@deriv/components'; import { isMobile, routes, WS } from '@deriv/shared'; -import { connect, MobxContentProvider } from 'Stores/connect'; import PopulateHeader from './populate-header'; +import { observer, useStore } from '@deriv/stores'; +import TraderProviders from '../../trader-providers'; +import { TCoreStores } from '@deriv/stores/types'; + +type TradeHeaderExtensionsProps = { + store: TCoreStores; +}; + +const TradeHeaderExtensions = observer(({ store }: TradeHeaderExtensionsProps) => { + const { client, modules, ui, portfolio } = useStore(); + const { populateHeaderExtensions } = ui; + const { onMount: onMountPositions } = portfolio; + const { is_logged_in, is_populating_account_list } = client; + const { onMountCommon: onMountCashier, setAccountSwitchListener } = modules.cashier.general_store; -const TradeHeaderExtensions = ({ - populateHeaderExtensions, - store, - is_logged_in, - is_populating_account_list, - onMountPositions, - onMountCashier, - setAccountSwitchListener, -}) => { const show_positions_toggle = location.pathname !== routes.mt5; const show_component = is_logged_in && show_positions_toggle; const populateHeaderfunction = React.useCallback(() => { - const header_items = show_component && ( + const header_items = show_component ? ( - + - + - ); + ) : null; populateHeaderExtensions(header_items); }, [populateHeaderExtensions, store, show_positions_toggle, is_populating_account_list]); @@ -45,7 +48,9 @@ const TradeHeaderExtensions = ({ populateHeaderfunction(); }; - waitForLogin(); + waitForLogin().catch(() => { + // Do nothing: This is to remove the bug reported by SonarCloud about not having a catch statement here. + }); return () => populateHeaderExtensions(null); }, [ @@ -63,23 +68,6 @@ const TradeHeaderExtensions = ({ }); return null; -}; - -TradeHeaderExtensions.propTypes = { - populateHeaderExtensions: PropTypes.func, - store: PropTypes.object, - is_logged_in: PropTypes.bool, - is_populating_account_list: PropTypes.bool, - onMountPositions: PropTypes.func, - onMountCashier: PropTypes.func, - setAccountSwitchListener: PropTypes.func, -}; +}); -export default connect(({ client, modules, ui, portfolio }) => ({ - populateHeaderExtensions: ui.populateHeaderExtensions, - is_logged_in: client.is_logged_in, - is_populating_account_list: client.is_populating_account_list, - onMountPositions: portfolio.onMount, - onMountCashier: modules.cashier.general_store.onMountCommon, - setAccountSwitchListener: modules.cashier.general_store.setAccountSwitchListener, -}))(TradeHeaderExtensions); +export default TradeHeaderExtensions; diff --git a/packages/trader/src/App/Containers/trade-settings-extensions.jsx b/packages/trader/src/App/Containers/trade-settings-extensions.tsx similarity index 68% rename from packages/trader/src/App/Containers/trade-settings-extensions.jsx rename to packages/trader/src/App/Containers/trade-settings-extensions.tsx index 01572245934f..29fea57d1a68 100644 --- a/packages/trader/src/App/Containers/trade-settings-extensions.jsx +++ b/packages/trader/src/App/Containers/trade-settings-extensions.tsx @@ -1,9 +1,14 @@ -import PropTypes from 'prop-types'; import React from 'react'; import Loadable from 'react-loadable'; import { UILoader } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { connect, MobxContentProvider } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import TraderProviders from '../../trader-providers'; +import type { TCoreStores } from '@deriv/stores/types'; + +type TTradeSettingsExtensionsProps = { + store: TCoreStores; +}; const ChartSettingContainer = Loadable({ loader: () => @@ -19,15 +24,17 @@ const ChartSettingContainer = Loadable({ // loading: UILoader, // }); -const renderItemValue = (props, store) => ( - +const renderItemValue = (props: T, store: TCoreStores) => ( + - + ); -const TradeSettingsExtensions = ({ populateSettingsExtensions, store }) => { +const TradeSettingsExtensions = observer(({ store }: TTradeSettingsExtensionsProps) => { + const { ui } = useStore(); + const { populateSettingsExtensions } = ui; const populateSettings = () => { - const menu_items = [ + const menu_items: Parameters[0] = [ { icon: 'IcChart', label: localize('Charts'), @@ -49,13 +56,6 @@ const TradeSettingsExtensions = ({ populateSettingsExtensions, store }) => { React.useEffect(() => populateSettings()); return null; -}; - -TradeSettingsExtensions.propTypes = { - populateSettingsExtensions: PropTypes.func, - store: PropTypes.object, -}; +}); -export default connect(({ ui }) => ({ - populateSettingsExtensions: ui.populateSettingsExtensions, -}))(TradeSettingsExtensions); +export default TradeSettingsExtensions; diff --git a/packages/trader/src/App/app.tsx b/packages/trader/src/App/app.tsx index 5b091e7c2283..e1c53b91a711 100644 --- a/packages/trader/src/App/app.tsx +++ b/packages/trader/src/App/app.tsx @@ -1,20 +1,19 @@ -import PropTypes from 'prop-types'; import React from 'react'; import Loadable from 'react-loadable'; -import { StoreProvider } from '@deriv/stores'; import Routes from 'App/Containers/Routes/routes.jsx'; -import TradeHeaderExtensions from 'App/Containers/trade-header-extensions.jsx'; +import TradeHeaderExtensions from 'App/Containers/trade-header-extensions'; import TradeFooterExtensions from 'App/Containers/trade-footer-extensions.jsx'; -import TradeSettingsExtensions from 'App/Containers/trade-settings-extensions.jsx'; +import TradeSettingsExtensions from 'App/Containers/trade-settings-extensions'; import { NetworkStatusToastErrorPopup } from 'Modules/Trading/Containers/toast-popup.jsx'; -import { MobxContentProvider } from 'Stores/connect'; -import initStore from './init-store.js'; // eslint-disable-line import/extensions +import initStore from './init-store'; import 'Sass/app.scss'; +import type { TCoreStores } from '@deriv/stores/types'; +import TraderProviders from '../trader-providers'; type Apptypes = { passthrough: { - root_store: any; - WS: any; + root_store: TCoreStores; + WS: unknown; }; }; @@ -24,30 +23,21 @@ const TradeModals = Loadable({ }); const App = ({ passthrough }: Apptypes) => { - const [root_store] = React.useState(initStore(passthrough.root_store, passthrough.WS)); + const root_store = initStore(passthrough.root_store, passthrough.WS); React.useEffect(() => { return () => root_store.ui.setPromptHandler(false); }, [root_store]); return ( - - - - - - - - - - + + + + + + + + ); }; -App.propTypes = { - passthrough: PropTypes.shape({ - root_store: PropTypes.object, - WS: PropTypes.object, - }), -}; - export default App; diff --git a/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/__tests__/accumulators-stats.spec.js b/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/__tests__/accumulators-stats.spec.js index 81fa7005b911..2788d8435905 100644 --- a/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/__tests__/accumulators-stats.spec.js +++ b/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/__tests__/accumulators-stats.spec.js @@ -2,19 +2,21 @@ import React from 'react'; import { fireEvent, render, screen, within } from '@testing-library/react'; import { isDesktop, isMobile } from '@deriv/shared'; import AccumulatorsStats, { ROW_SIZES } from '../accumulators-stats'; +import { TraderProviders } from '../../../../../trader-providers'; +import { mockStore } from '@deriv/stores'; const mock_connect_props = { - ticks_history_stats: { - ticks_stayed_in: [1, 65, 1234, 675, 234, 10, 658, 134, 5, 2394, 100, 6, 90, 9, 344, 81, 695, 14, 345, 2222], - last_tick_epoch: 1005, + modules: { + trade: { + ticks_history_stats: { + ticks_stayed_in: [ + 1, 65, 1234, 675, 234, 10, 658, 134, 5, 2394, 100, 6, 90, 9, 344, 81, 695, 14, 345, 2222, + ], + last_tick_epoch: 1005, + }, + }, }, }; - -jest.mock('Stores/connect.js', () => ({ - __esModule: true, - default: 'mockedDefaultExport', - connect: () => Component => props => Component({ ...props, ...mock_connect_props }), -})); jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), isDesktop: jest.fn(), @@ -32,32 +34,55 @@ describe('AccumulatorsStats', () => { }); it('should render as expandable', () => { - const { container } = render(); + const { container } = render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(container.querySelector('.accordion-toggle-arrow')).toBeInTheDocument(); }); it('should render as non-expandable', () => { - const { container } = render(); + const { container } = render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(container.querySelector('.accordion-toggle-arrow')).not.toBeInTheDocument(); }); it('should show manual after info icon is clicked', () => { const { container } = render(, { container: document.body.appendChild(modal_root_el), + wrapper: ({ children }) => ( + {children} + ), }); fireEvent.click(container.querySelector('.info')); expect(screen.getByTestId('dt_accumulators_stats_manual_video')).toBeInTheDocument(); }); it('should render partial history values (tick counters) when initially collapsed in desktop', () => { - render(); + render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getAllByTestId('dt_accu_stats_history_counter').length).toEqual(ROW_SIZES.DESKTOP_COLLAPSED); }); it('should render partial history values (tick counters) when initially collapsed in mobile', () => { isMobile.mockReturnValue(true); isDesktop.mockReturnValue(false); - render(); + render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getAllByTestId('dt_accu_stats_history_counter').length).toEqual(ROW_SIZES.MOBILE_COLLAPSED); }); it('should expand in desktop when accordion_toggle_arrow is clicked', () => { - const { container } = render(); + const { container } = render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getAllByTestId('dt_accu_stats_history_counter').length).toEqual(ROW_SIZES.DESKTOP_COLLAPSED); fireEvent.click(container.querySelector('.accordion-toggle-arrow')); @@ -70,6 +95,9 @@ describe('AccumulatorsStats', () => { isDesktop.mockReturnValue(false); const { container } = render(, { container: document.body.appendChild(modal_root_el), + wrapper: ({ children }) => ( + {children} + ), }); expect(screen.getAllByTestId('dt_accu_stats_history_counter').length).toEqual(ROW_SIZES.MOBILE_COLLAPSED); diff --git a/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/accumulators-stats.jsx b/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/accumulators-stats.jsx index 2bbb63bad707..656994ad23bc 100644 --- a/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/accumulators-stats.jsx +++ b/packages/trader/src/Modules/Contract/Components/AccumulatorsStats/accumulators-stats.jsx @@ -4,11 +4,12 @@ import PropTypes from 'prop-types'; import { DesktopWrapper, Icon, MobileDialog, MobileWrapper, Text } from '@deriv/components'; import { isDesktop, isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import ExpandedTicksHistory from './expanded-ticks-history'; import TicksHistoryCounter from './ticks-history-counter'; import { AccumulatorsStatsManualModal } from './accumulators-stats-manual-modal'; import 'Sass/app/modules/contract/accumulators-stats.scss'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; export const ROW_SIZES = { DESKTOP_COLLAPSED: 10, @@ -17,7 +18,11 @@ export const ROW_SIZES = { MOBILE_EXPANDED: 5, }; -const AccumulatorsStats = ({ is_dark_theme, is_expandable = true, ticks_history_stats = {} }) => { +const AccumulatorsStats = observer(({ is_expandable = true }) => { + const { ui } = useStore(); + const { ticks_history_stats = {} } = useTraderStore(); + const { is_dark_mode_on: is_dark_theme } = ui; + const [is_collapsed, setIsCollapsed] = React.useState(true); const [is_manual_open, setIsManualOpen] = React.useState(false); const widget_title = localize('Stats'); @@ -86,15 +91,10 @@ const AccumulatorsStats = ({ is_dark_theme, is_expandable = true, ticks_history_ )}
); -}; +}); AccumulatorsStats.propTypes = { - is_dark_theme: PropTypes.bool, is_expandable: PropTypes.bool, - ticks_history_stats: PropTypes.object, }; -export default connect(({ modules, ui }) => ({ - is_dark_theme: ui.is_dark_mode_on, - ticks_history_stats: modules.trade.ticks_history_stats, -}))(AccumulatorsStats); +export default AccumulatorsStats; diff --git a/packages/trader/src/Modules/Contract/Containers/contract-replay-widget.jsx b/packages/trader/src/Modules/Contract/Containers/contract-replay-widget.jsx index 9fb697e8cc3c..a264cc08533b 100644 --- a/packages/trader/src/Modules/Contract/Containers/contract-replay-widget.jsx +++ b/packages/trader/src/Modules/Contract/Containers/contract-replay-widget.jsx @@ -1,39 +1,42 @@ import React from 'react'; import Digits from 'Modules/Contract/Components/Digits'; import InfoBox from 'Modules/Contract/Components/InfoBox'; -import { connect } from 'Stores/connect'; import BottomWidgets from '../../SmartChart/Components/bottom-widgets.jsx'; import TopWidgets from '../../SmartChart/Components/top-widgets.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -export const DigitsWidget = connect(({ contract_replay }) => ({ - contract_info: contract_replay.contract_store.contract_info, - digits_info: contract_replay.contract_store.digits_info, - display_status: contract_replay.contract_store.display_status, - is_digit_contract: contract_replay.contract_store.is_digit_contract, - is_ended: contract_replay.contract_store.is_ended, -}))(({ is_digit_contract, is_ended, contract_info, digits_info, display_status }) => ( - -)); +export const DigitsWidget = observer(() => { + const { contract_replay } = useStore(); + const { contract_store } = contract_replay; + const { contract_info, digits_info, display_status, is_digit_contract, is_ended } = contract_store; -export const InfoBoxWidget = connect(({ contract_replay, modules }) => ({ - contract_info: contract_replay.contract_store.contract_info, - error_message: contract_replay.error_message, - removeError: contract_replay.removeErrorMessage, - is_vanilla: modules.trade.is_vanilla, -}))(({ contract_info, error_message, removeError, is_vanilla }) => ( - -)); + return ( + + ); +}); + +export const InfoBoxWidget = observer(() => { + const { contract_replay } = useStore(); + const { is_vanilla } = useTraderStore(); + const { contract_store, removeErrorMessage: removeError, error_message } = contract_replay; + const { contract_info } = contract_store; + + return ( + + ); +}); // Chart widgets passed into SmartCharts export const ChartTopWidgets = () => } is_title_enabled={false} />; diff --git a/packages/trader/src/Modules/Contract/Containers/contract-replay.jsx b/packages/trader/src/Modules/Contract/Containers/contract-replay.jsx index 2144de2614bc..daac8ae993e1 100644 --- a/packages/trader/src/Modules/Contract/Containers/contract-replay.jsx +++ b/packages/trader/src/Modules/Contract/Containers/contract-replay.jsx @@ -28,32 +28,31 @@ import ChartLoader from 'App/Components/Elements/chart-loader.jsx'; import ContractDrawer from 'App/Components/Elements/ContractDrawer'; import UnsupportedContractModal from 'App/Components/Elements/Modals/UnsupportedContractModal'; import { SmartChart } from 'Modules/SmartChart'; -import { connect } from 'Stores/connect'; import { ChartBottomWidgets, ChartTopWidgets, DigitsWidget, InfoBoxWidget } from './contract-replay-widget.jsx'; import ChartMarker from 'Modules/SmartChart/Components/Markers/marker.jsx'; import allMarkers from 'Modules/SmartChart/Components/all-markers.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const ContractReplay = observer(({ contract_id }) => { + const { common, contract_replay, ui } = useStore(); + const { contract_store } = contract_replay; + const { + is_market_closed, + is_sell_requested, + is_valid_to_cancel, + onClickCancel, + onClickSell, + onMount, + onUnmount, + indicative_status, + is_chart_loading, + is_forward_starting, + } = contract_replay; + const { contract_info, contract_update, contract_update_history, is_digit_contract } = contract_store; + const { routeBackInApp } = common; + const { is_dark_mode_on: is_dark_theme, notification_messages_ui: NotificationMessages, toggleHistoryTab } = ui; -const ContractReplay = ({ - contract_id, - contract_info, - contract_update, - contract_update_history, - is_chart_loading, - is_dark_theme, - is_digit_contract, - is_forward_starting, - is_market_closed, - is_sell_requested, - is_valid_to_cancel, - onClickCancel, - NotificationMessages, - onClickSell, - indicative_status, - toggleHistoryTab, - routeBackInApp, - onMount, - onUnmount, -}) => { const [is_visible, setIsVisible] = React.useState(false); const history = useHistory(); @@ -176,119 +175,112 @@ const ContractReplay = ({ ); -}; +}); ContractReplay.propTypes = { contract_id: PropTypes.number, - contract_info: PropTypes.object, - contract_update: PropTypes.object, - contract_update_history: PropTypes.array, - indicative_status: PropTypes.string, - is_chart_loading: PropTypes.bool, - is_dark_theme: PropTypes.bool, - is_digit_contract: PropTypes.bool, - is_forward_starting: PropTypes.bool, - is_market_closed: PropTypes.bool, - is_sell_requested: PropTypes.bool, - is_valid_to_cancel: PropTypes.bool, - NotificationMessages: PropTypes.func, - onClickCancel: PropTypes.func, - onClickSell: PropTypes.func, - onMount: PropTypes.func, - onUnmount: PropTypes.func, - routeBackInApp: PropTypes.func, - routes: PropTypes.arrayOf(PropTypes.object), - toggleHistoryTab: PropTypes.func, }; -export default connect(({ common, contract_replay, ui }) => { - const local_contract_replay = contract_replay; - const contract_store = local_contract_replay.contract_store; - return { - routeBackInApp: common.routeBackInApp, - contract_info: contract_store.contract_info, - contract_update: contract_store.contract_update, - contract_update_history: contract_store.contract_update_history, - is_digit_contract: contract_store.is_digit_contract, - is_market_closed: local_contract_replay.is_market_closed, - is_sell_requested: local_contract_replay.is_sell_requested, - is_valid_to_cancel: local_contract_replay.is_valid_to_cancel, - onClickCancel: local_contract_replay.onClickCancel, - onClickSell: local_contract_replay.onClickSell, - onMount: local_contract_replay.onMount, - onUnmount: local_contract_replay.onUnmount, - indicative_status: local_contract_replay.indicative_status, - is_chart_loading: local_contract_replay.is_chart_loading, - is_forward_starting: local_contract_replay.is_forward_starting, - is_dark_theme: ui.is_dark_mode_on, - NotificationMessages: ui.notification_messages_ui, - toggleHistoryTab: ui.toggleHistoryTab, - }; -})(ContractReplay); +export default ContractReplay; // CHART ----------------------------------------- -const Chart = props => { - const AccumulatorsShadedBarriers = allMarkers[props.accumulators_barriers_marker?.type]; +const ReplayChart = observer(({ is_accumulator_contract }) => { + const trade = useTraderStore(); + const { contract_replay, common, ui } = useStore(); + const { contract_store, chart_state, chartStateChange, margin } = contract_replay; + const { + contract_config, + marker: accumulators_barriers_marker, + is_digit_contract, + barriers_array, + markers_array, + contract_info, + } = contract_store; + const { underlying: symbol, audit_details } = contract_info; + const allow_scroll_to_epoch = chart_state === 'READY' || chart_state === 'SCROLL_TO_LEFT'; + const { app_routing_history, current_language, is_socket_opened } = common; + const { is_dark_mode_on: is_dark_theme, is_chart_layout_default, is_chart_countdown_visible } = ui; + const { end_epoch, chart_type, start_epoch, granularity } = contract_config; + /** + * TODO: remove forcing light theme once DBot supports dark theme + * DBot does not support for dark theme since till now, + * as a result, if any user come to report detail pages + * from DBot, we should force it to have light theme + */ + const from_platform = getPlatformRedirect(app_routing_history); + const should_force_light_theme = from_platform.name === 'DBot'; + const settings = { + language: current_language.toLowerCase(), + theme: is_dark_theme && !should_force_light_theme ? 'dark' : 'light', + position: is_chart_layout_default ? 'bottom' : 'left', + countdown: is_chart_countdown_visible, + assetInformation: false, // ui.is_chart_asset_info_visible, + isHighestLowestMarkerEnabled: false, // TODO: Pending UI + }; + const scroll_to_epoch = allow_scroll_to_epoch ? contract_config.scroll_to_epoch : undefined; + const all_ticks = audit_details ? audit_details.all_ticks : []; + const { wsForget, wsSubscribe, wsSendRequest, wsForgetStream } = trade; + + const AccumulatorsShadedBarriers = allMarkers[accumulators_barriers_marker?.type]; const isBottomWidgetVisible = () => { - return isDesktop() && props.is_digit_contract; + return isDesktop() && is_digit_contract; }; const getChartYAxisMargin = () => { - const margin = { + const chart_margin = { top: isMobile() ? 96 : 148, bottom: isBottomWidgetVisible() ? 128 : 112, }; if (isMobile()) { - margin.bottom = 48; + chart_margin.bottom = 48; } - return margin; + return chart_margin; }; - const prev_start_epoch = usePrevious(props.start_epoch); + const prev_start_epoch = usePrevious(start_epoch); return ( - {props.markers_array.map(marker => ( + {markers_array.map(marker => ( { is_bottom_widget_visible={isBottomWidgetVisible()} /> ))} - {props.is_accumulator_contract && props.markers_array && ( + {is_accumulator_contract && markers_array && ( )} ); -}; +}); -Chart.propTypes = { - accumulators_barriers_marker: PropTypes.object, - barriers_array: PropTypes.array, - BottomWidgets: PropTypes.node, - chartStateChange: PropTypes.func, - chart_type: PropTypes.string, - end_epoch: PropTypes.number, - granularity: PropTypes.number, - InfoBox: PropTypes.node, +ReplayChart.propTypes = { is_accumulator_contract: PropTypes.bool, - is_dark_theme: PropTypes.bool, - is_digit_contract: PropTypes.bool, - is_mobile: PropTypes.bool, - is_socket_opened: PropTypes.bool, - is_static_chart: PropTypes.bool, - margin: PropTypes.number, - markers_array: PropTypes.array, - replay_controls: PropTypes.object, - scroll_to_epoch: PropTypes.number, - settings: PropTypes.object, - start_epoch: PropTypes.number, - symbol: PropTypes.string, - contract_info: PropTypes.object, - all_ticks: PropTypes.array, - wsForget: PropTypes.func, - wsForgetStream: PropTypes.func, - wsSendRequest: PropTypes.func, - wsSubscribe: PropTypes.func, - shouldFetchTickHistory: PropTypes.bool, }; - -const ReplayChart = connect(({ modules, ui, common, contract_replay }) => { - const trade = modules.trade; - const contract_store = contract_replay.contract_store; - const contract_config = contract_store.contract_config; - const allow_scroll_to_epoch = - contract_replay.chart_state === 'READY' || contract_replay.chart_state === 'SCROLL_TO_LEFT'; - /** - * TODO: remove forcing light theme once DBot supports dark theme - * DBot does not support for dark theme since till now, - * as a result, if any user come to report detail pages - * from DBot, we should force it to have light theme - */ - const from_platform = getPlatformRedirect(common.app_routing_history); - const should_force_light_theme = from_platform.name === 'DBot'; - - const settings = { - language: common.current_language.toLowerCase(), - theme: ui.is_dark_mode_on && !should_force_light_theme ? 'dark' : 'light', - position: ui.is_chart_layout_default ? 'bottom' : 'left', - countdown: ui.is_chart_countdown_visible, - assetInformation: false, // ui.is_chart_asset_info_visible, - isHighestLowestMarkerEnabled: false, // TODO: Pending UI - }; - - return { - accumulators_barriers_marker: contract_store.marker, - end_epoch: contract_config.end_epoch, - chart_type: contract_config.chart_type, - start_epoch: contract_config.start_epoch, - granularity: contract_config.granularity, - scroll_to_epoch: allow_scroll_to_epoch ? contract_config.scroll_to_epoch : undefined, - settings, - is_mobile: ui.is_mobile, - is_socket_opened: common.is_socket_opened, - is_digit_contract: contract_store.is_digit_contract, - chartStateChange: contract_replay.chartStateChange, - margin: contract_replay.margin, - is_static_chart: contract_replay.is_static_chart, - barriers_array: contract_store.barriers_array, - markers_array: contract_store.markers_array, - symbol: contract_store.contract_info.underlying, - contract_info: contract_store.contract_info, - all_ticks: contract_store.contract_info.audit_details - ? contract_store.contract_info.audit_details.all_ticks - : [], - wsForget: trade.wsForget, - wsSubscribe: trade.wsSubscribe, - wsSendRequest: trade.wsSendRequest, - wsForgetStream: trade.wsForgetStream, - }; -})(Chart); diff --git a/packages/trader/src/Modules/Contract/Containers/contract.jsx b/packages/trader/src/Modules/Contract/Containers/contract.jsx index 45c096f8c110..420cfe0d21d2 100644 --- a/packages/trader/src/Modules/Contract/Containers/contract.jsx +++ b/packages/trader/src/Modules/Contract/Containers/contract.jsx @@ -5,12 +5,21 @@ import { CSSTransition } from 'react-transition-group'; import { routes } from '@deriv/shared'; import ErrorComponent from 'App/Components/Elements/Errors'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import ContractReplay from './contract-replay.jsx'; +import { observer, useStore } from '@deriv/stores'; const dialog_errors = ['GetProposalFailure', 'ContractValidationError']; -const Contract = ({ error_code, error_message, match, history, has_error, onMount, onUnmount, removeErrorMessage }) => { +const Contract = observer(({ match, history }) => { + const { contract_replay } = useStore(); + const { + removeErrorMessage, + error_message, + error_code, + has_error, + removeAccountSwitcherListener: onUnmount, + setAccountSwitcherListener: onMount, + } = contract_replay; React.useEffect(() => { onMount(+match.params.contract_id, history); @@ -52,30 +61,11 @@ const Contract = ({ error_code, error_message, match, history, has_error, onMoun )} ); -}; +}); Contract.propTypes = { - error_message: PropTypes.string, - error_code: PropTypes.string, - has_error: PropTypes.bool, history: PropTypes.object, - is_mobile: PropTypes.bool, match: PropTypes.object, - onMount: PropTypes.func, - onUnmount: PropTypes.func, - removeErrorMessage: PropTypes.func, - symbol: PropTypes.string, }; -export default withRouter( - connect(({ ui, contract_replay }) => ({ - error_message: contract_replay.error_message, - error_code: contract_replay.error_code, - has_error: contract_replay.has_error, - onMount: contract_replay.setAccountSwitcherListener, - onUnmount: contract_replay.removeAccountSwitcherListener, - removeErrorMessage: contract_replay.removeErrorMessage, - symbol: contract_replay.contract_info.underlying, - is_mobile: ui.is_mobile, - }))(Contract) -); +export default withRouter(Contract); diff --git a/packages/trader/src/Modules/SmartChart/Components/control-widgets.jsx b/packages/trader/src/Modules/SmartChart/Components/control-widgets.jsx index 182d8d7384df..e62772683ec4 100644 --- a/packages/trader/src/Modules/SmartChart/Components/control-widgets.jsx +++ b/packages/trader/src/Modules/SmartChart/Components/control-widgets.jsx @@ -1,27 +1,28 @@ -import PropTypes from 'prop-types'; import React from 'react'; +import { observer, useStore } from '@deriv/stores'; import { DesktopWrapper } from '@deriv/components'; import { ChartMode, DrawTools, Share, StudyLegend, Views } from 'Modules/SmartChart'; -const ControlWidgets = ({ updateChartType, updateGranularity }) => ( - - - updateChartType(type)} - onGranularity={granularity => updateGranularity(granularity)} - /> - - - - - - -); +const ControlWidgets = observer(() => { + const { + contract_trade: { updateChartType, updateGranularity }, + } = useStore(); -ControlWidgets.propTypes = { - updateChartType: PropTypes.func, - updateGranularity: PropTypes.func, -}; + return ( + + + updateChartType(type)} + onGranularity={granularity => updateGranularity(granularity)} + /> + + + + + + + ); +}); export default ControlWidgets; diff --git a/packages/trader/src/Modules/SmartChart/Components/toolbar-widgets.jsx b/packages/trader/src/Modules/SmartChart/Components/toolbar-widgets.jsx index f98fa5684f6d..f16888081bbf 100644 --- a/packages/trader/src/Modules/SmartChart/Components/toolbar-widgets.jsx +++ b/packages/trader/src/Modules/SmartChart/Components/toolbar-widgets.jsx @@ -3,15 +3,17 @@ import React from 'react'; import { isDesktop, isMobile } from '@deriv/shared'; import { ChartMode, DrawTools, Share, StudyLegend, Views, ToolbarWidget } from 'Modules/SmartChart'; -const ToolbarWidgets = ({ position, updateChartType, updateGranularity }) => ( - - - {isDesktop() && } - {isDesktop() && } - {isDesktop() && } - {isDesktop() && } - -); +const ToolbarWidgets = ({ position, updateChartType, updateGranularity }) => { + return ( + + + {isDesktop() && } + {isDesktop() && } + {isDesktop() && } + {isDesktop() && } + + ); +}; ToolbarWidgets.propTypes = { position: PropTypes.string, diff --git a/packages/trader/src/Modules/SmartChart/Components/top-widgets.jsx b/packages/trader/src/Modules/SmartChart/Components/top-widgets.jsx index 9a7840505bab..1f6425d37b61 100644 --- a/packages/trader/src/Modules/SmartChart/Components/top-widgets.jsx +++ b/packages/trader/src/Modules/SmartChart/Components/top-widgets.jsx @@ -4,11 +4,14 @@ import ReactDOM from 'react-dom'; import { DesktopWrapper, MobileWrapper, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; import { isEnded, isAccumulatorContract, isDigitContract } from '@deriv/shared'; -import { connect } from 'Stores/connect'; import { ChartTitle } from 'Modules/SmartChart'; import BuyToastNotification from './buy-toast-notification'; +import { observer, useStore } from '@deriv/stores'; + +const RecentTradeInfo = observer(() => { + const { contract_trade } = useStore(); + const { granularity, markers_array } = contract_trade; -const TradeInfo = ({ markers_array, granularity }) => { const latest_tick_contract = markers_array[markers_array.length - 1]; if ( !latest_tick_contract || @@ -27,12 +30,7 @@ const TradeInfo = ({ markers_array, granularity }) => { {localize('Tick')} {current_tick}/{tick_count} ); -}; - -const RecentTradeInfo = connect(({ contract_trade }) => ({ - granularity: contract_trade.granularity, - markers_array: contract_trade.markers_array, -}))(TradeInfo); +}); const TopWidgets = ({ InfoBox, diff --git a/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx b/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx index aec1e6044a68..8dd50213d65e 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx @@ -1,124 +1,107 @@ import React from 'react'; import { Checkbox, RadioGroup, Dialog, Popover, Text } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import { onToggleCancellation, onChangeCancellationDuration } from 'Stores/Modules/Trading/Helpers/multiplier'; import Fieldset from 'App/Components/Form/fieldset.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const DealCancellationWarning = ({ - disableApp, - enableApp, - is_visible, - onConfirm, - onCancel, - should_show_cancellation_warning, - toggleCancellationWarning, -}) => ( - - - - - toggleCancellationWarning()} - name={'should_show_cancellation_warning'} - label={localize("Don't show this again")} - /> - -); - -const DealCancellationWarningDialog = connect(({ ui }) => ({ - disableApp: ui.disableApp, - enableApp: ui.enableApp, - is_loading: ui.is_loading, - should_show_cancellation_warning: ui.should_show_cancellation_warning, - toggleCancellationWarning: ui.toggleCancellationWarning, -}))(DealCancellationWarning); - -const CancelDeal = ({ - has_cancellation, - has_take_profit, - has_stop_loss, - onChangeMultiple, - cancellation_duration, - cancellation_range_list, - should_show_cancellation_warning, -}) => { - const [is_deal_cancel_warning_visible, setDealCancelWarningVisibility] = React.useState(false); - - const canToggleDealCancel = () => { - const should_show_popover = (has_take_profit || has_stop_loss) && should_show_cancellation_warning; - if (should_show_popover) setDealCancelWarningVisibility(should_show_popover); - return !should_show_popover; - }; - +const DealCancellationWarningDialog = observer(({ is_visible, onConfirm, onCancel }) => { + const { ui } = useStore(); + const { disableApp, enableApp, should_show_cancellation_warning, toggleCancellationWarning } = ui; return ( - - setDealCancelWarningVisibility(false)} - onConfirm={() => { - setDealCancelWarningVisibility(false); - onToggleCancellation({ has_cancellation, onChangeMultiple }); - }} + + + + + toggleCancellationWarning()} + name={'should_show_cancellation_warning'} + label={localize("Don't show this again")} /> -
-
- { - if (canToggleDealCancel()) { - onToggleCancellation({ has_cancellation, onChangeMultiple }); - } - }} - name='has_cancellation' - label={localize('Deal cancellation')} - defaultChecked={has_cancellation} - /> - -
- {has_cancellation && ( - - onChangeCancellationDuration({ event, onChangeMultiple })} - > - {cancellation_range_list.map(({ text, value }) => ( - - ))} - - - )} -
-
+ ); -}; +}); + +const CancelDeal = observer( + ({ has_cancellation, has_take_profit, has_stop_loss, onChangeMultiple, cancellation_duration }) => { + const { ui } = useStore(); + const { should_show_cancellation_warning } = ui; + const { cancellation_range_list } = useTraderStore(); + const [is_deal_cancel_warning_visible, setDealCancelWarningVisibility] = React.useState(false); + + const canToggleDealCancel = () => { + const should_show_popover = (has_take_profit || has_stop_loss) && should_show_cancellation_warning; + if (should_show_popover) setDealCancelWarningVisibility(should_show_popover); + return !should_show_popover; + }; + + return ( + + setDealCancelWarningVisibility(false)} + onConfirm={() => { + setDealCancelWarningVisibility(false); + onToggleCancellation({ has_cancellation, onChangeMultiple }); + }} + /> +
+
+ { + if (canToggleDealCancel()) { + onToggleCancellation({ has_cancellation, onChangeMultiple }); + } + }} + name='has_cancellation' + label={localize('Deal cancellation')} + defaultChecked={has_cancellation} + /> + +
+ {has_cancellation && ( + + onChangeCancellationDuration({ event, onChangeMultiple })} + > + {cancellation_range_list.map(({ text, value }) => ( + + ))} + + + )} +
+
+ ); + } +); -export default connect(({ ui, modules }) => ({ - cancellation_range_list: modules.trade.cancellation_range_list, - should_show_cancellation_warning: ui.should_show_cancellation_warning, -}))(CancelDeal); +export default CancelDeal; diff --git a/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx b/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx index bc7b6b77cccd..08befd4c6659 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/Multiplier/risk-management-info.jsx @@ -1,19 +1,21 @@ import React from 'react'; import { Money } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import RiskManagementDialog from 'Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const RiskManagementInfo = ({ - currency, - stop_loss, - take_profit, - has_take_profit, - has_stop_loss, - cancellation_duration, - cancellation_range_list, - has_cancellation, -}) => { +const RiskManagementInfo = observer(() => { + const { + currency, + stop_loss, + take_profit, + has_take_profit, + has_stop_loss, + cancellation_duration, + cancellation_range_list, + has_cancellation, + } = useTraderStore(); const [is_dialog_open, setDialogOpen] = React.useState(false); const has_risk_management = has_take_profit || has_stop_loss || has_cancellation; const toggleDialog = () => { @@ -63,15 +65,6 @@ const RiskManagementInfo = ({
); -}; +}); -export default connect(({ modules }) => ({ - currency: modules.trade.currency, - stop_loss: modules.trade.stop_loss, - has_stop_loss: modules.trade.has_stop_loss, - take_profit: modules.trade.take_profit, - has_take_profit: modules.trade.has_take_profit, - cancellation_duration: modules.trade.cancellation_duration, - cancellation_range_list: modules.trade.cancellation_range_list, - has_cancellation: modules.trade.has_cancellation, -}))(RiskManagementInfo); +export default RiskManagementInfo; diff --git a/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx b/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx index e681154c7e5c..0d336ef5589f 100644 --- a/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx +++ b/packages/trader/src/Modules/Trading/Components/Elements/mobile-widget.jsx @@ -1,27 +1,29 @@ import React from 'react'; import { Money } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import { getExpiryType, getDurationMinMaxValues, getLocalizedBasis } from '@deriv/shared'; import { MultiplierAmountWidget } from 'Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx'; import TradeParamsModal from '../../Containers/trade-params-mobile.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const MobileWidget = observer(({ toggleDigitsWidget, is_collapsed }) => { + const { ui } = useStore(); + const { onChangeUiStore } = ui; + const trade_store = useTraderStore(); + const { + amount, + basis, + currency, + duration, + duration_min_max, + duration_unit, + form_components, + is_multiplier, + last_digit, + onChange, + } = trade_store; -const MobileWidget = ({ - amount, - basis, - currency, - duration, - duration_min_max, - duration_unit, - form_components, - is_collapsed, - is_multiplier, - last_digit, - onChange, - onChangeUiStore, - toggleDigitsWidget, - trade_store, -}) => { const [is_open, setIsOpen] = React.useState(false); React.useEffect(() => { @@ -104,19 +106,6 @@ const MobileWidget = ({ )}
); -}; +}); -export default connect(({ modules, ui }) => ({ - amount: modules.trade.amount, - basis: modules.trade.basis, - currency: modules.trade.currency, - duration: modules.trade.duration, - duration_min_max: modules.trade.duration_min_max, - duration_unit: modules.trade.duration_unit, - form_components: modules.trade.form_components, - is_multiplier: modules.trade.is_multiplier, - last_digit: modules.trade.last_digit, - onChange: modules.trade.onChange, - onChangeUiStore: ui.onChangeUiStore, - trade_store: modules.trade, -}))(MobileWidget); +export default MobileWidget; diff --git a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.jsx b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.jsx index 169b6cff8144..2d55815ca80b 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/DatePicker/trading-date-picker.jsx @@ -1,29 +1,28 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; import React from 'react'; import { DatePicker, Tooltip } from '@deriv/components'; import { isTimeValid, setTime, toMoment, useIsMounted, hasIntradayDurationUnit } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import { ContractType } from 'Stores/Modules/Trading/Helpers/contract-type'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const TradingDatePicker = observer(({ id, is_24_hours_contract, mode, name }) => { + const { common } = useStore(); + const { server_time } = common; + const { + duration: current_duration, + duration_min_max, + duration_units_list, + expiry_type, + onChange, + start_date, + start_time, + symbol, + validation_errors, + } = useTraderStore(); -const TradingDatePicker = ({ - duration: current_duration, - duration_min_max, - duration_units_list, - expiry_type, - id, - is_24_hours_contract, - mode, - name, - onChange, - server_time, - start_date, - start_time, - symbol, - validation_errors, -}) => { const isMounted = useIsMounted(); const [disabled_days, setDisabledDays] = React.useState([]); @@ -173,34 +172,13 @@ const TradingDatePicker = ({
); -}; +}); TradingDatePicker.propTypes = { - duration: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - duration_min_max: PropTypes.object, - duration_units_list: MobxPropTypes.arrayOrObservableArray, - expiry_type: PropTypes.string, id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), is_24_hours_contract: PropTypes.bool, mode: PropTypes.string, name: PropTypes.string, - onChange: PropTypes.func, - server_time: PropTypes.object, - start_date: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - start_time: PropTypes.string, - symbol: PropTypes.string, - validation_errors: PropTypes.object, }; -export default connect(({ modules, common }) => ({ - duration: modules.trade.duration, - duration_min_max: modules.trade.duration_min_max, - duration_units_list: modules.trade.duration_units_list, - expiry_type: modules.trade.expiry_type, - onChange: modules.trade.onChange, - server_time: common.server_time, - start_date: modules.trade.start_date, - start_time: modules.trade.start_time, - symbol: modules.trade.symbol, - validation_errors: modules.trade.validation_errors, -}))(TradingDatePicker); +export default TradingDatePicker; diff --git a/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.jsx b/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.jsx index b0338c0c65b7..cca795272fd7 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/Purchase/cancel-deal-info.jsx @@ -3,9 +3,11 @@ import React from 'react'; import { Money } from '@deriv/components'; import { isDesktop, isMobile, getDecimalPlaces } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const CancelDealInfo = ({ currency, has_cancellation, proposal_info }) => { +const CancelDealInfo = observer(({ proposal_info }) => { + const { currency, has_cancellation } = useTraderStore(); const { id, cancellation, has_error } = proposal_info; const error = has_error || !id; const [is_row_layout, setIsRowLayout] = React.useState(false); @@ -50,9 +52,6 @@ const CancelDealInfo = ({ currency, has_cancellation, proposal_info }) => { )}
); -}; +}); -export default connect(({ modules }) => ({ - has_cancellation: modules.trade.has_cancellation, - currency: modules.trade.currency, -}))(CancelDealInfo); +export default CancelDealInfo; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.jsx b/packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.jsx index 433f9ff6cf63..c51705aee27a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TimePicker/trading-time-picker.jsx @@ -1,19 +1,15 @@ -import PropTypes from 'prop-types'; import React from 'react'; -import { connect } from 'Stores/connect'; import { setTime, toMoment } from '@deriv/shared'; import TimePicker from 'App/Components/Form/TimePicker'; import { getSelectedTime, getBoundaries } from 'Stores/Modules/Trading/Helpers/end-time'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const TradingTimePicker = ({ - expiry_date, - expiry_time, - market_close_times, - market_open_times, - onChange, - server_time, - is_market_closed, -}) => { +const TradingTimePicker = observer(() => { + const { common } = useStore(); + const { server_time } = common; + const { expiry_date, expiry_time, market_open_times, market_close_times, onChange, is_market_closed } = + useTraderStore(); const moment_expiry_date = toMoment(expiry_date); const market_open_datetimes = market_open_times.map(open_time => setTime(moment_expiry_date.clone(), open_time)); const market_close_datetimes = market_close_times.map(close_time => @@ -48,26 +44,6 @@ const TradingTimePicker = ({ selected_time={selected_time} /> ); -}; +}); -TradingTimePicker.propTypes = { - expiry_date: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - expiry_time: PropTypes.string, - is_market_closed: PropTypes.bool, - market_close_times: PropTypes.array, - market_open_times: PropTypes.array, - name: PropTypes.string, - onChange: PropTypes.func, - server_time: PropTypes.object, -}; - -export default connect(({ modules, common }) => ({ - duration_units_list: modules.trade.duration_units_list, - expiry_time: modules.trade.expiry_time, - expiry_date: modules.trade.expiry_date, - market_close_times: modules.trade.market_close_times, - market_open_times: modules.trade.market_open_times, - onChange: modules.trade.onChange, - server_time: common.server_time, - is_market_closed: modules.trade.is_market_closed, -}))(TradingTimePicker); +export default TradingTimePicker; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js index 82a6a1b15443..dbdd1c541d23 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js @@ -1,22 +1,26 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import Accumulator from '../accumulator'; +import { mockStore } from '@deriv/stores'; +import TraderProviders from '../../../../../../../trader-providers'; const mock_connect_props = { - accumulator_range_list: [0.01, 0.02, 0.03, 0.04, 0.05], - onChange: jest.fn(), - growth_rate: 0.01, + modules: { + trade: { + accumulator_range_list: [0.01, 0.02, 0.03, 0.04, 0.05], + onChange: jest.fn(), + growth_rate: 0.01, + }, + }, }; -jest.mock('Stores/connect.js', () => ({ - __esModule: true, - default: 'mockedDefaultExport', - connect: () => Component => props => Component({ ...props, ...mock_connect_props }), -})); - describe('Accumulator', () => { it('should render with the initially selected 1% growth_rate', () => { - render(); + render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getByText('Accumulate')).toBeInTheDocument(); expect(screen.getByText('1%')).toBeInTheDocument(); expect(screen.getByText('2%')).toBeInTheDocument(); @@ -27,8 +31,12 @@ describe('Accumulator', () => { }); it('3% growth_rate should be selected when 0.03 is a currently selected and stored growth_rate value', () => { - mock_connect_props.growth_rate = 0.03; - render(); + mock_connect_props.modules.trade.growth_rate = 0.03; + render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getByText('3%').getAttribute('class')).toContain('--selected'); expect(screen.getByText('1%').getAttribute('class')).not.toContain('--selected'); }); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js index ccdf0272f957..323ce2276a8f 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js @@ -1,22 +1,26 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import AccumulatorsInfoDisplay from '../accumulators-info-display'; +import { mockStore } from '@deriv/stores'; +import TraderProviders from '../../../../../../../trader-providers'; const mock_connect_props = { - currency: 'USD', - maximum_payout: 10000, - maximum_ticks: 250, + modules: { + trade: { + currency: 'USD', + maximum_payout: 10000, + maximum_ticks: 250, + }, + }, }; -jest.mock('Stores/connect.js', () => ({ - __esModule: true, - default: 'mockedDefaultExport', - connect: () => Component => props => Component({ ...props, ...mock_connect_props }), -})); - describe('AccumulatorsInfoDisplay', () => { it('should render correct Maximum payout and Maximum ticks', () => { - render(); + render(, { + wrapper: ({ children }) => ( + {children} + ), + }); expect(screen.getByRole('group')).toHaveClass('trade-container__fieldset accu-info-display'); expect(screen.getByText(/maximum payout/i)).toBeInTheDocument(); expect(screen.getByText('10,000.00 USD')).toBeInTheDocument(); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx index 3c5de546fb66..41fa888784f7 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx @@ -1,21 +1,16 @@ -import { PropTypes as MobxPropTypes } from 'mobx-react'; -import PropTypes from 'prop-types'; import React from 'react'; import { localize } from '@deriv/translations'; import NumberSelector from 'App/Components/Form/number-selector.jsx'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; import { getGrowthRatePercentage, getTickSizeBarrierPercentage, isEmptyObject } from '@deriv/shared'; import classNames from 'classnames'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const Accumulator = observer(() => { + const { accumulator_range_list, growth_rate, is_accumulator, onChange, tick_size_barrier, proposal_info } = + useTraderStore(); -const Accumulator = ({ - accumulator_range_list, - growth_rate, - is_accumulator, - onChange, - tick_size_barrier, - proposal_info, -}) => { // splitting accumulator_range_list into rows containing 5 values each: const arr_arr_numbers = accumulator_range_list.reduce((acc, _el, index) => { if (index % 5 === 0) { @@ -49,22 +44,6 @@ const Accumulator = ({ /> ); -}; - -Accumulator.propTypes = { - accumulator_range_list: MobxPropTypes.arrayOrObservableArray, - growth_rate: PropTypes.number, - is_accumulator: PropTypes.boolean, - onChange: PropTypes.func, - proposal_info: PropTypes.object, - tick_size_barrier: PropTypes.number, -}; +}); -export default connect(({ modules }) => ({ - is_accumulator: modules.trade.is_accumulator, - accumulator_range_list: modules.trade.accumulator_range_list, - growth_rate: modules.trade.growth_rate, - onChange: modules.trade.onChange, - proposal_info: modules.trade.proposal_info, - tick_size_barrier: modules.trade.tick_size_barrier, -}))(Accumulator); +export default Accumulator; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-amount-mobile.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-amount-mobile.jsx index ee4088749e82..9d4242c8e5c1 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-amount-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-amount-mobile.jsx @@ -3,19 +3,16 @@ import React from 'react'; import classNames from 'classnames'; import { AMOUNT_MAX_LENGTH, getDecimalPlaces } from '@deriv/shared'; import { MobileWrapper } from '@deriv/components'; -import { connect } from 'Stores/connect'; import { localize } from '@deriv/translations'; import LabeledQuantityInputMobile from '../../LabeledQuantityInputMobile'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const AccumulatorsAmountMobile = ({ - amount, - currency, - current_focus, - is_nativepicker, - is_single_currency, - onChange, - setCurrentFocus, -}) => { +const AccumulatorsAmountMobile = observer(({ is_nativepicker }) => { + const { ui, client } = useStore(); + const { current_focus, setCurrentFocus } = ui; + const { is_single_currency } = client; + const { amount, currency, onChange } = useTraderStore(); return ( <> @@ -46,23 +43,10 @@ const AccumulatorsAmountMobile = ({ ); -}; +}); AccumulatorsAmountMobile.propTypes = { - amount: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - currency: PropTypes.string, - current_focus: PropTypes.string, is_nativepicker: PropTypes.bool, - is_single_currency: PropTypes.bool, - onChange: PropTypes.func, - setCurrentFocus: PropTypes.func, }; -export default connect(({ modules, client, ui }) => ({ - amount: modules.trade.amount, - currency: modules.trade.currency, - current_focus: ui.current_focus, - is_single_currency: client.is_single_currency, - onChange: modules.trade.onChange, - setCurrentFocus: ui.setCurrentFocus, -}))(AccumulatorsAmountMobile); +export default AccumulatorsAmountMobile; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display.jsx index 534b36179a72..341a9f0d9a97 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display.jsx @@ -1,12 +1,14 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { localize } from '@deriv/translations'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; import { Money, Text } from '@deriv/components'; import classNames from 'classnames'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const AccumulatorsInfoDisplay = observer(() => { + const { currency, maximum_payout, maximum_ticks } = useTraderStore(); -const AccumulatorsInfoDisplay = ({ currency, maximum_payout, maximum_ticks }) => { const content = [ { label: localize('Maximum payout'), @@ -32,16 +34,6 @@ const AccumulatorsInfoDisplay = ({ currency, maximum_payout, maximum_ticks }) => ))} ); -}; - -AccumulatorsInfoDisplay.propTypes = { - currency: PropTypes.string, - maximum_payout: PropTypes.number, - maximum_ticks: PropTypes.number, -}; +}); -export default connect(({ modules }) => ({ - currency: modules.trade.currency, - maximum_payout: modules.trade.maximum_payout, - maximum_ticks: modules.trade.maximum_ticks, -}))(AccumulatorsInfoDisplay); +export default AccumulatorsInfoDisplay; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/advanced-duration.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/advanced-duration.jsx index a747b4b501d5..1fea7a11d937 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/advanced-duration.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/advanced-duration.jsx @@ -5,133 +5,134 @@ import React from 'react'; import { Dropdown, ButtonToggle, InputField } from '@deriv/components'; import { toMoment, hasIntradayDurationUnit } from '@deriv/shared'; import RangeSlider from 'App/Components/Form/RangeSlider'; -import { connect } from 'Stores/connect'; import TradingDatePicker from '../../DatePicker'; import TradingTimePicker from '../../TimePicker'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const AdvancedDuration = ({ - advanced_duration_unit, - advanced_expiry_type, - duration_units_list, - duration_t, - contract_expiry_type, - changeDurationUnit, - current_focus, - getDurationFromUnit, - expiry_date, - expiry_list, - expiry_type, - number_input_props, - onChange, - onChangeUiStore, - server_time, - setCurrentFocus, - shared_input_props, - start_date, - validation_errors, -}) => { - let is_24_hours_contract = false; +const AdvancedDuration = observer( + ({ + advanced_duration_unit, + advanced_expiry_type, + duration_units_list, + duration_t, + changeDurationUnit, + getDurationFromUnit, + expiry_date, + expiry_list, + expiry_type, + number_input_props, + onChange, + onChangeUiStore, + server_time, + shared_input_props, + start_date, + }) => { + const { ui } = useStore(); + const { current_focus, setCurrentFocus } = ui; + const { contract_expiry_type, validation_errors } = useTraderStore(); - if (expiry_type === 'endtime') { - const has_intraday_duration_unit = hasIntradayDurationUnit(duration_units_list); - is_24_hours_contract = - (!!start_date || toMoment(expiry_date || server_time).isSame(toMoment(server_time), 'day')) && - has_intraday_duration_unit; - } + let is_24_hours_contract = false; - const endtime_container_class = classNames('endtime-container', { - 'has-time': is_24_hours_contract, - }); + if (expiry_type === 'endtime') { + const has_intraday_duration_unit = hasIntradayDurationUnit(duration_units_list); + is_24_hours_contract = + (!!start_date || toMoment(expiry_date || server_time).isSame(toMoment(server_time), 'day')) && + has_intraday_duration_unit; + } - const changeExpiry = ({ target }) => { - const { name, value } = target; + const endtime_container_class = classNames('endtime-container', { + 'has-time': is_24_hours_contract, + }); - onChange({ target: { name: 'expiry_type', value } }); - onChangeUiStore({ name, value }); - }; + const changeExpiry = ({ target }) => { + const { name, value } = target; - return ( - <> - {expiry_list.length > 1 && ( - - )} - {expiry_type === 'duration' ? ( - <> -
- {duration_units_list.length >= 1 && ( - - )} - {advanced_duration_unit === 't' && contract_expiry_type === 'tick' && ( - - )} - {advanced_duration_unit === 'd' && ( + onChange({ target: { name: 'expiry_type', value } }); + onChangeUiStore({ name, value }); + }; + + return ( + <> + {expiry_list.length > 1 && ( + + )} + {expiry_type === 'duration' ? ( + <> +
+ {duration_units_list.length >= 1 && ( + + )} + {advanced_duration_unit === 't' && contract_expiry_type === 'tick' && ( + + )} + {advanced_duration_unit === 'd' && ( + + )} + {advanced_duration_unit !== 't' && advanced_duration_unit !== 'd' && ( + + )} +
+ + ) : ( + <> +
- )} - {advanced_duration_unit !== 't' && advanced_duration_unit !== 'd' && ( - - )} -
- - ) : ( - <> -
- - { - is_24_hours_contract && - // validation_errors={validation_errors.end_time} TODO: add validation_errors for end time - } -
- - )} - - ); -}; + { + is_24_hours_contract && + // validation_errors={validation_errors.end_time} TODO: add validation_errors for end time + } +
+ + )} + + ); + } +); AdvancedDuration.propTypes = { advanced_duration_unit: PropTypes.string, advanced_expiry_type: PropTypes.string, changeDurationUnit: PropTypes.func, - contract_expiry_type: PropTypes.string, - current_focus: PropTypes.string, duration_t: PropTypes.number, duration_units_list: MobxPropTypes.arrayOrObservableArray, expiry_date: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), @@ -142,15 +143,8 @@ AdvancedDuration.propTypes = { onChange: PropTypes.func, onChangeUiStore: PropTypes.func, server_time: PropTypes.object, - setCurrentFocus: PropTypes.func, shared_input_props: PropTypes.object, start_date: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - validation_errors: PropTypes.object, }; -export default connect(({ modules, ui }) => ({ - contract_expiry_type: modules.trade.contract_expiry_type, - current_focus: ui.current_focus, - setCurrentFocus: ui.setCurrentFocus, - validation_errors: modules.trade.validation_errors, -}))(AdvancedDuration); +export default AdvancedDuration; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-mobile.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-mobile.jsx index 336b3a22ef8b..d6622b27a3ad 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-mobile.jsx @@ -3,7 +3,8 @@ import { Tabs, TickPicker, Numpad, RelativeDatepicker } from '@deriv/components' import { isEmptyObject, addComma, getDurationMinMaxValues } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; const submit_label = localize('OK'); @@ -25,328 +26,312 @@ const updateAmountChanges = (obj, stake_value, payout_value, basis, trade_basis, } }; -const Ticks = ({ - setDurationError, - basis_option, - toggleModal, - onChangeMultiple, - duration_min_max, - has_amount_error, - trade_duration, - trade_basis, - trade_amount, - trade_duration_unit, - payout_value, - stake_value, - selected_duration, - setSelectedDuration, -}) => { - React.useEffect(() => { - setDurationError(false); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); +const Ticks = observer( + ({ + setDurationError, + basis_option, + toggleModal, + has_amount_error, + payout_value, + stake_value, + selected_duration, + setSelectedDuration, + }) => { + const { + duration_min_max, + duration: trade_duration, + duration_unit: trade_duration_unit, + basis: trade_basis, + amount: trade_amount, + onChangeMultiple, + } = useTraderStore(); + React.useEffect(() => { + setDurationError(false); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); - const [min_tick, max_tick] = getDurationMinMaxValues(duration_min_max, 'tick', 't'); + const [min_tick, max_tick] = getDurationMinMaxValues(duration_min_max, 'tick', 't'); - const setTickDuration = value => { - const { value: duration } = value.target; - const on_change_obj = {}; + const setTickDuration = value => { + const { value: duration } = value.target; + const on_change_obj = {}; - // check for any amount changes from Amount trade params tab before submitting onChange object - if (!has_amount_error) - updateAmountChanges(on_change_obj, stake_value, payout_value, basis_option, trade_basis, trade_amount); + // check for any amount changes from Amount trade params tab before submitting onChange object + if (!has_amount_error) + updateAmountChanges(on_change_obj, stake_value, payout_value, basis_option, trade_basis, trade_amount); - if (trade_duration !== duration || trade_duration_unit !== 't') { - on_change_obj.duration_unit = 't'; - on_change_obj.duration = duration; - } + if (trade_duration !== duration || trade_duration_unit !== 't') { + on_change_obj.duration_unit = 't'; + on_change_obj.duration = duration; + } - if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); - toggleModal(); - }; + if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); + toggleModal(); + }; - const onTickChange = tick => setSelectedDuration('t', tick); - const tick_duration = trade_duration < min_tick && selected_duration < min_tick ? min_tick : selected_duration; - return ( -
- -
- ); -}; - -const TicksWrapper = connect(({ modules }) => ({ - duration_min_max: modules.trade.duration_min_max, - onChangeMultiple: modules.trade.onChangeMultiple, - trade_basis: modules.trade.basis, - trade_amount: modules.trade.amount, - trade_duration: modules.trade.duration, - trade_duration_unit: modules.trade.duration_unit, -}))(Ticks); - -const Numbers = ({ - addToast, - setDurationError, - basis_option, - toggleModal, - onChangeMultiple, - duration_min_max, - duration_unit_option, - has_amount_error, - contract_expiry = 'intraday', - payout_value, - stake_value, - trade_amount, - trade_basis, - trade_duration_unit, - trade_duration, - selected_duration, - setSelectedDuration, -}) => { - const { value: duration_unit } = duration_unit_option; - const [min, max] = getDurationMinMaxValues(duration_min_max, contract_expiry, duration_unit); - - const validateDuration = value => { - const localized_message = ( - + const onTickChange = tick => setSelectedDuration('t', tick); + const tick_duration = trade_duration < min_tick && selected_duration < min_tick ? min_tick : selected_duration; + return ( +
+ +
); - if (parseInt(value) < min || parseInt(selected_duration) > max) { - addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); - setDurationError(true); - return 'error'; - } else if (parseInt(value) > max) { - addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); - return 'error'; - } else if (value.toString().length < 1) { - addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); - setDurationError(true); - return false; - } + } +); - setDurationError(false); - return true; - }; +const Numbers = observer( + ({ + setDurationError, + basis_option, + toggleModal, + duration_unit_option, + has_amount_error, + contract_expiry = 'intraday', + payout_value, + stake_value, + selected_duration, + setSelectedDuration, + }) => { + const { ui } = useStore(); + const { addToast } = ui; + const { + duration_min_max, + duration: trade_duration, + duration_unit: trade_duration_unit, + basis: trade_basis, + amount: trade_amount, + onChangeMultiple, + } = useTraderStore(); + const { value: duration_unit } = duration_unit_option; + const [min, max] = getDurationMinMaxValues(duration_min_max, contract_expiry, duration_unit); - const setDuration = duration => { - const on_change_obj = {}; + const validateDuration = value => { + const localized_message = ( + + ); + if (parseInt(value) < min || parseInt(selected_duration) > max) { + addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); + setDurationError(true); + return 'error'; + } else if (parseInt(value) > max) { + addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); + return 'error'; + } else if (value.toString().length < 1) { + addToast({ key: 'duration_error', content: localized_message, type: 'error', timeout: 2000 }); + setDurationError(true); + return false; + } - // check for any amount changes from Amount trade params tab before submitting onChange object - if (!has_amount_error) - updateAmountChanges(on_change_obj, stake_value, payout_value, basis_option, trade_basis, trade_amount); + setDurationError(false); + return true; + }; - if (trade_duration !== duration || trade_duration_unit !== duration_unit) { - on_change_obj.duration_unit = duration_unit; - on_change_obj.duration = duration; - on_change_obj.expiry_type = 'duration'; - } + const setDuration = duration => { + const on_change_obj = {}; - if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); - toggleModal(); - }; + // check for any amount changes from Amount trade params tab before submitting onChange object + if (!has_amount_error) + updateAmountChanges(on_change_obj, stake_value, payout_value, basis_option, trade_basis, trade_amount); - const onNumberChange = num => { - setSelectedDuration(duration_unit, num); - validateDuration(num); - }; + if (trade_duration !== duration || trade_duration_unit !== duration_unit) { + on_change_obj.duration_unit = duration_unit; + on_change_obj.duration = duration; + on_change_obj.expiry_type = 'duration'; + } - return ( -
- { - return
{v}
; - }} - pip_size={0} - submit_label={submit_label} - min={min} - max={max} - reset_press_interval={350} - reset_value='' - onValidate={validateDuration} - onValueChange={onNumberChange} - /> -
- ); -}; + if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); + toggleModal(); + }; -const NumpadWrapper = connect(({ modules, ui }) => ({ - duration_min_max: modules.trade.duration_min_max, - trade_duration: modules.trade.duration, - trade_duration_unit: modules.trade.duration_unit, - trade_basis: modules.trade.basis, - trade_amount: modules.trade.amount, - onChangeMultiple: modules.trade.onChangeMultiple, - addToast: ui.addToast, -}))(Numbers); + const onNumberChange = num => { + setSelectedDuration(duration_unit, num); + validateDuration(num); + }; -const Duration = ({ - amount_tab_idx, - toggleModal, - duration_units_list, - duration_unit, - duration_tab_idx, - duration_min_max, - has_amount_error, - setDurationTabIdx, - setDurationError, - t_duration, - s_duration, - m_duration, - h_duration, - d_duration, - setSelectedDuration, - trade_basis, - stake_value, - payout_value, -}) => { - const duration_values = { + return ( +
+ { + return
{v}
; + }} + pip_size={0} + submit_label={submit_label} + min={min} + max={max} + reset_press_interval={350} + reset_value='' + onValidate={validateDuration} + onValueChange={onNumberChange} + /> +
+ ); + } +); + +const Duration = observer( + ({ + amount_tab_idx, + toggleModal, + duration_tab_idx, + has_amount_error, + setDurationTabIdx, + setDurationError, t_duration, s_duration, m_duration, h_duration, d_duration, - }; - const has_selected_tab_idx = typeof duration_tab_idx !== 'undefined'; - const active_index = has_selected_tab_idx - ? duration_tab_idx - : duration_units_list.findIndex(d => d.value === duration_unit); - const [min, max] = getDurationMinMaxValues(duration_min_max, 'daily', 'd'); - const handleRelativeChange = date => { - setSelectedDuration('d', date); - }; - const selected_basis_option = () => { - if (amount_tab_idx === 0) { - return 'stake'; - } else if (amount_tab_idx === 1) { - return 'payout'; - } - return trade_basis; - }; + setSelectedDuration, + stake_value, + payout_value, + }) => { + const { duration_units_list, duration_min_max, duration_unit, basis: trade_basis } = useTraderStore(); + const duration_values = { + t_duration, + s_duration, + m_duration, + h_duration, + d_duration, + }; + const has_selected_tab_idx = typeof duration_tab_idx !== 'undefined'; + const active_index = has_selected_tab_idx + ? duration_tab_idx + : duration_units_list.findIndex(d => d.value === duration_unit); + const [min, max] = getDurationMinMaxValues(duration_min_max, 'daily', 'd'); + const handleRelativeChange = date => { + setSelectedDuration('d', date); + }; + const selected_basis_option = () => { + if (amount_tab_idx === 0) { + return 'stake'; + } else if (amount_tab_idx === 1) { + return 'payout'; + } + return trade_basis; + }; - const onTabChange = index => { - setDurationTabIdx(index); - const { value: unit } = duration_units_list[index]; - setSelectedDuration(unit, duration_values[`${unit}_duration`]); - }; + const onTabChange = index => { + setDurationTabIdx(index); + const { value: unit } = duration_units_list[index]; + setSelectedDuration(unit, duration_values[`${unit}_duration`]); + }; - return ( -
- onTabChange(num)} single_tab_has_no_label top> - {duration_units_list.map(duration_unit_option => { - switch (duration_unit_option.value) { - case 't': - return ( -
- -
- ); - case 's': - return ( -
- -
- ); - case 'm': - return ( -
- -
- ); - case 'h': - return ( -
- -
- ); - case 'd': - return ( -
- - -
- ); - default: - return null; - } - })} -
-
- ); -}; + return ( +
+ onTabChange(num)} single_tab_has_no_label top> + {duration_units_list.map(duration_unit_option => { + switch (duration_unit_option.value) { + case 't': + return ( +
+ +
+ ); + case 's': + return ( +
+ +
+ ); + case 'm': + return ( +
+ +
+ ); + case 'h': + return ( +
+ +
+ ); + case 'd': + return ( +
+ + +
+ ); + default: + return null; + } + })} +
+
+ ); + } +); -export default connect(({ modules }) => ({ - duration_units_list: modules.trade.duration_units_list, - duration_min_max: modules.trade.duration_min_max, - duration_unit: modules.trade.duration_unit, - trade_basis: modules.trade.basis, -}))(Duration); +export default Duration; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-wrapper.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-wrapper.jsx index b5191bc16ab0..ad6230c1b972 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-wrapper.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/duration-wrapper.jsx @@ -1,27 +1,60 @@ import PropTypes from 'prop-types'; import React from 'react'; import { PropTypes as MobxPropTypes } from 'mobx-react'; -import { connect } from 'Stores/connect'; import { getDurationMinMaxValues } from '@deriv/shared'; import Duration from './duration.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const DurationWrapper = props => { +const DurationWrapper = observer(() => { + const { ui } = useStore(); const { - advanced_duration_unit, advanced_expiry_type, + advanced_duration_unit, + getDurationFromUnit, + is_advanced_duration, + onChangeUiStore, + simple_duration_unit, + duration_t, + } = ui; + const { + contract_expiry_type, + contract_type, duration, duration_unit, + duration_units_list, + duration_min_max, expiry_type, + expiry_date, + expiry_time, + start_date, + market_open_times, + onChange, + onChangeMultiple, + } = useTraderStore(); + + const duration_props = { + advanced_expiry_type, + advanced_duration_unit, getDurationFromUnit, is_advanced_duration, - onChange, onChangeUiStore, simple_duration_unit, contract_expiry_type, - duration_min_max, + duration, + duration_unit, + duration_t, duration_units_list, + duration_min_max, + expiry_type, + expiry_date, + expiry_time, + start_date, + market_open_times, + onChange, onChangeMultiple, - } = props; + contract_type, + }; const hasDurationUnit = (duration_type, is_advanced) => { let duration_list = [...duration_units_list]; @@ -155,58 +188,23 @@ const DurationWrapper = props => { setDurationUnit(); } - return ; -}; + return ( + + ); +}); DurationWrapper.propTypes = { - advanced_duration_unit: PropTypes.string, - advanced_expiry_type: PropTypes.string, - contract_expiry_type: PropTypes.string, - duration: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), duration_d: PropTypes.number, duration_h: PropTypes.number, duration_m: PropTypes.number, - duration_min_max: PropTypes.object, duration_s: PropTypes.number, - duration_t: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), duration_unit: PropTypes.string, duration_units_list: MobxPropTypes.arrayOrObservableArray, - expiry_date: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - expiry_time: PropTypes.string, - expiry_type: PropTypes.string, getDurationFromUnit: PropTypes.func, - is_advanced_duration: PropTypes.bool, is_minimized: PropTypes.bool, - market_open_times: PropTypes.array, - onChange: PropTypes.func, - onChangeMultiple: PropTypes.func, - onChangeUiStore: PropTypes.func, sessions: MobxPropTypes.arrayOrObservableArray, - simple_duration_unit: PropTypes.string, - start_date: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), start_time: PropTypes.string, symbol: PropTypes.string, }; -export default connect(({ modules, ui }) => ({ - advanced_duration_unit: ui.advanced_duration_unit, - advanced_expiry_type: ui.advanced_expiry_type, - contract_type: modules.trade.contract_type, - contract_expiry_type: modules.trade.contract_expiry_type, - duration: modules.trade.duration, - duration_unit: modules.trade.duration_unit, - duration_units_list: modules.trade.duration_units_list, - duration_min_max: modules.trade.duration_min_max, - duration_t: ui.duration_t, - expiry_date: modules.trade.expiry_date, - expiry_time: modules.trade.expiry_time, - expiry_type: modules.trade.expiry_type, - getDurationFromUnit: ui.getDurationFromUnit, - is_advanced_duration: ui.is_advanced_duration, - onChange: modules.trade.onChange, - onChangeUiStore: ui.onChangeUiStore, - onChangeMultiple: modules.trade.onChangeMultiple, - simple_duration_unit: ui.simple_duration_unit, - start_date: modules.trade.start_date, - market_open_times: modules.trade.market_open_times, -}))(DurationWrapper); +export default DurationWrapper; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/simple-duration.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/simple-duration.jsx index 4c1827ecf0ad..813c364c942e 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/simple-duration.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Duration/simple-duration.jsx @@ -3,84 +3,75 @@ import PropTypes from 'prop-types'; import React from 'react'; import { ButtonToggle, InputField } from '@deriv/components'; import RangeSlider from 'App/Components/Form/RangeSlider'; -import { connect } from 'Stores/connect'; import TradingDatePicker from '../../DatePicker'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const SimpleDuration = ({ - contract_expiry_type, - changeDurationUnit, - current_focus, - duration_t, - duration_units_list, - getDurationFromUnit, - number_input_props, - shared_input_props, - simple_duration_unit, - validation_errors, - setCurrentFocus, -}) => { - const filterMinutesAndTicks = arr => { - const filtered_arr = arr.filter(du => du.value === 't' || du.value === 'm'); - if (filtered_arr.length <= 1) return []; +const SimpleDuration = observer( + ({ + changeDurationUnit, + duration_t, + duration_units_list, + getDurationFromUnit, + number_input_props, + shared_input_props, + }) => { + const { ui } = useStore(); + const { current_focus, setCurrentFocus, simple_duration_unit } = ui; + const { contract_expiry_type, validation_errors } = useTraderStore(); - return filtered_arr; - }; - const has_label = !duration_units_list.some(du => du.value === 't'); + const filterMinutesAndTicks = arr => { + const filtered_arr = arr.filter(du => du.value === 't' || du.value === 'm'); + if (filtered_arr.length <= 1) return []; - return ( - <> - {duration_units_list.length > 1 && ( - - )} - {simple_duration_unit === 't' && contract_expiry_type === 'tick' && ( - - )} - {simple_duration_unit === 'd' && ( - - )} - {simple_duration_unit !== 't' && simple_duration_unit !== 'd' && ( - - )} - - ); -}; + return filtered_arr; + }; + const has_label = !duration_units_list.some(du => du.value === 't'); + + return ( + <> + {duration_units_list.length > 1 && ( + + )} + {simple_duration_unit === 't' && contract_expiry_type === 'tick' && ( + + )} + {simple_duration_unit === 'd' && ( + + )} + {simple_duration_unit !== 't' && simple_duration_unit !== 'd' && ( + + )} + + ); + } +); SimpleDuration.propTypes = { changeDurationUnit: PropTypes.func, - contract_expiry_type: PropTypes.string, - current_focus: PropTypes.string, duration_t: PropTypes.number, duration_units_list: MobxPropTypes.arrayOrObservableArray, getDurationFromUnit: PropTypes.func, number_input_props: PropTypes.object, - setCurrentFocus: PropTypes.func, shared_input_props: PropTypes.object, - simple_duration_unit: PropTypes.string, - validation_errors: PropTypes.object, }; -export default connect(({ modules, ui }) => ({ - contract_expiry_type: modules.trade.contract_expiry_type, - current_focus: ui.current_focus, - setCurrentFocus: ui.setCurrentFocus, - simple_duration_unit: ui.simple_duration_unit, - validation_errors: modules.trade.validation_errors, -}))(SimpleDuration); +export default SimpleDuration; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal.jsx index a9d32d7821c3..0a75e6a38fa8 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/cancel-deal.jsx @@ -1,21 +1,24 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { Checkbox, Dropdown, Popover, PopoverMessageCheckbox } from '@deriv/components'; import { localize } from '@deriv/translations'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; import { onToggleCancellation, onChangeCancellationDuration } from 'Stores/Modules/Trading/Helpers/multiplier'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const CancelDeal = observer(() => { + const { ui } = useStore(); + const { + cancellation_range_list, + cancellation_duration, + has_cancellation, + has_stop_loss, + has_take_profit, + onChangeMultiple, + } = useTraderStore(); + + const { should_show_cancellation_warning, toggleCancellationWarning } = ui; -const CancelDeal = ({ - cancellation_range_list, - cancellation_duration, - has_cancellation, - has_take_profit, - has_stop_loss, - onChangeMultiple, - should_show_cancellation_warning, - toggleCancellationWarning, -}) => { const should_show_popover = (has_take_profit || has_stop_loss) && should_show_cancellation_warning; const [is_do_not_show_selected, setDoNotShowSelected] = React.useState(!should_show_cancellation_warning); @@ -95,26 +98,6 @@ const CancelDeal = ({ )} ); -}; - -CancelDeal.propTypes = { - cancellation_range_list: PropTypes.array, - cancellation_duration: PropTypes.string, - has_cancellation: PropTypes.bool, - has_stop_loss: PropTypes.bool, - has_take_profit: PropTypes.bool, - onChangeMultiple: PropTypes.func, - should_show_cancellation_warning: PropTypes.bool, - toggleCancellationWarning: PropTypes.func, -}; +}); -export default connect(({ modules, ui }) => ({ - cancellation_range_list: modules.trade.cancellation_range_list, - cancellation_duration: modules.trade.cancellation_duration, - has_cancellation: modules.trade.has_cancellation, - has_stop_loss: modules.trade.has_stop_loss, - has_take_profit: modules.trade.has_take_profit, - onChangeMultiple: modules.trade.onChangeMultiple, - should_show_cancellation_warning: ui.should_show_cancellation_warning, - toggleCancellationWarning: ui.toggleCancellationWarning, -}))(CancelDeal); +export default CancelDeal; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration-modal.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration-modal.jsx index 9cb0a7e1504a..5885416e322a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration-modal.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration-modal.jsx @@ -1,10 +1,13 @@ import React from 'react'; +import PropTypes from 'prop-types'; import { Button, Div100vhContainer, Modal, Text } from '@deriv/components'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import Expiration from './expiration.jsx'; +import { observer, useStore } from '@deriv/stores'; -const MultipliersExpirationModal = ({ is_open, enableApp, disableApp, toggleModal }) => { +const MultipliersExpirationModal = observer(({ is_open, toggleModal }) => { + const { ui } = useStore(); + const { enableApp, disableApp } = ui; return ( ); +}); + +MultipliersExpirationModal.propTypes = { + is_open: PropTypes.bool, + toggleModal: PropTypes.func, }; -export default connect(({ ui }) => ({ - enableApp: ui.enableApp, - disableApp: ui.disableApp, -}))(MultipliersExpirationModal); +export default MultipliersExpirationModal; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx index 33073f42c1cb..e308b241eede 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx @@ -4,9 +4,13 @@ import { localize } from '@deriv/translations'; import { formatDuration, getDiffDuration, getDateFromNow } from '@deriv/shared'; import { Text } from '@deriv/components'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const Expiration = ({ expiration, start_time, is_text_only, text_size }) => { +const Expiration = observer(({ is_text_only, text_size }) => { + const { expiration } = useTraderStore(); + const { common } = useStore(); + const { server_time: start_time } = common; const { days, timestamp } = formatDuration(getDiffDuration(start_time.unix(), expiration), 'HH:mm'); const date = getDateFromNow(days, 'day', 'DD MMM YYYY'); @@ -49,16 +53,11 @@ const Expiration = ({ expiration, start_time, is_text_only, text_size }) => {
); -}; +}); Expiration.propTypes = { - expiration: PropTypes.number, is_text_only: PropTypes.bool, - start_time: PropTypes.number, text_size: PropTypes.string, }; -export default connect(({ modules, common }) => ({ - expiration: modules.trade.expiration, - start_time: common.server_time, -}))(Expiration); +export default Expiration; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx index 0c9118857257..3042c960b29c 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx @@ -3,134 +3,119 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Popover, Money, Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; const commission_tooltip_margin = 30; const stop_out_tooltip_margin = 160; -const MultipliersInfo = ({ - amount = 0, - commission = 0, - className, - commission_text_size, - stop_out_text_size, - currency, - multiplier = 0, - has_stop_loss, - is_tooltip_relative, - should_show_tooltip, - stop_out = 0, -}) => { - const commission_text = ( - +const MultipliersInfo = observer( + ({ className, commission_text_size, stop_out_text_size, is_tooltip_relative, should_show_tooltip, ...props }) => { + const trade = useTraderStore(); + const { currency, has_stop_loss } = trade; + const multiplier = props.multiplier ?? (trade.multiplier || 0); + const amount = props.amount ?? (trade.amount || 0); + const commission = props.commission ?? (trade.commission || 0); + const stop_out = props.stop_out ?? (trade.stop_out || 0); + + const commission_text = ( + + ]} + /> + + ); + + const stop_out_text = ( + + ]} + /> + + ); + + const commission_tooltip = ( ]} + i18n_default_text='<0>{{commission_percentage}}% of (<1/> * {{multiplier}})' + values={{ + commission_percentage: Number((commission * 100) / (multiplier * amount)).toFixed(4), + multiplier, + }} + components={[ + , + , + ]} /> - - ); + ); - const stop_out_text = ( - + const stop_out_tooltip = ( ]} + i18n_default_text='When your current loss equals or exceeds {{stop_out_percentage}}% of your stake, your contract will be closed at the nearest available asset price.' + values={{ + stop_out_percentage: Math.floor(Math.abs(Number((stop_out * 100) / amount))), + }} /> - - ); - - const commission_tooltip = ( - , - , - ]} - /> - ); + ); - const stop_out_tooltip = ( - - ); + const getInfo = ({ text, message, margin }) => { + return should_show_tooltip ? ( + + {text} + + ) : ( + text + ); + }; - const getInfo = ({ text, message, margin }) => { - return should_show_tooltip ? ( - - {text} - - ) : ( - text - ); - }; - - return ( -
- {getInfo({ - text: commission_text, - message: commission_tooltip, - margin: commission_tooltip_margin, - })} - {!has_stop_loss && - getInfo({ - text: stop_out_text, - message: stop_out_tooltip, - margin: stop_out_tooltip_margin, + {getInfo({ + text: commission_text, + message: commission_tooltip, + margin: commission_tooltip_margin, })} -
- ); -}; + {!has_stop_loss && + getInfo({ + text: stop_out_text, + message: stop_out_tooltip, + margin: stop_out_tooltip_margin, + })} +
+ ); + } +); MultipliersInfo.propTypes = { - amount: PropTypes.number, className: PropTypes.string, - commission: PropTypes.number, commission_text_size: PropTypes.string, - currency: PropTypes.string, - has_stop_loss: PropTypes.bool, is_tooltip_relative: PropTypes.bool, - multiplier: PropTypes.number, should_show_tooltip: PropTypes.bool, - stop_out: PropTypes.number, stop_out_text_size: PropTypes.string, }; -export default connect(({ modules }, props) => ({ - amount: props.amount ?? modules.trade.amount, - commission: props.commission ?? modules.trade.commission, - currency: modules.trade.currency, - has_stop_loss: modules.trade.has_stop_loss, - multiplier: modules.trade.multiplier, - stop_out: props.stop_out ?? modules.trade.stop_out, -}))(MultipliersInfo); +export default MultipliersInfo; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/multiplier.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/multiplier.jsx index b6a38c53d9f2..2a41a0a088c0 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/multiplier.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/multiplier.jsx @@ -1,10 +1,10 @@ -import { PropTypes as MobxPropTypes } from 'mobx-react'; -import PropTypes from 'prop-types'; import React from 'react'; import { Dropdown } from '@deriv/components'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer } from '@deriv/stores'; -const Multiplier = ({ multiplier, multiplier_range_list, onChange }) => { +const Multiplier = observer(() => { + const { multiplier, multiplier_range_list, onChange } = useTraderStore(); return ( { onChange={onChange} /> ); -}; +}); -Multiplier.propTypes = { - multiplier: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - multiplier_range_list: MobxPropTypes.arrayOrObservableArray, - onChange: PropTypes.func, -}; - -export default connect(({ modules }) => ({ - multiplier: modules.trade.multiplier, - multiplier_range_list: modules.trade.multiplier_range_list, - onChange: modules.trade.onChange, -}))(Multiplier); +export default Multiplier; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx index d14cc6d826bc..359885d07488 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx @@ -1,25 +1,25 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { InputWithCheckbox } from '@deriv/components'; import { localize } from '@deriv/translations'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; import { isDesktop } from '@deriv/shared'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const StopLoss = observer(props => { + const { ui, client } = useStore(); + const trade = useTraderStore(); + + const { addToast, removeToast, current_focus, setCurrentFocus } = ui; + const { is_single_currency } = client; + const { amount, currency } = trade; + + const validation_errors = props.validation_errors ?? trade.validation_errors; + const stop_loss = props.stop_loss ?? trade.stop_loss; + const has_stop_loss = props.has_stop_loss ?? trade.has_stop_loss; + const onChangeMultiple = props.onChangeMultiple ?? trade.onChangeMultiple; + const onChange = props.onChange ?? trade.onChange; -const StopLoss = ({ - addToast, - removeToast, - amount, - currency, - current_focus, - has_stop_loss, - is_single_currency, - onChange, - onChangeMultiple, - setCurrentFocus, - stop_loss, - validation_errors, -}) => { const changeValue = e => { if (e.target.name === 'has_stop_loss') { const new_val = e.target.value; @@ -61,35 +61,6 @@ const StopLoss = ({ /> ); -}; - -StopLoss.propTypes = { - addToast: PropTypes.func, - amount: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - currency: PropTypes.string, - current_focus: PropTypes.string, - has_stop_loss: PropTypes.bool, - is_single_currency: PropTypes.bool, - onChange: PropTypes.func, - onChangeMultiple: PropTypes.func, - removeToast: PropTypes.func, - setCurrentFocus: PropTypes.func, - stop_loss: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - validation_errors: PropTypes.object, -}; +}); -export default connect(({ modules, client, ui }, props) => ({ - addToast: ui.addToast, - amount: modules.trade.amount, - currency: modules.trade.currency, - current_focus: ui.current_focus, - has_cancellation: props.has_cancellation ?? modules.trade.has_cancellation, - has_stop_loss: props.has_stop_loss ?? modules.trade.has_stop_loss, - is_single_currency: client.is_single_currency, - onChange: props.onChange ?? modules.trade.onChange, - onChangeMultiple: props.onChangeMultiple ?? modules.trade.onChangeMultiple, - setCurrentFocus: ui.setCurrentFocus, - removeToast: ui.removeToast, - stop_loss: props.stop_loss ?? modules.trade.stop_loss, - validation_errors: props.validation_errors ?? modules.trade.validation_errors, -}))(StopLoss); +export default StopLoss; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx index 092519cbbe93..74b8c86d8979 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx @@ -1,26 +1,26 @@ -import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; import { InputWithCheckbox } from '@deriv/components'; import { localize } from '@deriv/translations'; import { isDesktop } from '@deriv/shared'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const TakeProfit = observer(props => { + const { ui, client } = useStore(); + const trade = useTraderStore(); + + const { addToast, removeToast, current_focus, setCurrentFocus } = ui; + const { is_single_currency } = client; + const { is_accumulator, currency } = trade; + + const validation_errors = props.validation_errors ?? trade.validation_errors; + const take_profit = props.take_profit ?? trade.take_profit; + const has_take_profit = props.has_take_profit ?? trade.has_take_profit; + const onChangeMultiple = props.onChangeMultiple ?? trade.onChangeMultiple; + const onChange = props.onChange ?? trade.onChange; -const TakeProfit = ({ - addToast, - removeToast, - currency, - current_focus, - has_take_profit, - is_accumulator, - is_single_currency, - onChange, - onChangeMultiple, - setCurrentFocus, - take_profit, - validation_errors, -}) => { const changeValue = e => { if (e.target.name === 'has_take_profit') { const new_val = e.target.value; @@ -63,35 +63,6 @@ const TakeProfit = ({ /> ); -}; - -TakeProfit.propTypes = { - addToast: PropTypes.func, - currency: PropTypes.string, - current_focus: PropTypes.string, - has_info: PropTypes.bool, - has_take_profit: PropTypes.bool, - is_accumulator: PropTypes.bool, - is_single_currency: PropTypes.bool, - onChange: PropTypes.func, - onChangeMultiple: PropTypes.func, - removeToast: PropTypes.func, - setCurrentFocus: PropTypes.func, - take_profit: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - validation_errors: PropTypes.object, -}; +}); -export default connect(({ modules, client, ui }, props) => ({ - addToast: ui.addToast, - currency: modules.trade.currency, - current_focus: ui.current_focus, - has_take_profit: props.has_take_profit ?? modules.trade.has_take_profit, - is_accumulator: modules.trade.is_accumulator, - is_single_currency: client.is_single_currency, - onChange: props.onChange ?? modules.trade.onChange, - onChangeMultiple: props.onChangeMultiple ?? modules.trade.onChangeMultiple, - removeToast: ui.removeToast, - setCurrentFocus: ui.setCurrentFocus, - take_profit: props.take_profit ?? modules.trade.take_profit, - validation_errors: props.validation_errors ?? modules.trade.validation_errors, -}))(TakeProfit); +export default TakeProfit; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx index 2b2bc8e22060..3d73bfdb0205 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx @@ -1,6 +1,7 @@ import React from 'react'; import { Money, Text } from '@deriv/components'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer } from '@deriv/stores'; import MultiplierAmountModal from 'Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx'; import RadioGroupOptionsModal from 'Modules/Trading/Containers/radio-group-options-modal.jsx'; import MultipliersExpiration from 'Modules/Trading/Components/Form/TradeParams/Multiplier/expiration.jsx'; @@ -54,13 +55,17 @@ const AmountWidget = ({ amount, currency, expiration, is_crypto_multiplier }) => ); }; -export const MultiplierAmountWidget = connect(({ modules }) => ({ - amount: modules.trade.amount, - expiration: modules.trade.expiration, - currency: modules.trade.currency, - is_crypto_multiplier: modules.trade.is_crypto_multiplier, - multiplier: modules.trade.multiplier, -}))(AmountWidget); +export const MultiplierAmountWidget = observer(() => { + const { amount, expiration, currency, is_crypto_multiplier, multiplier } = useTraderStore(); + const amount_widget_props = { + amount, + expiration, + currency, + is_crypto_multiplier, + multiplier, + }; + return ; +}); const RadioGroupOptionsWidget = ({ displayed_trade_param, modal_title }) => { const [is_open, setIsOpen] = React.useState(false); @@ -81,12 +86,16 @@ const RadioGroupOptionsWidget = ({ displayed_trade_param, modal_title }) => { ); }; -export const MultiplierOptionsWidget = connect(({ modules }) => ({ - displayed_trade_param: `x${modules.trade.multiplier}`, - modal_title: localize('Multiplier'), -}))(RadioGroupOptionsWidget); +export const MultiplierOptionsWidget = observer(() => { + const { multiplier } = useTraderStore(); + const displayed_trade_param = `x${multiplier}`; + const modal_title = localize('Multiplier'); + return ; +}); -export const AccumulatorOptionsWidget = connect(({ modules }) => ({ - displayed_trade_param: `${getGrowthRatePercentage(modules.trade.growth_rate)}%`, - modal_title: localize('Accumulate'), -}))(RadioGroupOptionsWidget); +export const AccumulatorOptionsWidget = observer(() => { + const { growth_rate } = useTraderStore(); + const displayed_trade_param = `${getGrowthRatePercentage(growth_rate)}%`; + const modal_title = localize('Accumulate'); + return ; +}); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx index bfc405638c10..d588f1377351 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx @@ -4,206 +4,202 @@ import { getDecimalPlaces, isEmptyObject } from '@deriv/shared'; import React from 'react'; import classNames from 'classnames'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const Basis = ({ - addToast, - duration_unit, - duration_value, - toggleModal, - basis, - has_duration_error, - selected_basis, - setSelectedAmount, - onChangeMultiple, - currency, - trade_amount, - trade_basis, - trade_duration, - trade_duration_unit, - setAmountError, - contract_type, - stake_boundary, - vanilla_trade_type, -}) => { - const user_currency_decimal_places = getDecimalPlaces(currency); - const onNumberChange = num => { - setSelectedAmount(basis, num); - validateAmount(num); - }; - const formatAmount = value => - !isNaN(value) && value !== '' ? Number(value).toFixed(user_currency_decimal_places) : value; - const setBasisAndAmount = amount => { - const on_change_obj = {}; +const Basis = observer( + ({ + basis, + duration_unit, + duration_value, + toggleModal, + has_duration_error, + selected_basis, + setSelectedAmount, + setAmountError, + }) => { + const { ui, client } = useStore(); + const { addToast, vanilla_trade_type } = ui; + const { currency } = client; + const { + onChangeMultiple, + trade_amount, + trade_basis, + trade_duration_unit, + trade_duration, + contract_type, + stake_boundary, + } = useTraderStore(); + const user_currency_decimal_places = getDecimalPlaces(currency); + const onNumberChange = num => { + setSelectedAmount(basis, num); + validateAmount(num); + }; + const formatAmount = value => + !isNaN(value) && value !== '' ? Number(value).toFixed(user_currency_decimal_places) : value; + const setBasisAndAmount = amount => { + const on_change_obj = {}; - // Check for any duration changes in Duration trade params Tab before sending onChange object - if (duration_unit !== trade_duration_unit && !has_duration_error) on_change_obj.duration_unit = duration_unit; - if (duration_value !== trade_duration && !has_duration_error) on_change_obj.duration = duration_value; + // Check for any duration changes in Duration trade params Tab before sending onChange object + if (duration_unit !== trade_duration_unit && !has_duration_error) + on_change_obj.duration_unit = duration_unit; + if (duration_value !== trade_duration && !has_duration_error) on_change_obj.duration = duration_value; - if (amount !== trade_amount || basis !== trade_basis) { - on_change_obj.basis = basis; - on_change_obj.amount = amount; - } + if (amount !== trade_amount || basis !== trade_basis) { + on_change_obj.basis = basis; + on_change_obj.amount = amount; + } - if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); - toggleModal(); - }; - const zero_decimals = Number('0').toFixed(getDecimalPlaces(currency)); - const min_amount = parseFloat(zero_decimals.toString().replace(/.$/, '1')); + if (!isEmptyObject(on_change_obj)) onChangeMultiple(on_change_obj); + toggleModal(); + }; + const zero_decimals = Number('0').toFixed(getDecimalPlaces(currency)); + const min_amount = parseFloat(zero_decimals.toString().replace(/.$/, '1')); - const validateAmount = value => { - const localized_message = ; - const selected_value = parseFloat(value.toString()); + const validateAmount = value => { + const localized_message = ; + const selected_value = parseFloat(value.toString()); - if (value.toString() === '0.' || selected_value === 0) { - addToast({ key: 'amount_error', content: localized_message, type: 'error', timeout: 2000 }); - setAmountError(true); - return 'error'; - } else if (isNaN(selected_value) || selected_value < min_amount || value.toString().length < 1) { - addToast({ key: 'amount_error', content: localized_message, type: 'error', timeout: 2000 }); - setAmountError(true); - return false; - } - setAmountError(false); - return true; - }; + if (value.toString() === '0.' || selected_value === 0) { + addToast({ key: 'amount_error', content: localized_message, type: 'error', timeout: 2000 }); + setAmountError(true); + return 'error'; + } else if (isNaN(selected_value) || selected_value < min_amount || value.toString().length < 1) { + addToast({ key: 'amount_error', content: localized_message, type: 'error', timeout: 2000 }); + setAmountError(true); + return false; + } + setAmountError(false); + return true; + }; - return ( -
- {contract_type === 'vanilla' && ( -
-
- {localize('Min. stake')} - - {stake_boundary[vanilla_trade_type].min_stake} {currency} - -
-
- {localize('Max. stake')} - - {stake_boundary[vanilla_trade_type].max_stake} {currency} - -
-
- )} -
- { - return ( -
- {parseFloat(v) > 0 ? : v} -
- ); - }} - reset_press_interval={450} - reset_value='' - pip_size={user_currency_decimal_places} - onValidate={validateAmount} - submit_label={localize('OK')} - onValueChange={onNumberChange} - /> + return ( +
+ {contract_type === 'vanilla' && ( +
+
+ {localize('Min. stake')} + + {stake_boundary[vanilla_trade_type].min_stake} {currency} + +
+
+ {localize('Max. stake')} + + {stake_boundary[vanilla_trade_type].max_stake} {currency} + +
+
+ )} +
+ { + return ( +
+ {parseFloat(v) > 0 ? ( + + ) : ( + v + )} +
+ ); + }} + reset_press_interval={450} + reset_value='' + pip_size={user_currency_decimal_places} + onValidate={validateAmount} + submit_label={localize('OK')} + onValueChange={onNumberChange} + /> +
-
- ); -}; + ); + } +); -const AmountWrapper = connect(({ modules, client, ui }) => ({ - onChangeMultiple: modules.trade.onChangeMultiple, - trade_amount: modules.trade.amount, - trade_basis: modules.trade.basis, - trade_duration_unit: modules.trade.duration_unit, - trade_duration: modules.trade.duration, - currency: client.currency, - addToast: ui.addToast, - contract_type: modules.trade.contract_type, - vanilla_trade_type: ui.vanilla_trade_type, - stake_boundary: modules.trade.stake_boundary, -}))(Basis); +const Amount = observer( + ({ + toggleModal, + duration_value, + duration_unit, + has_duration_error, + amount_tab_idx, + setAmountError, + setAmountTabIdx, + setSelectedAmount, + stake_value, + payout_value, + }) => { + const { basis, basis_list } = useTraderStore(); + const has_selected_tab_idx = typeof amount_tab_idx !== 'undefined'; + const active_index = has_selected_tab_idx ? amount_tab_idx : basis_list.findIndex(b => b.value === basis); -const Amount = ({ - toggleModal, - basis_list, - basis, - duration_value, - duration_unit, - has_duration_error, - amount_tab_idx, - setAmountError, - setAmountTabIdx, - setSelectedAmount, - stake_value, - payout_value, -}) => { - const has_selected_tab_idx = typeof amount_tab_idx !== 'undefined'; - const active_index = has_selected_tab_idx ? amount_tab_idx : basis_list.findIndex(b => b.value === basis); + if (basis_list.length === 1) { + return ( + + ); + } - if (basis_list.length === 1) { return ( - +
+ + {basis_list.map(basis_option => { + switch (basis_option.value) { + case 'stake': + return ( +
+ +
+ ); + case 'payout': + return ( +
+ +
+ ); + default: + return null; + } + })} +
+
); } +); - return ( -
- - {basis_list.map(basis_option => { - switch (basis_option.value) { - case 'stake': - return ( -
- -
- ); - case 'payout': - return ( -
- -
- ); - default: - return null; - } - })} -
-
- ); -}; - -export default connect(({ modules }) => ({ - basis: modules.trade.basis, - basis_list: modules.trade.basis_list, - onChangeMultiple: modules.trade.onChangeMultiple, -}))(Amount); +export default Amount; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx index d656036999c9..8432a61225e1 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/amount.jsx @@ -4,13 +4,13 @@ import { Localize, localize } from '@deriv/translations'; import AllowEquals from './allow-equals.jsx'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; import Multiplier from './Multiplier/multiplier.jsx'; import MultipliersInfo from './Multiplier/info.jsx'; import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; export const Input = ({ amount, @@ -48,31 +48,29 @@ export const Input = ({ /> ); -const Amount = ({ - amount, - basis, - basis_list, - contract_start_type, - contract_type, - contract_types_list, - currencies_list, - currency, - current_focus, - duration_unit, - expiry_type, - is_accumulator, - is_equal, - is_minimized, - is_multiplier, - is_nativepicker, - is_single_currency, - has_equals_only, - onChange, - setCurrentFocus, - validation_errors, - stake_boundary, - vanilla_trade_type, -}) => { +const Amount = observer(({ is_minimized, is_nativepicker }) => { + const { ui, client } = useStore(); + const { currencies_list, is_single_currency } = client; + const { setCurrentFocus, vanilla_trade_type, current_focus } = ui; + const { + amount, + basis, + basis_list, + contract_start_type, + contract_type, + contract_types_list, + currency, + duration_unit, + expiry_type, + is_accumulator, + is_equal, + is_multiplier, + has_equals_only, + onChange, + validation_errors, + stake_boundary, + } = useTraderStore(); + if (is_minimized) { return (
@@ -205,55 +203,11 @@ const Amount = ({ )} ); -}; +}); Amount.propTypes = { - amount: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - basis: PropTypes.string, - basis_list: MobxPropTypes.arrayOrObservableArray, - contract_start_type: PropTypes.string, - contract_type: PropTypes.string, - contract_types_list: MobxPropTypes.observableObject, - currencies_list: MobxPropTypes.observableObject, - currency: PropTypes.string, - current_focus: PropTypes.string, - duration_unit: PropTypes.string, - expiry_type: PropTypes.string, - is_accumulator: PropTypes.bool, - is_equal: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), is_minimized: PropTypes.bool, - is_multiplier: PropTypes.bool, is_nativepicker: PropTypes.bool, - is_single_currency: PropTypes.bool, - has_equals_only: PropTypes.bool, - setCurrentFocus: PropTypes.func, - onChange: PropTypes.func, - validation_errors: PropTypes.object, - stake_boundary: PropTypes.object, - vanilla_trade_type: PropTypes.object, }; -export default connect(({ modules, client, ui }) => ({ - amount: modules.trade.amount, - basis: modules.trade.basis, - basis_list: modules.trade.basis_list, - contract_start_type: modules.trade.contract_start_type, - contract_type: modules.trade.contract_type, - contract_types_list: modules.trade.contract_types_list, - currencies_list: client.currencies_list, - currency: modules.trade.currency, - current_focus: ui.current_focus, - duration_unit: modules.trade.duration_unit, - expiry_type: modules.trade.expiry_type, - is_accumulator: modules.trade.is_accumulator, - is_equal: modules.trade.is_equal, - is_single_currency: client.is_single_currency, - is_multiplier: modules.trade.is_multiplier, - has_equals_only: modules.trade.has_equals_only, - stop_out: modules.trade.stop_out, - onChange: modules.trade.onChange, - setCurrentFocus: ui.setCurrentFocus, - vanilla_trade_type: ui.vanilla_trade_type, - validation_errors: modules.trade.validation_errors, - stake_boundary: modules.trade.stake_boundary, -}))(Amount); +export default Amount; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx index 44d2756b9ee2..4855881b8b1a 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/barrier.jsx @@ -4,25 +4,25 @@ import React from 'react'; import { DesktopWrapper, Icon, InputField, MobileWrapper, Modal, Text, usePrevious } from '@deriv/components'; import Fieldset from 'App/Components/Form/fieldset.jsx'; import { ValueMovement } from '../Purchase/contract-info'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; import { localize } from '@deriv/translations'; import LabeledQuantityInputMobile from '../LabeledQuantityInputMobile'; -const Barrier = ({ - barrier_1, - barrier_2, - barrier_count, - barrier_pipsize, - current_focus, - proposal_info, - duration_unit, - is_minimized, - is_absolute_only, - onChange, - setCurrentFocus, - validation_errors, - trade_types, -}) => { +const Barrier = observer(({ is_minimized, is_absolute_only }) => { + const { ui } = useStore(); + const { current_focus, setCurrentFocus } = ui; + const { + barrier_1, + barrier_2, + barrier_count, + barrier_pipsize, + duration_unit, + onChange, + validation_errors, + proposal_info, + trade_types, + } = useTraderStore(); const [show_modal, setShowModal] = React.useState(false); const type_with_current_spot = Object.keys(trade_types).find(type => proposal_info?.[type]?.spot); const contract_info = proposal_info?.[type_with_current_spot]; @@ -217,34 +217,11 @@ const Barrier = ({ ); -}; +}); Barrier.propTypes = { - barrier_1: PropTypes.string, - barrier_2: PropTypes.string, - barrier_count: PropTypes.number, - barrier_pipsize: PropTypes.number, - current_focus: PropTypes.string, - duration_unit: PropTypes.string, is_absolute_only: PropTypes.bool, is_minimized: PropTypes.bool, - onChange: PropTypes.func, - proposal_info: PropTypes.object, - setCurrentFocus: PropTypes.func, - validation_errors: PropTypes.object, - trade_types: PropTypes.object, }; -export default connect(({ modules, ui }) => ({ - barrier_1: modules.trade.barrier_1, - barrier_2: modules.trade.barrier_2, - barrier_pipsize: modules.trade.barrier_pipsize, - barrier_count: modules.trade.barrier_count, - current_focus: ui.current_focus, - duration_unit: modules.trade.duration_unit, - onChange: modules.trade.onChange, - proposal_info: modules.trade.proposal_info, - setCurrentFocus: ui.setCurrentFocus, - validation_errors: modules.trade.validation_errors, - trade_types: modules.trade.trade_types, -}))(Barrier); +export default Barrier; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx index ee60e5e55d80..87c16bb7da3c 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/last-digit.jsx @@ -4,9 +4,11 @@ import { isDesktop } from '@deriv/shared'; import { localize } from '@deriv/translations'; import NumberSelector from 'App/Components/Form/number-selector.jsx'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const LastDigit = ({ is_minimized, last_digit, onChange }) => { +const LastDigit = observer(({ is_minimized }) => { + const { onChange, last_digit } = useTraderStore(); if (is_minimized) { return
{`${localize('Last Digit')}: ${last_digit}`}
; } @@ -25,7 +27,7 @@ const LastDigit = ({ is_minimized, last_digit, onChange }) => { /> ); -}; +}); LastDigit.propTypes = { is_minimized: PropTypes.bool, @@ -33,7 +35,4 @@ LastDigit.propTypes = { onChange: PropTypes.func, }; -export default connect(({ modules }) => ({ - last_digit: modules.trade.last_digit, - onChange: modules.trade.onChange, -}))(LastDigit); +export default LastDigit; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/strike.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/strike.jsx index f68a29c62bf4..e7a894956939 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/strike.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/strike.jsx @@ -4,23 +4,17 @@ import { DesktopWrapper, InputField, MobileWrapper, Dropdown, Text, Icon } from import { localize, Localize } from '@deriv/translations'; import { toMoment } from '@deriv/shared'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -import { connect } from 'Stores/connect'; import StrikeParamModal from 'Modules/Trading/Containers/strike-param-modal'; import './strike-field.scss'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const Strike = observer(() => { + const { ui, common } = useStore(); + const { barrier_1, onChange, validation_errors, strike_price_choices, expiry_type, expiry_date } = useTraderStore(); + const { current_focus, setCurrentFocus, advanced_duration_unit, vanilla_trade_type } = ui; + const { server_time } = common; -const Strike = ({ - barrier_1, - current_focus, - onChange, - validation_errors, - setCurrentFocus, - advanced_duration_unit, - strike_price_choices, - expiry_type, - expiry_date, - server_time, - vanilla_trade_type, -}) => { const [is_open, setIsOpen] = React.useState(false); const [should_open_dropdown, setShouldOpenDropdown] = React.useState(false); const [selected_value, setSelectedValue] = React.useState(barrier_1); @@ -36,7 +30,10 @@ const Strike = ({ const is_relative_strike_applicable = expiry_type === 'endtime' ? is_24_hours_contract : advanced_duration_unit !== 'd'; - const strike_price_list = strike_price_choices.map(strike_price => ({ text: strike_price, value: strike_price })); + const strike_price_list = strike_price_choices.map(strike_price => ({ + text: strike_price, + value: strike_price, + })); if (should_open_dropdown) { return ( @@ -151,19 +148,6 @@ const Strike = ({ ); -}; +}); -export default connect(({ modules, ui, common }) => ({ - barrier_1: modules.trade.barrier_1, - current_focus: ui.current_focus, - setCurrentFocus: ui.setCurrentFocus, - onChange: modules.trade.onChange, - validation_errors: modules.trade.validation_errors, - advanced_duration_unit: ui.advanced_duration_unit, - strike_price_choices: modules.trade.strike_price_choices, - expiry_type: modules.trade.expiry_type, - start_date: modules.trade.start_date, - expiry_date: modules.trade.expiry_date, - server_time: common.server_time, - vanilla_trade_type: ui.vanilla_trade_type, -}))(Strike); +export default Strike; diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx index 07ed81c8cbd3..d7fad2343977 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx @@ -1,9 +1,14 @@ import React from 'react'; import { ButtonToggle } from '@deriv/components'; -import { connect } from 'Stores/connect'; import Fieldset from 'App/Components/Form/fieldset.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; + +const VanillaTradeTypes = observer(() => { + const { ui } = useStore(); + const { onChange } = useTraderStore(); + const { onChangeUiStore, vanilla_trade_type } = ui; -const VanillaTradeTypes = ({ onChange, onChangeUiStore, vanilla_trade_type }) => { const changeTradeType = ({ target }) => { const { name, value } = target; @@ -26,10 +31,6 @@ const VanillaTradeTypes = ({ onChange, onChangeUiStore, vanilla_trade_type }) => /> ); -}; +}); -export default connect(({ modules, ui }) => ({ - onChange: modules.trade.onChange, - onChangeUiStore: ui.onChangeUiStore, - vanilla_trade_type: ui.vanilla_trade_type, -}))(VanillaTradeTypes); +export default VanillaTradeTypes; diff --git a/packages/trader/src/Modules/Trading/Components/Form/screen-small.jsx b/packages/trader/src/Modules/Trading/Components/Form/screen-small.jsx index fbbd2f593f37..b58e1e8f8c5f 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/screen-small.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/screen-small.jsx @@ -3,7 +3,6 @@ import React from 'react'; import { Collapsible } from '@deriv/components'; import { TradeParamsLoader } from 'App/Components/Elements/ContentLoader'; import AllowEqualsMobile from 'Modules/Trading/Containers/allow-equals.jsx'; -import { connect } from 'Stores/connect'; import { hasCallPutEqual, hasDurationForCallPutEqual, @@ -26,6 +25,8 @@ import classNames from 'classnames'; import AccumulatorsStats from 'Modules/Contract/Components/AccumulatorsStats'; import Strike from 'Modules/Trading/Components/Form/TradeParams/strike.jsx'; import VanillaTradeTypes from 'Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; const CollapsibleTradeParams = ({ form_components, @@ -84,7 +85,11 @@ const CollapsibleTradeParams = ({ )} {!is_accumulator && } - {has_allow_equals && } + {has_allow_equals && ( +
+ +
+ )} {is_multiplier && (
@@ -119,15 +124,41 @@ const CollapsibleTradeParams = ({ ); }; -const ScreenSmall = ({ - is_trade_enabled, - duration_unit, - contract_types_list, - contract_type, - expiry_type, - contract_start_type, - ...props -}) => { +const ScreenSmall = observer(({ is_trade_enabled }) => { + const trade_store = useTraderStore(); + const { + is_accumulator, + is_multiplier, + is_vanilla, + duration_unit, + contract_types_list, + contract_type, + expiry_type, + contract_start_type, + form_components, + has_take_profit, + onChange, + previous_symbol, + is_trade_params_expanded, + setIsTradeParamsExpanded, + take_profit, + } = trade_store; + const is_allow_equal = !!trade_store.is_equal; + + const collapsible_trade_params_props = { + is_accumulator, + is_multiplier, + is_vanilla, + form_components, + has_take_profit, + onChange, + previous_symbol, + is_trade_params_expanded, + setIsTradeParamsExpanded, + take_profit, + is_allow_equal, + }; + const has_callputequal_duration = hasDurationForCallPutEqual( contract_types_list, duration_unit, @@ -143,34 +174,12 @@ const ScreenSmall = ({
) : ( - + ); -}; +}); ScreenSmall.propTypes = { - contract_start_type: PropTypes.string, - contract_type: PropTypes.string, - contract_types_list: PropTypes.object, - duration_unit: PropTypes.string, - expiry_type: PropTypes.string, is_trade_enabled: PropTypes.bool, }; -export default connect(({ modules }) => ({ - is_accumulator: modules.trade.is_accumulator, - is_allow_equal: !!modules.trade.is_equal, - is_multiplier: modules.trade.is_multiplier, - is_vanilla: modules.trade.is_vanilla, - duration_unit: modules.trade.duration_unit, - contract_types_list: modules.trade.contract_types_list, - contract_type: modules.trade.contract_type, - expiry_type: modules.trade.expiry_type, - contract_start_type: modules.trade.contract_start_type, - form_components: modules.trade.form_components, - has_take_profit: modules.trade.has_take_profit, - onChange: modules.trade.onChange, - previous_symbol: modules.trade.previous_symbol, - is_trade_params_expanded: modules.trade.is_trade_params_expanded, - setIsTradeParamsExpanded: modules.trade.setIsTradeParamsExpanded, - take_profit: modules.trade.take_profit, -}))(ScreenSmall); +export default ScreenSmall; diff --git a/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx b/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx index 5643a7434590..839d6bbcad8d 100644 --- a/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx +++ b/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-amount-modal.jsx @@ -2,14 +2,18 @@ import React from 'react'; import { Div100vhContainer, Modal, Money, Popover, usePreventIOSZoom } from '@deriv/components'; import { useIsMounted, WS } from '@deriv/shared'; import { localize, Localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; import { requestPreviewProposal } from 'Stores/Modules/Trading/Helpers/preview-proposal'; import AmountMobile from 'Modules/Trading/Components/Form/TradeParams/amount-mobile.jsx'; import MultipliersInfo from 'Modules/Trading/Components/Form/TradeParams/Multiplier/info.jsx'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; -const MultiplierAmountModal = ({ is_open, enableApp, disableApp, toggleModal }) => { +const MultiplierAmountModal = observer(({ is_open, toggleModal }) => { // Fix to prevent iOS from zooming in erratically on quick taps usePreventIOSZoom(); + const { + ui: { enableApp, disableApp }, + } = useStore(); return ( @@ -27,26 +31,18 @@ const MultiplierAmountModal = ({ is_open, enableApp, disableApp, toggleModal }) title={localize('Stake')} > - + ); -}; +}); -export default connect(({ client, modules, ui }) => ({ - amount: modules.trade.amount, - form_components: modules.trade.form_components, - currency: client.currency, - duration: modules.trade.duration, - duration_unit: modules.trade.duration_unit, - duration_units_list: modules.trade.duration_units_list, - expiry_type: modules.trade.expiry_type, - enableApp: ui.enableApp, - disableApp: ui.disableApp, -}))(MultiplierAmountModal); +export default MultiplierAmountModal; + +const TradeParamsMobile = observer(({ toggleModal }) => { + const { amount, currency, trade_stop_out, trade_store } = useTraderStore(); -const TradeParamsMobile = ({ amount, currency, toggleModal, trade_store, trade_stop_out }) => { const [stake_value, setStakeValue] = React.useState(amount); const [commission, setCommission] = React.useState(null); const [stop_out, setStopOut] = React.useState(null); @@ -119,15 +115,4 @@ const TradeParamsMobile = ({ amount, currency, toggleModal, trade_store, trade_s /> ); -}; - -const TradeParamsMobileWrapper = connect(({ ui, modules }) => ({ - amount: modules.trade.amount, - currency: modules.trade.currency, - multiplier: modules.trade.multiplier, - multiplier_range_list: modules.trade.multiplier_range_list, - trade_stop_out: modules.trade.stop_out, - onChange: modules.trade.onChange, - addToast: ui.addToast, - trade_store: modules.trade, -}))(TradeParamsMobile); +}); diff --git a/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-options.jsx b/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-options.jsx index be311973a765..0b58e3f0c82b 100644 --- a/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-options.jsx +++ b/packages/trader/src/Modules/Trading/Containers/Multiplier/multiplier-options.jsx @@ -3,10 +3,13 @@ import MultipliersInfo from 'Modules/Trading/Components/Form/TradeParams/Multipl import RadioGroupWithInfoMobile from 'Modules/Trading/Components/Form/RadioGroupWithInfoMobile'; import { requestPreviewProposal } from 'Stores/Modules/Trading/Helpers/preview-proposal'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; import { useIsMounted, WS } from '@deriv/shared'; -const MultiplierOptions = ({ amount, multiplier, multiplier_range_list, onChange, toggleModal, trade_store }) => { +const MultiplierOptions = observer(() => { + const { amount, multiplier, multiplier_range_list, onChange, toggleModal, trade_store } = useTraderStore(); + const [commission, setCommission] = React.useState(null); const [stop_out, setStopOut] = React.useState(null); const isMounted = useIsMounted(); @@ -52,12 +55,6 @@ const MultiplierOptions = ({ amount, multiplier, multiplier_range_list, onChange /> ); -}; - -export default connect(({ modules }) => ({ - amount: modules.trade.amount, - multiplier: modules.trade.multiplier, - multiplier_range_list: modules.trade.multiplier_range_list, - onChange: modules.trade.onChange, - trade_store: modules.trade, -}))(MultiplierOptions); +}); + +export default MultiplierOptions; diff --git a/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx b/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx index 021fc62e9ea4..7cb12004a094 100644 --- a/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx +++ b/packages/trader/src/Modules/Trading/Containers/Multiplier/risk-management-dialog.jsx @@ -3,24 +3,23 @@ import React from 'react'; import { MobileDialog, Button, Div100vhContainer } from '@deriv/components'; import { isDeepEqual, pick } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; import StopLoss from 'Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx'; import TakeProfit from 'Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx'; import CancelDeal from 'Modules/Trading/Components/Elements/Multiplier/cancel-deal-mobile.jsx'; -const RiskManagementDialog = ({ - is_open, - onClose, - take_profit, - stop_loss, - has_take_profit, - has_stop_loss, - has_cancellation, - cancellation_duration, - cancellation_range_list, - onChangeMultiple, - toggleDialog, -}) => { +const RiskManagementDialog = observer(({ is_open, onClose, toggleDialog }) => { + const { + take_profit, + has_take_profit, + has_stop_loss, + stop_loss, + has_cancellation, + cancellation_range_list, + cancellation_duration, + onChangeMultiple, + } = useTraderStore(); const applied_risk_management_state = { take_profit, stop_loss, @@ -137,15 +136,6 @@ const RiskManagementDialog = ({ ); -}; +}); -export default connect(({ modules }) => ({ - take_profit: modules.trade.take_profit, - has_take_profit: modules.trade.has_take_profit, - stop_loss: modules.trade.stop_loss, - has_stop_loss: modules.trade.has_stop_loss, - has_cancellation: modules.trade.has_cancellation, - cancellation_range_list: modules.trade.cancellation_range_list, - cancellation_duration: modules.trade.cancellation_duration, - onChangeMultiple: modules.trade.onChangeMultiple, -}))(RiskManagementDialog); +export default RiskManagementDialog; diff --git a/packages/trader/src/Modules/Trading/Containers/allow-equals.jsx b/packages/trader/src/Modules/Trading/Containers/allow-equals.jsx index 27124f1381b6..e38a4f91eb98 100644 --- a/packages/trader/src/Modules/Trading/Containers/allow-equals.jsx +++ b/packages/trader/src/Modules/Trading/Containers/allow-equals.jsx @@ -1,9 +1,10 @@ import classNames from 'classnames'; import PropTypes from 'prop-types'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer } from '@deriv/stores'; import React from 'react'; import { Checkbox, Text } from '@deriv/components'; import { Localize, localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; const AllowEquals = ({ onChange, is_allow_equal, has_equals_only, className }) => { const handleOnChange = e => { @@ -35,8 +36,12 @@ AllowEquals.propTypes = { onChange: PropTypes.func, }; -export default connect(({ modules }) => ({ - is_allow_equal: !!modules.trade.is_equal, - has_equals_only: modules.trade.has_equals_only, - onChange: modules.trade.onChange, -}))(AllowEquals); +export default observer(() => { + const { is_equal, has_equals_only, onChange } = useTraderStore(); + const allow_equals_props = { + is_allow_equal: !!is_equal, + has_equals_only, + onChange, + }; + return ; +}); diff --git a/packages/trader/src/Modules/Trading/Containers/chart-widgets.jsx b/packages/trader/src/Modules/Trading/Containers/chart-widgets.jsx index a865cce21eed..187f02209352 100644 --- a/packages/trader/src/Modules/Trading/Containers/chart-widgets.jsx +++ b/packages/trader/src/Modules/Trading/Containers/chart-widgets.jsx @@ -2,36 +2,23 @@ import React from 'react'; import { isMobile } from '@deriv/shared'; import Digits from 'Modules/Contract/Components/Digits'; import AccumulatorsStats from 'Modules/Contract/Components/AccumulatorsStats'; -import { connect } from 'Stores/connect'; import BottomWidgets from '../../SmartChart/Components/bottom-widgets.jsx'; -import ControlWidgets from '../../SmartChart/Components/control-widgets.jsx'; import TopWidgets from '../../SmartChart/Components/top-widgets.jsx'; import { symbolChange } from '../../SmartChart/Helpers/symbol'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; -export const DigitsWidget = connect(({ modules, contract_trade }) => ({ - contract_info: contract_trade.last_contract.contract_info || {}, - digits_info: contract_trade.last_contract.digits_info || {}, - display_status: contract_trade.last_contract.display_status, - is_digit_contract: contract_trade.last_contract.is_digit_contract, - is_ended: contract_trade.last_contract.is_ended, - selected_digit: modules.trade.last_digit, - onDigitChange: modules.trade.onChange, - underlying: modules.trade.symbol, - trade_type: modules.trade.contract_type, -}))( - ({ - contract_info, - digits, - digits_info, - display_status, - is_digit_contract, - is_ended, - onDigitChange, - selected_digit, - tick, - trade_type, - underlying, - }) => ( +export const DigitsWidget = observer(({ digits, tick }) => { + const { contract_trade } = useStore(); + const { + onChange: onDigitChange, + symbol: underlying, + contract_type: trade_type, + last_digit: selected_digit, + } = useTraderStore(); + const { last_contract } = contract_trade; + const { contract_info = {}, digits_info = {}, display_status, is_digit_contract, is_ended } = last_contract; + return ( ({ selected_digit={selected_digit} underlying={underlying} /> - ) -); + ); +}); // Chart widgets passed into SmartCharts -export const ChartTopWidgets = connect(({ modules, ui }) => ({ - onSymbolChange: modules.trade.onChange, - theme: ui.is_dark_mode_on ? 'dark' : 'light', -}))(({ onSymbolChange, charts_ref, theme, is_digits_widget_active, open_market, open }) => { +export const ChartTopWidgets = observer(({ charts_ref, is_digits_widget_active, open_market, open }) => { + const { ui } = useStore(); + const { onChange: onSymbolChange } = useTraderStore(); + const { is_dark_mode_on } = ui; + const theme = is_dark_mode_on ? 'dark' : 'light'; let yAxiswidth; if (charts_ref && charts_ref.chart) { yAxiswidth = charts_ref.chart.yAxiswidth; @@ -76,10 +64,3 @@ export const ChartBottomWidgets = ({ digits, tick, show_accumulators_stats }) => Widget={show_accumulators_stats ? : } /> ); - -export const ChartControlWidgets = connect(({ contract_trade }) => ({ - updateChartType: contract_trade.updateChartType, - updateGranularity: contract_trade.updateGranularity, -}))(({ updateChartType, updateGranularity }) => ( - -)); diff --git a/packages/trader/src/Modules/Trading/Containers/contract-type.jsx b/packages/trader/src/Modules/Trading/Containers/contract-type.jsx index e11bec00842a..914be9a0c118 100644 --- a/packages/trader/src/Modules/Trading/Containers/contract-type.jsx +++ b/packages/trader/src/Modules/Trading/Containers/contract-type.jsx @@ -1,4 +1,3 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { MobileWrapper, usePrevious } from '@deriv/components'; import { unsupported_contract_types_list } from '@deriv/shared'; @@ -8,18 +7,23 @@ import { ToastPopup } from 'Modules/Trading/Containers/toast-popup.jsx'; import { getMarketNamesMap } from '../../../Constants'; import ContractTypeWidget from '../Components/Form/ContractType'; import { getAvailableContractTypes } from '../Helpers/contract-type'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; + +const Contract = observer(() => { + const { + contract_type, + contract_types_list, + is_mobile_digit_view_selected: is_digit_view, + is_equal, + onChange, + symbol, + } = useTraderStore(); + const { + common: { current_language }, + client: { is_virtual }, + } = useStore(); -const Contract = ({ - contract_type, - contract_types_list, - is_digit_view, - is_equal, - is_virtual, - onChange, - symbol, - current_language, -}) => { const list = getAvailableContractTypes(contract_types_list, unsupported_contract_types_list); const digits_message = localize('Last digit stats for latest 1000 ticks for {{ underlying_name }}', { @@ -46,26 +50,6 @@ const Contract = ({ /> ); -}; - -Contract.propTypes = { - contract_type: PropTypes.string, - contract_types_list: PropTypes.object, - is_digit_view: PropTypes.bool, - is_equal: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - is_virtual: PropTypes.bool, - onChange: PropTypes.func, - symbol: PropTypes.string, - current_language: PropTypes.string, -}; +}); -export default connect(({ modules, client, common }) => ({ - contract_type: modules.trade.contract_type, - contract_types_list: modules.trade.contract_types_list, - is_digit_view: modules.trade.is_mobile_digit_view_selected, - is_equal: modules.trade.is_equal, - is_virtual: client.is_virtual, - onChange: modules.trade.onChange, - symbol: modules.trade.symbol, - current_language: common.current_language, -}))(Contract); +export default Contract; diff --git a/packages/trader/src/Modules/Trading/Containers/purchase.jsx b/packages/trader/src/Modules/Trading/Containers/purchase.jsx index 8c1dec8db138..8b434f09da6e 100644 --- a/packages/trader/src/Modules/Trading/Containers/purchase.jsx +++ b/packages/trader/src/Modules/Trading/Containers/purchase.jsx @@ -1,38 +1,38 @@ -import PropTypes from 'prop-types'; import React from 'react'; import { isAccumulatorContract, isEmptyObject, isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; import PurchaseButtonsOverlay from 'Modules/Trading/Components/Elements/purchase-buttons-overlay.jsx'; import PurchaseFieldset from 'Modules/Trading/Components/Elements/purchase-fieldset.jsx'; import { getContractTypePosition } from 'Constants/contract'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; import ContractInfo from 'Modules/Trading/Components/Form/Purchase/contract-info.jsx'; -const Purchase = ({ - active_positions, - basis, - contract_type, - currency, - growth_rate, - has_cancellation, - is_accumulator, - is_market_closed, - is_mobile, - is_multiplier, - is_purchase_enabled, - is_trade_enabled, - is_vanilla, - onClickPurchase, - onHoverPurchase, - proposal_info, - purchase_info, - purchased_states_arr, - setPurchaseState, - symbol, - trade_types, - validation_errors, - vanilla_trade_type, -}) => { +const Purchase = observer(({ is_market_closed }) => { + const { + portfolio: { active_positions }, + ui: { purchase_states: purchased_states_arr, is_mobile, setPurchaseState }, + } = useStore(); + const { + basis, + contract_type, + currency, + is_accumulator, + is_multiplier, + growth_rate, + has_cancellation, + is_purchase_enabled, + is_vanilla, + onPurchase: onClickPurchase, + onHoverPurchase, + proposal_info, + purchase_info, + symbol, + validation_errors, + vanilla_trade_type, + trade_types, + is_trade_enabled, + } = useTraderStore(); const is_high_low = /^high_low$/.test(contract_type.toLowerCase()); const isLoading = info => { const has_validation_error = Object.values(validation_errors).some(e => e.length); @@ -125,51 +125,6 @@ const Purchase = ({ ); } return components; -}; +}); -Purchase.propTypes = { - active_positions: PropTypes.array, - basis: PropTypes.string, - currency: PropTypes.string, - growth_rate: PropTypes.number, - has_cancellation: PropTypes.bool, - is_accumulator: PropTypes.bool, - is_multiplier: PropTypes.bool, - is_mobile: PropTypes.bool, - is_purchase_locked: PropTypes.bool, - is_trade_enabled: PropTypes.bool, - onClickPurchase: PropTypes.func, - onHoverPurchase: PropTypes.func, - proposal_info: PropTypes.object, - purchase_info: PropTypes.object, - purchased_states_arr: PropTypes.array, - setPurchaseState: PropTypes.func, - symbol: PropTypes.string, - trade_types: PropTypes.object, - validation_errors: PropTypes.object, -}; - -export default connect(({ modules, portfolio, ui }) => ({ - active_positions: portfolio.active_positions, - basis: modules.trade.basis, - contract_type: modules.trade.contract_type, - currency: modules.trade.currency, - growth_rate: modules.trade.growth_rate, - has_cancellation: modules.trade.has_cancellation, - is_accumulator: modules.trade.is_accumulator, - is_multiplier: modules.trade.is_multiplier, - is_purchase_enabled: modules.trade.is_purchase_enabled, - is_trade_enabled: modules.trade.is_trade_enabled, - is_vanilla: modules.trade.is_vanilla, - onClickPurchase: modules.trade.onPurchase, - onHoverPurchase: modules.trade.onHoverPurchase, - proposal_info: modules.trade.proposal_info, - purchase_info: modules.trade.purchase_info, - symbol: modules.trade.symbol, - trade_types: modules.trade.trade_types, - validation_errors: modules.trade.validation_errors, - vanilla_trade_type: modules.trade.vanilla_trade_type, - is_mobile: ui.is_mobile, - purchased_states_arr: ui.purchase_states, - setPurchaseState: ui.setPurchaseState, -}))(Purchase); +export default Purchase; diff --git a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx index 5880564e6009..63090bd44529 100644 --- a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx +++ b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx @@ -1,23 +1,18 @@ import React from 'react'; import { Div100vhContainer, Modal, usePreventIOSZoom } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; import { getGrowthRatePercentage, getTickSizeBarrierPercentage, isEmptyObject } from '@deriv/shared'; import MultiplierOptions from 'Modules/Trading/Containers/Multiplier/multiplier-options.jsx'; import RadioGroupWithInfoMobile from 'Modules/Trading/Components/Form/RadioGroupWithInfoMobile'; +import { observer, useStore } from '@deriv/stores'; + +const RadioGroupOptionsModal = observer(({ is_open, modal_title, toggleModal }) => { + const { accumulator_range_list, growth_rate, onChange, tick_size_barrier, proposal_info } = useTraderStore(); + const { + ui: { enableApp, disableApp }, + } = useStore(); -const RadioGroupOptionsModal = ({ - accumulator_range_list, - enableApp, - disableApp, - growth_rate, - is_open, - modal_title, - onChange, - proposal_info, - tick_size_barrier, - toggleModal, -}) => { // Fix to prevent iOS from zooming in erratically on quick taps usePreventIOSZoom(); const has_error_or_not_loaded = @@ -66,14 +61,6 @@ const RadioGroupOptionsModal = ({ ); -}; +}); -export default connect(({ modules, ui }) => ({ - accumulator_range_list: modules.trade.accumulator_range_list, - disableApp: ui.disableApp, - enableApp: ui.enableApp, - growth_rate: modules.trade.growth_rate, - onChange: modules.trade.onChange, - proposal_info: modules.trade.proposal_info, - tick_size_barrier: modules.trade.tick_size_barrier, -}))(RadioGroupOptionsModal); +export default RadioGroupOptionsModal; diff --git a/packages/trader/src/Modules/Trading/Containers/test.jsx b/packages/trader/src/Modules/Trading/Containers/test.jsx index 5e6fb7368a55..18354bc3ae0e 100644 --- a/packages/trader/src/Modules/Trading/Containers/test.jsx +++ b/packages/trader/src/Modules/Trading/Containers/test.jsx @@ -1,7 +1,8 @@ import { toJS } from 'mobx'; import PropTypes from 'prop-types'; import React from 'react'; -import { connect } from 'Stores/connect'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; const styles = { container: { @@ -30,7 +31,16 @@ const styles = { }, }; -const Test = props => { +const Test = observer(() => { + const stores = useStore(); + const trade_store = useTraderStore(); + const test_stores = { + trade: Object.entries(trade_store), + client: Object.entries(stores.client), + ui: Object.entries(stores.ui), + portfolio: Object.entries(stores.portfolio), + }; + const [is_visible, setIsVisible] = React.useState(false); const [store, setStore] = React.useState('trade'); @@ -63,7 +73,7 @@ const Test = props => { return (
- {Object.keys(props).map(storage => ( + {Object.keys(test_stores).map(storage => (

setStore(storage)} @@ -73,18 +83,13 @@ const Test = props => {

))}
- {props[store].sort().map(renderStoreContent)} + {test_stores[store].sort().map(renderStoreContent)}
); -}; +}); Test.propTypes = { entries: PropTypes.array, }; -export default connect(({ modules, client, ui, portfolio }) => ({ - trade: Object.entries(modules.trade), - client: Object.entries(client), - ui: Object.entries(ui), - portfolio: Object.entries(portfolio), -}))(Test); +export default Test; diff --git a/packages/trader/src/Modules/Trading/Containers/toast-popup.jsx b/packages/trader/src/Modules/Trading/Containers/toast-popup.jsx index c3fe7034a99f..460cfee96b12 100644 --- a/packages/trader/src/Modules/Trading/Containers/toast-popup.jsx +++ b/packages/trader/src/Modules/Trading/Containers/toast-popup.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import ReactDOM from 'react-dom'; import { MobileWrapper, Toast } from '@deriv/components'; -import { connect } from 'Stores/connect'; +import { observer, useStore } from '@deriv/stores'; export const ToastPopup = ({ portal_id = 'popup_root', children, className, ...props }) => { if (!document.getElementById(portal_id)) return null; @@ -54,8 +54,15 @@ NetworkStatusToastError.propTypes = { message: PropTypes.string, }; -export const NetworkStatusToastErrorPopup = connect(({ common }) => ({ - network_status: common.network_status, -}))(({ network_status }) => ( - -)); +export const NetworkStatusToastErrorPopup = observer(() => { + const { + common: { network_status }, + } = useStore(); + return ( + + ); +}); diff --git a/packages/trader/src/Modules/Trading/Containers/trade-params-mobile.jsx b/packages/trader/src/Modules/Trading/Containers/trade-params-mobile.jsx index 8cc9f5d322b9..382cb95b7e0b 100644 --- a/packages/trader/src/Modules/Trading/Containers/trade-params-mobile.jsx +++ b/packages/trader/src/Modules/Trading/Containers/trade-params-mobile.jsx @@ -6,11 +6,10 @@ import AmountMobile from 'Modules/Trading/Components/Form/TradeParams/amount-mob import Barrier from 'Modules/Trading/Components/Form/TradeParams/barrier.jsx'; import DurationMobile from 'Modules/Trading/Components/Form/TradeParams/Duration/duration-mobile.jsx'; import LastDigit from 'Modules/Trading/Components/Form/TradeParams/last-digit.jsx'; -import { PropTypes as MobxPropTypes } from 'mobx-react'; -import PropTypes from 'prop-types'; +import { observer, useStore } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; import React from 'react'; import classNames from 'classnames'; -import { connect } from 'Stores/connect'; import { localize, Localize } from '@deriv/translations'; const DEFAULT_DURATION = Object.freeze({ @@ -31,19 +30,12 @@ const reducer = (state, payload) => { const makeGetDefaultDuration = (trade_duration, trade_duration_unit) => duration_unit => trade_duration_unit === duration_unit ? trade_duration : DEFAULT_DURATION[duration_unit]; -const TradeParamsModal = ({ - amount, - duration, - duration_unit, - form_components, - is_open, - enableApp, - disableApp, - toggleModal, - currency, - duration_units_list, - is_vanilla, -}) => { +const TradeParamsModal = observer(({ is_open, toggleModal }) => { + const { client, ui } = useStore(); + const { currency } = client; + const { enableApp, disableApp } = ui; + const { amount, form_components, duration, duration_unit, duration_units_list, is_vanilla } = useTraderStore(); + // eslint-disable-next-line react-hooks/exhaustive-deps const getDefaultDuration = React.useCallback(makeGetDefaultDuration(duration, duration_unit), []); @@ -137,7 +129,7 @@ const TradeParamsModal = ({ > - ); -}; - -TradeParamsModal.propTypes = { - amount: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - duration: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), - duration_unit: PropTypes.string, - duration_units_list: MobxPropTypes.arrayOrObservableArray, - form_components: MobxPropTypes.arrayOrObservableArray, - is_open: PropTypes.bool, - is_vanilla: PropTypes.bool, - disableApp: PropTypes.func, - enableApp: PropTypes.func, - toggleModal: PropTypes.func, - currency: PropTypes.string, -}; +}); -export default connect(({ client, modules, ui }) => ({ - amount: modules.trade.amount, - form_components: modules.trade.form_components, - currency: client.currency, - duration: modules.trade.duration, - duration_unit: modules.trade.duration_unit, - duration_units_list: modules.trade.duration_units_list, - expiry_type: modules.trade.expiry_type, - enableApp: ui.enableApp, - disableApp: ui.disableApp, - is_vanilla: modules.trade.is_vanilla, -}))(TradeParamsModal); +export default TradeParamsModal; -const TradeParamsMobile = ({ - currency, - toggleModal, - isVisible, - setAmountTabIdx, - amount_tab_idx, - setTradeParamTabIdx, - trade_param_tab_idx, - setDurationTabIdx, - duration_unit, - duration_units_list, - duration_value, - duration_tab_idx, - has_amount_error, - has_duration_error, - is_vanilla, - // amount - setAmountError, - setSelectedAmount, - stake_value, - payout_value, - // duration - setDurationError, - setSelectedDuration, - t_duration, - s_duration, - m_duration, - h_duration, - d_duration, - // basis - basis_list, - basis, -}) => { - const getDurationText = () => { - const duration = duration_units_list.find(d => d.value === duration_unit); - return `${duration_value} ${ - duration && (duration_value > 1 ? localize(duration.text) : localize(duration.text.slice(0, -1))) - }`; - }; +const TradeParamsMobile = observer( + ({ + currency, + toggleModal, + isVisible, + setAmountTabIdx, + amount_tab_idx, + setTradeParamTabIdx, + trade_param_tab_idx, + setDurationTabIdx, + duration_unit, + duration_units_list, + duration_value, + duration_tab_idx, + has_amount_error, + has_duration_error, + // amount + setAmountError, + setSelectedAmount, + stake_value, + payout_value, + // duration + setDurationError, + setSelectedDuration, + t_duration, + s_duration, + m_duration, + h_duration, + d_duration, + }) => { + const { basis_list, basis, is_vanilla } = useTraderStore(); + const getDurationText = () => { + const duration = duration_units_list.find(d => d.value === duration_unit); + return `${duration_value} ${ + duration && (duration_value > 1 ? localize(duration.text) : localize(duration.text.slice(0, -1))) + }`; + }; - const getAmountText = () => { - const has_selected_tab_idx = typeof amount_tab_idx !== 'undefined'; - const active_index = has_selected_tab_idx ? amount_tab_idx : basis_list.findIndex(b => b.value === basis); + const getAmountText = () => { + const has_selected_tab_idx = typeof amount_tab_idx !== 'undefined'; + const active_index = has_selected_tab_idx ? amount_tab_idx : basis_list.findIndex(b => b.value === basis); - return ; - }; + return ; + }; - const getHeaderContent = tab_key => { - switch (tab_key) { - case 'duration': - return ( -
-
{localize('Duration')}
-
- {has_duration_error ? localize('Error') : getDurationText()} -
-
- ); - case 'amount': - return ( -
-
- {is_vanilla ? localize('Stake') : localize('Amount')} + const getHeaderContent = tab_key => { + switch (tab_key) { + case 'duration': + return ( +
+
{localize('Duration')}
+
+ {has_duration_error ? localize('Error') : getDurationText()} +
-
- {has_amount_error ? localize('Error') : getAmountText()} + ); + case 'amount': + return ( +
+
+ {is_vanilla ? localize('Stake') : localize('Amount')} +
+
+ {has_amount_error ? localize('Error') : getAmountText()} +
+ ); + default: + return null; + } + }; + return ( + + {isVisible('duration') && ( +
+
- ); - default: - return null; - } - }; - return ( - - {isVisible('duration') && ( -
- -
- )} - {isVisible('amount') && ( -
- -
- )} -
- ); -}; - -const TradeParamsMobileWrapper = connect(({ modules }) => ({ - basis_list: modules.trade.basis_list, - basis: modules.trade.basis, - is_vanilla: modules.trade.is_vanilla, -}))(TradeParamsMobile); + )} + {isVisible('amount') && ( +
+ +
+ )} +
+ ); + } +); -export const LastDigitMobile = connect(({ modules }) => ({ - form_components: modules.trade.form_components, -}))(({ form_components }) => form_components.includes('last_digit') && ); +export const LastDigitMobile = observer(() => { + const { form_components } = useTraderStore(); + return form_components.includes('last_digit') && ; +}); -export const BarrierMobile = connect(({ modules }) => ({ - form_components: modules.trade.form_components, -}))(({ form_components }) => form_components.includes('barrier') && ); +export const BarrierMobile = observer(() => { + const { form_components } = useTraderStore(); + return form_components.includes('barrier') && ; +}); diff --git a/packages/trader/src/Modules/Trading/Containers/trade-params.jsx b/packages/trader/src/Modules/Trading/Containers/trade-params.jsx index 5addbb35a8b3..cd34a3ce49a9 100644 --- a/packages/trader/src/Modules/Trading/Containers/trade-params.jsx +++ b/packages/trader/src/Modules/Trading/Containers/trade-params.jsx @@ -1,4 +1,3 @@ -import { PropTypes as MobxPropTypes } from 'mobx-react'; import PropTypes from 'prop-types'; import React from 'react'; import classNames from 'classnames'; @@ -14,10 +13,12 @@ import Expiration from 'Modules/Trading/Components/Form/TradeParams/Multiplier/e import AccumulatorsInfoDisplay from 'Modules/Trading/Components/Form/TradeParams/Accumulator/accumulators-info-display.jsx'; import Strike from 'Modules/Trading/Components/Form/TradeParams/strike.jsx'; import VanillaTradeTypes from 'Modules/Trading/Components/Form/TradeParams/vanilla-trade-types.jsx'; -import { connect } from 'Stores/connect'; +import { observer } from '@deriv/stores'; +import { useTraderStore } from 'Stores/useTraderStores'; import Fieldset from 'App/Components/Form/fieldset.jsx'; -const TradeParams = ({ form_components, is_minimized }) => { +const TradeParams = observer(({ is_minimized }) => { + const { form_components } = useTraderStore(); const isVisible = component_key => { return form_components.includes(component_key); }; @@ -39,12 +40,9 @@ const TradeParams = ({ form_components, is_minimized }) => { {isVisible('accu_info_display') && } ); -}; +}); TradeParams.propTypes = { - form_components: MobxPropTypes.arrayOrObservableArray, is_minimized: PropTypes.bool, }; -export default connect(({ modules }) => ({ - form_components: modules.trade.form_components, -}))(TradeParams); +export default TradeParams; diff --git a/packages/trader/src/Modules/Trading/Containers/trade.jsx b/packages/trader/src/Modules/Trading/Containers/trade.jsx index 61950b4261a7..ef6c38c08555 100644 --- a/packages/trader/src/Modules/Trading/Containers/trade.jsx +++ b/packages/trader/src/Modules/Trading/Containers/trade.jsx @@ -1,10 +1,8 @@ import React from 'react'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { DesktopWrapper, Div100vhContainer, MobileWrapper, SwipeableWrapper } from '@deriv/components'; import { isDesktop, isMobile } from '@deriv/shared'; import ChartLoader from 'App/Components/Elements/chart-loader.jsx'; -import { connect } from 'Stores/connect'; import PositionsDrawer from 'App/Components/Elements/PositionsDrawer'; import MarketIsClosedOverlay from 'App/Components/Elements/market-is-closed-overlay.jsx'; import Test from './test.jsx'; @@ -13,6 +11,8 @@ import FormLayout from '../Components/Form/form-layout.jsx'; import AllMarkers from '../../SmartChart/Components/all-markers.jsx'; import AccumulatorsChartElements from '../../SmartChart/Components/Markers/accumulators-chart-elements.jsx'; import ToolbarWidgets from '../../SmartChart/Components/toolbar-widgets.jsx'; +import { useTraderStore } from 'Stores/useTraderStores'; +import { observer, useStore } from '@deriv/stores'; const BottomWidgetsMobile = ({ tick, digits, setTick, setDigits }) => { React.useEffect(() => { @@ -29,33 +29,37 @@ const BottomWidgetsMobile = ({ tick, digits, setTick, setDigits }) => { return null; }; -const Trade = ({ - form_components, - getFirstOpenMarket, - should_show_active_symbols_loading, - is_chart_loading, - is_dark_theme, - is_eu, - is_market_closed, - is_market_unavailable_visible, - is_trade_enabled, - is_virtual, - network_status, - NotificationMessages, - onChange, - onMount, - onUnmount, - prepareTradeStore, - setContractTypes, - setMobileDigitView, - is_accumulator, - show_digits_stats, - should_show_multipliers_onboarding, - symbol, - is_synthetics_available, - is_synthetics_trading_market_available, - is_vanilla, -}) => { +const Trade = observer(() => { + const { client, common, ui } = useStore(); + const { + form_components, + getFirstOpenMarket, + should_show_active_symbols_loading, + is_chart_loading, + is_market_closed, + is_trade_enabled, + onChange, + onMount, + onUnmount, + prepareTradeStore, + setContractTypes, + setMobileDigitView, + show_digits_stats, + is_accumulator, + symbol, + is_synthetics_available, + is_synthetics_trading_market_available, + is_vanilla, + } = useTraderStore(); + const { + notification_messages_ui: NotificationMessages, + has_only_forward_starting_contracts: is_market_unavailable_visible, + should_show_multipliers_onboarding, + is_dark_mode_on: is_dark_theme, + } = ui; + const { is_eu, is_virtual } = client; + const { network_status } = common; + const [digits, setDigits] = React.useState([]); const [tick, setTick] = React.useState({}); const [try_synthetic_indices, setTrySyntheticIndices] = React.useState(false); @@ -230,36 +234,9 @@ const Trade = ({
); -}; +}); -export default connect(({ client, common, modules, ui }) => ({ - getFirstOpenMarket: modules.trade.getFirstOpenMarket, - is_accumulator: modules.trade.is_accumulator, - is_eu: client.is_eu, - is_virtual: client.is_virtual, - is_synthetics_available: modules.trade.is_synthetics_available, - is_synthetics_trading_market_available: modules.trade.is_synthetics_trading_market_available, - network_status: common.network_status, - contract_type: modules.trade.contract_type, - form_components: modules.trade.form_components, - should_show_active_symbols_loading: modules.trade.should_show_active_symbols_loading, - is_chart_loading: modules.trade.is_chart_loading, - is_market_closed: modules.trade.is_market_closed, - show_digits_stats: modules.trade.show_digits_stats, - is_trade_enabled: modules.trade.is_trade_enabled, - prepareTradeStore: modules.trade.prepareTradeStore, - setMobileDigitView: modules.trade.setMobileDigitView, - symbol: modules.trade.symbol, - onMount: modules.trade.onMount, - onUnmount: modules.trade.onUnmount, - purchase_info: modules.trade.purchase_info, - NotificationMessages: ui.notification_messages_ui, - is_market_unavailable_visible: ui.has_only_forward_starting_contracts, - should_show_multipliers_onboarding: ui.should_show_multipliers_onboarding, - onChange: modules.trade.onChange, - setContractTypes: modules.trade.setContractTypes, - is_vanilla: modules.trade.is_vanilla, -}))(Trade); +export default Trade; // CHART (ChartTrade)-------------------------------------------------------- @@ -269,8 +246,12 @@ import { SmartChart } from 'Modules/SmartChart'; const SmartChartWithRef = React.forwardRef((props, ref) => ); // ChartMarkers -------------------------- -const Markers = ({ markers_array, is_dark_theme, granularity, currency, config }) => - markers_array.map(marker => { +const ChartMarkers = observer(config => { + const { ui, client, contract_trade } = useStore(); + const { markers_array, granularity } = contract_trade; + const { is_dark_mode_on: is_dark_theme } = ui; + const { currency } = client; + return markers_array.map(marker => { const Marker = AllMarkers[marker.type]; return ( ); }); +}); -const ChartMarkers = connect(({ ui, client, contract_trade }) => ({ - markers_array: contract_trade.markers_array, - is_digit_contract: contract_trade.is_digit_contract, - granularity: contract_trade.granularity, - is_dark_theme: ui.is_dark_mode_on, - currency: client.currency, -}))(Markers); - -const Chart = props => { +const ChartTrade = observer(props => { + const { is_accumulator, end_epoch, topWidgets, charts_ref } = props; + const { client, ui, common, contract_trade, portfolio } = useStore(); const { accumulator_barriers_data, - all_positions, - topWidgets, - charts_ref, + granularity, + chart_type, updateGranularity, updateChartType, - active_symbols, - chart_layout, - chart_type, + should_highlight_current_spot, + } = contract_trade; + const { all_positions } = portfolio; + const { is_chart_layout_default, is_chart_countdown_visible, is_dark_mode_on } = ui; + const { is_socket_opened, current_language } = common; + const { should_show_eu_content } = client; + const { chartStateChange, - exportLayout, - extra_barriers = [], - end_epoch, - granularity, - has_alternative_source, - is_accumulator, is_trade_enabled, - is_socket_opened, - main_barrier, - refToAddTick, - setChartStatus, - settings, - should_show_eu_content, + main_barrier_flattened: main_barrier, + barriers_flattened: extra_barriers, show_digits_stats, - should_highlight_current_spot, symbol, + exportLayout, + setChartStatus, + chart_layout, wsForget, wsForgetStream, wsSendRequest, wsSubscribe, - } = props; + active_symbols, + has_alternative_source, + refToAddTick, + } = useTraderStore(); + + const settings = { + assetInformation: false, // ui.is_chart_asset_info_visible, + countdown: is_chart_countdown_visible, + isHighestLowestMarkerEnabled: false, // TODO: Pending UI, + language: current_language.toLowerCase(), + position: is_chart_layout_default ? 'bottom' : 'left', + theme: is_dark_mode_on ? 'dark' : 'light', + }; const { current_spot, current_spot_time } = accumulator_barriers_data[symbol] || {}; @@ -422,75 +405,4 @@ const Chart = props => { )} ); -}; - -Chart.propTypes = { - accumulator_barriers_data: PropTypes.object, - all_positions: PropTypes.array, - topWidgets: PropTypes.func, - charts_ref: PropTypes.object, - bottomWidgets: PropTypes.func, - chart_type: PropTypes.string, - chart_layout: PropTypes.any, - chartStateChange: PropTypes.func, - exportLayout: PropTypes.func, - end_epoch: PropTypes.number, - granularity: PropTypes.number, - is_accumulator: PropTypes.bool, - is_trade_enabled: PropTypes.bool, - is_socket_opened: PropTypes.bool, - has_alternative_source: PropTypes.bool, - main_barrier: PropTypes.any, - refToAddTick: PropTypes.func, - setChartStatus: PropTypes.func, - settings: PropTypes.object, - should_show_eu_content: PropTypes.bool, - should_highlight_current_spot: PropTypes.bool, - symbol: PropTypes.string, - wsForget: PropTypes.func, - wsForgetStream: PropTypes.func, - wsSendRequest: PropTypes.func, - wsSubscribe: PropTypes.func, -}; - -const ChartTrade = connect(({ client, modules, ui, common, contract_trade, portfolio }) => ({ - accumulator_barriers_data: contract_trade.accumulator_barriers_data, - all_positions: portfolio.all_positions, - is_socket_opened: common.is_socket_opened, - granularity: contract_trade.granularity, - chart_type: contract_trade.chart_type, - chartStateChange: modules.trade.chartStateChange, - updateChartType: contract_trade.updateChartType, - updateGranularity: contract_trade.updateGranularity, - settings: { - assetInformation: false, // ui.is_chart_asset_info_visible, - countdown: ui.is_chart_countdown_visible, - isHighestLowestMarkerEnabled: false, // TODO: Pending UI, - language: common.current_language.toLowerCase(), - position: ui.is_chart_layout_default ? 'bottom' : 'left', - theme: ui.is_dark_mode_on ? 'dark' : 'light', - }, - last_contract: { - is_digit_contract: contract_trade.last_contract.is_digit_contract, - is_ended: contract_trade.last_contract.is_ended, - }, - is_accumulator: modules.trade.is_accumulator, - is_trade_enabled: modules.trade.is_trade_enabled, - main_barrier: modules.trade.main_barrier_flattened, - extra_barriers: modules.trade.barriers_flattened, - should_show_eu_content: client.should_show_eu_content, - show_digits_stats: modules.trade.show_digits_stats, - should_highlight_current_spot: contract_trade.should_highlight_current_spot, - contract_type: modules.trade.contract_type, - symbol: modules.trade.symbol, - exportLayout: modules.trade.exportLayout, - setChartStatus: modules.trade.setChartStatus, - chart_layout: modules.trade.chart_layout, - wsForget: modules.trade.wsForget, - wsForgetStream: modules.trade.wsForgetStream, - wsSendRequest: modules.trade.wsSendRequest, - wsSubscribe: modules.trade.wsSubscribe, - active_symbols: modules.trade.active_symbols, - has_alternative_source: modules.trade.has_alternative_source, - refToAddTick: modules.trade.refToAddTick, -}))(Chart); +}); diff --git a/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.js b/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.js index 21b2a8269991..8376eb452063 100644 --- a/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.js +++ b/packages/trader/src/Stores/Modules/Trading/Helpers/multiplier.js @@ -1,5 +1,3 @@ -import { connect } from 'Stores/connect'; - export const onToggleCancellation = ({ has_cancellation, onChangeMultiple }) => { // e.target.checked is not reliable, we have to toggle its previous value const new_val = !has_cancellation; @@ -27,14 +25,3 @@ export const onChangeCancellationDuration = ({ event, onChangeMultiple }) => { cancellation_duration: value, }); }; - -// eslint-disable-next-line no-empty-pattern -export const connectWithContractUpdate = connect(({}, { contract = {} }) => { - return { - validation_errors: contract.validation_errors, - contract_update_take_profit: contract.contract_update_take_profit, - contract_update_stop_loss: contract.contract_update_stop_loss, - has_contract_update_take_profit: contract.has_contract_update_take_profit, - has_contract_update_stop_loss: contract.has_contract_update_stop_loss, - }; -}); diff --git a/packages/trader/src/Stores/connect.js b/packages/trader/src/Stores/connect.js deleted file mode 100644 index 4ef42c8d18b6..000000000000 --- a/packages/trader/src/Stores/connect.js +++ /dev/null @@ -1,31 +0,0 @@ -import { useObserver } from 'mobx-react'; -import React from 'react'; - -const isClassComponent = Component => - !!(typeof Component === 'function' && Component.prototype && Component.prototype.isReactComponent); - -export const MobxContent = React.createContext(null); - -function injectStorePropsToComponent(propsToSelectFn, BaseComponent) { - const Component = own_props => { - const store = React.useContext(MobxContent); - - let ObservedComponent = BaseComponent; - - if (isClassComponent(BaseComponent)) { - const FunctionalWrapperComponent = props => ; - ObservedComponent = FunctionalWrapperComponent; - } - - return useObserver(() => ObservedComponent({ ...own_props, ...propsToSelectFn(store, own_props) })); - }; - - Component.displayName = BaseComponent.name; - return Component; -} - -export const MobxContentProvider = ({ store, children }) => { - return {children}; -}; - -export const connect = propsToSelectFn => Component => injectStorePropsToComponent(propsToSelectFn, Component); diff --git a/packages/trader/src/Stores/useTraderStores.tsx b/packages/trader/src/Stores/useTraderStores.tsx new file mode 100644 index 000000000000..5e4db0cd77c2 --- /dev/null +++ b/packages/trader/src/Stores/useTraderStores.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { useStore } from '@deriv/stores'; +import TradeStore from './Modules/Trading/trade-store'; + +const TraderStoreContext = React.createContext(null); + +export const TraderStoreProvider = ({ children }: React.PropsWithChildren) => { + const { modules } = useStore(); + // const memoizedValue = useMemo(() => new TraderStore(), []); + + return {children}; +}; + +export const useTraderStore = () => { + const store = React.useContext(TraderStoreContext); + + if (!store) { + throw new Error('useTraderStore must be used within TraderStoreProvider'); + } + + return store; +}; diff --git a/packages/trader/src/trader-providers.tsx b/packages/trader/src/trader-providers.tsx new file mode 100644 index 000000000000..ce527e2c0347 --- /dev/null +++ b/packages/trader/src/trader-providers.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { StoreProvider } from '@deriv/stores'; +import { TraderStoreProvider } from 'Stores/useTraderStores'; +import type { TCoreStores } from '@deriv/stores/types'; + +export const TraderProviders = ({ children, store }: React.PropsWithChildren<{ store: TCoreStores }>) => { + return ( + + {children} + + ); +}; + +export default TraderProviders; From 4f2b2825ae6e280564d5105a0c44a7420b439f02 Mon Sep 17 00:00:00 2001 From: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:32:52 +0800 Subject: [PATCH 012/104] chore: :bug: quick strategy dialog scrolling fix (#8946) * chore: :bug: quick strategy dialog scrolling fix * chore: :fire: removed media query for 768 height breakpoing --- .../quick-strategy-components/form.tsx | 12 +++++------ .../quick-strategy/quick-strategy.scss | 20 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/form.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/form.tsx index d6bb26ecdcc3..78fef4482991 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/form.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/form.tsx @@ -1,13 +1,13 @@ -import { ThemedScrollbars, Text } from '@deriv/components'; -import { isSafari, isMobile } from '@deriv/shared'; -import { localize } from '@deriv/translations'; +import React from 'react'; import classNames from 'classnames'; import { Form, Formik, FormikProps } from 'formik'; -import React from 'react'; import * as Yup from 'yup'; -import { QuickStrategyFields, QuickStrategyFooter } from '.'; +import { Text, ThemedScrollbars } from '@deriv/components'; +import { isMobile, isSafari } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import { TQuickStrategyFormValues } from '../quick-strategy.types'; import { TQuickStrategyForm } from './components.types'; +import { QuickStrategyFields, QuickStrategyFooter } from '.'; const QuickStrategyForm = ({ duration_unit_dropdown, @@ -84,7 +84,7 @@ const QuickStrategyForm = ({ 'quick-strategy__form--active-keyboard': is_onscreen_keyboard_active, })} > - +
Date: Mon, 12 Jun 2023 12:58:21 +0800 Subject: [PATCH 013/104] Farzin/WALL-851/Reusable components and hooks (#8772) * feat(components): :sparkles: add `InlineMessage` component * feat(components): :sparkles: add `SideNote` component * feat(hooks): :sparkles: add `useInputDecimalFormatter` hook * feat(hooks): :sparkles: add `useInputATMFormatter` hook * feat(hooks): :sparkles: add `useCurrencyConfig` hook * feat(hooks): :sparkles: add `useDepositCryptoAddress` hook * fix: :wrench: fix `jest.config.js` * feat: :label: add `Prettify` utility type * fix(hooks): :white_check_mark: fix failing test * fix(hooks): :white_check_mark: fix failing test * fix(components): :memo: resolve PR comments * ci: :green_heart: trigger build * Merge branch 'master' into farzin/reusable_components_and_hooks * Merge branch 'master' into farzin/reusable_components_and_hooks * refactor(components): :sparkles: add `RequireAtLeastOne` utility type * fix(hooks): :memo: resolve PR comments * ci: :green_heart: trigger build * ci: :green_heart: trigger build * ci: :green_heart: trigger build * docs(cashier): :wastebasket: mark legacy `SideNote` as deprecated * perf(hooks): :zap: improve `useCurrencyConfig` hook * fix(hooks): :bug: map `UST` to `USDT` * ci: :green_heart: trigger build * fix(hooks): :memo: resolve conflicts * ci: :green_heart: trigger build --------- Co-authored-by: Farzin Mirzaie --- .../src/components/side-note/side-note.scss | 2 +- .../src/components/side-note/side-note.tsx | 17 ++- packages/cashier/src/stores/on-ramp-store.ts | 7 ++ .../src/components/inline-message/index.ts | 1 + .../inline-message/inline-message.scss | 78 ++++++++++++ .../inline-message/inline-message.tsx | 49 ++++++++ .../src/components/side-note/index.ts | 1 + .../src/components/side-note/side-note.scss | 29 +++++ .../src/components/side-note/side-note.tsx | 42 +++++++ packages/components/src/index.js | 2 + packages/hooks/package.json | 1 + .../src/__tests__/useCurrencyConfig.spec.tsx | 41 +++++++ .../useDepositCryptoAddress.spec.tsx | 37 ++++++ .../__tests__/useInputATMFormatter.spec.tsx | 87 ++++++++++++++ .../useInputDecimalFormatter.spec.tsx | 113 ++++++++++++++++++ packages/hooks/src/index.ts | 4 + packages/hooks/src/useCurrencyConfig.ts | 81 +++++++++++++ packages/hooks/src/useDepositCryptoAddress.ts | 24 ++++ packages/hooks/src/useInputATMFormatter.ts | 91 ++++++++++++++ .../hooks/src/useInputDecimalFormatter.ts | 72 +++++++++++ .../p2p/src/components/orders/orders.scss | 4 +- packages/shared/src/styles/constants.scss | 6 + types/utils.d.ts | 9 ++ 23 files changed, 790 insertions(+), 8 deletions(-) create mode 100644 packages/components/src/components/inline-message/index.ts create mode 100644 packages/components/src/components/inline-message/inline-message.scss create mode 100644 packages/components/src/components/inline-message/inline-message.tsx create mode 100644 packages/components/src/components/side-note/index.ts create mode 100644 packages/components/src/components/side-note/side-note.scss create mode 100644 packages/components/src/components/side-note/side-note.tsx create mode 100644 packages/hooks/src/__tests__/useCurrencyConfig.spec.tsx create mode 100644 packages/hooks/src/__tests__/useDepositCryptoAddress.spec.tsx create mode 100644 packages/hooks/src/__tests__/useInputATMFormatter.spec.tsx create mode 100644 packages/hooks/src/__tests__/useInputDecimalFormatter.spec.tsx create mode 100644 packages/hooks/src/useCurrencyConfig.ts create mode 100644 packages/hooks/src/useDepositCryptoAddress.ts create mode 100644 packages/hooks/src/useInputATMFormatter.ts create mode 100644 packages/hooks/src/useInputDecimalFormatter.ts diff --git a/packages/cashier/src/components/side-note/side-note.scss b/packages/cashier/src/components/side-note/side-note.scss index 56c97185d853..d381d45dad98 100644 --- a/packages/cashier/src/components/side-note/side-note.scss +++ b/packages/cashier/src/components/side-note/side-note.scss @@ -1,4 +1,4 @@ -.side-note { +.side-note-legacy { &--mobile { background-color: var(--general-section-1); border-radius: $BORDER_RADIUS * 2; diff --git a/packages/cashier/src/components/side-note/side-note.tsx b/packages/cashier/src/components/side-note/side-note.tsx index 3a310bd7ba7f..353895118fb2 100644 --- a/packages/cashier/src/components/side-note/side-note.tsx +++ b/packages/cashier/src/components/side-note/side-note.tsx @@ -29,7 +29,7 @@ const SideNoteTitle = ({ children_length, side_notes_length, title }: TSideNoteT const length_of_notes = children_length || side_notes_length || 0; return ( - + {title || (length_of_notes > 1 ? : )} @@ -37,12 +37,13 @@ const SideNoteTitle = ({ children_length, side_notes_length, title }: TSideNoteT }; const SideNoteBullet = ({ children, id }: TSideNoteBullet) => ( -
-
+
+
{children}
); +/** @deprecated Use `SideNote` from `@deriv/components` package instead. */ const SideNote = ({ children, className, @@ -58,7 +59,13 @@ const SideNote = ({ <> {(children || side_notes?.length) && ( -
+
{has_title && ( ) : ( - + {note} ) diff --git a/packages/cashier/src/stores/on-ramp-store.ts b/packages/cashier/src/stores/on-ramp-store.ts index 1718133c0e8f..abb398c40510 100644 --- a/packages/cashier/src/stores/on-ramp-store.ts +++ b/packages/cashier/src/stores/on-ramp-store.ts @@ -49,10 +49,13 @@ export default class OnRampStore extends BaseStore { }); } + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ api_error: TServerError | null = null; + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ deposit_address: string | null = null; disposeGetWidgetHtmlReaction: IReactionDisposer | null = null; disposeThirdPartyJsReaction: IReactionDisposer | null = null; + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ is_deposit_address_loading = true; is_onramp_modal_open = false; is_requesting_widget_html = false; @@ -178,6 +181,7 @@ export default class OnRampStore extends BaseStore { window.open(websiteUrl() + routes.cashier_deposit.substring(1)); } + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ async pollApiForDepositAddress(should_allow_empty_address: boolean) { // should_allow_empty_address: API returns empty deposit address for legacy accounts // that have never generated a deposit address. Setting this to "true" will allow @@ -228,14 +232,17 @@ export default class OnRampStore extends BaseStore { this.setWidgetHtml(null); } + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ setApiError(api_error: TServerError | null) { this.api_error = api_error; } + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ setDepositAddress(deposit_address: string | null) { this.deposit_address = deposit_address; } + /** @deprecated Use `useDepositCryptoAddress` from `@deriv/hooks` package instead. */ setIsDepositAddressLoading(is_loading: boolean) { this.is_deposit_address_loading = is_loading; } diff --git a/packages/components/src/components/inline-message/index.ts b/packages/components/src/components/inline-message/index.ts new file mode 100644 index 000000000000..5c4daf544964 --- /dev/null +++ b/packages/components/src/components/inline-message/index.ts @@ -0,0 +1 @@ +export { default as InlineMessage } from './inline-message'; diff --git a/packages/components/src/components/inline-message/inline-message.scss b/packages/components/src/components/inline-message/inline-message.scss new file mode 100644 index 000000000000..2302277a8d03 --- /dev/null +++ b/packages/components/src/components/inline-message/inline-message.scss @@ -0,0 +1,78 @@ +.inline-message { + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 0.8rem; + gap: 0.8rem; + border-radius: $BORDER_RADIUS; + height: min-content; + + &__lg { + @include tablet-up { + padding: 1.6rem; + gap: 1.6rem; + border-radius: $BORDER_RADIUS * 2; + } + } + + &__warning { + background: $color-status-warning; + } + + &__information { + background: $color-status-information; + } + + &__announcement { + background: $color-status-announcement; + } + + &__error { + background: $color-status-error; + } + + &__icon { + &__sm { + margin-top: 0.1rem; + + @include mobile { + margin-top: 0; + } + } + + &__md { + margin-top: 0.2rem; + + @include mobile { + margin-top: 0.1rem; + } + } + + &__lg { + @include mobile { + margin-top: 0.2rem; + } + } + } + + &__messages { + display: flex; + flex-direction: column; + flex: 1; + align-self: stretch; + + &__xs { + margin-top: 0.1rem; + + @include mobile { + margin-top: 0.2rem; + } + } + + &__sm { + @include mobile { + margin-top: 0.1rem; + } + } + } +} diff --git a/packages/components/src/components/inline-message/inline-message.tsx b/packages/components/src/components/inline-message/inline-message.tsx new file mode 100644 index 000000000000..dceba9b47216 --- /dev/null +++ b/packages/components/src/components/inline-message/inline-message.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { isMobile } from '@deriv/shared'; +import Icon from '../icon/icon'; +import Text from '../text'; +import './inline-message.scss'; + +const type_to_icon_mapper = { + warning: 'IcAlertWarning', + information: 'IcAlertInfo', + announcement: 'IcAlertAnnounce', + error: 'IcAlertDanger', +}; + +const size_to_font_size_mapper = { + xs: isMobile() ? 'xxxxs' : 'xxxs', + sm: isMobile() ? 'xxxs' : 'xxs', + md: isMobile() ? 'xxs' : 'xs', + lg: isMobile() ? 'xs' : 's', +}; + +type TProps = { + type?: 'warning' | 'information' | 'announcement' | 'error'; + size?: 'xs' | 'sm' | 'md' | 'lg'; +} & RequireAtLeastOne<{ title: React.ReactNode; message: React.ReactNode; children: React.ReactNode }>; + +const InlineMessage: React.FC> = ({ + type = 'warning', + size = 'xs', + title, + message, + children, +}) => { + const icon = type_to_icon_mapper[type]; + const icon_size = size === 'lg' && !isMobile() ? 24 : 16; + const font_size = size_to_font_size_mapper[size]; + + return ( +
+ + + {title && {title}} + {message && {message}} + {children} + +
+ ); +}; + +export default InlineMessage; diff --git a/packages/components/src/components/side-note/index.ts b/packages/components/src/components/side-note/index.ts new file mode 100644 index 000000000000..185681b577ac --- /dev/null +++ b/packages/components/src/components/side-note/index.ts @@ -0,0 +1 @@ +export { default as SideNote } from './side-note'; diff --git a/packages/components/src/components/side-note/side-note.scss b/packages/components/src/components/side-note/side-note.scss new file mode 100644 index 000000000000..378182d54b83 --- /dev/null +++ b/packages/components/src/components/side-note/side-note.scss @@ -0,0 +1,29 @@ +.side-note { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 1.6rem; + background-color: var(--general-section-1); + border-radius: $BORDER_RADIUS * 2; + padding: 1.6rem 2.4rem; + align-self: stretch; + + &__content { + display: flex; + flex-direction: column; + gap: 0.8rem; + align-self: stretch; + } + + &__action { + display: flex; + flex-direction: row; + align-items: center; + gap: 0.4rem; + cursor: pointer; + + :hover { + text-decoration: underline; + } + } +} diff --git a/packages/components/src/components/side-note/side-note.tsx b/packages/components/src/components/side-note/side-note.tsx new file mode 100644 index 000000000000..bbbca30eb4d2 --- /dev/null +++ b/packages/components/src/components/side-note/side-note.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { isMobile } from '@deriv/shared'; +import Icon from '../icon/icon'; +import Text from '../text'; +import './side-note.scss'; + +type TProps = { + action?: { onClick: VoidFunction; label: React.ReactNode }; +} & RequireAtLeastOne<{ title: React.ReactNode; description: React.ReactNode; children: React.ReactNode }>; + +const SideNote: React.FC> = ({ title, description, action, children }) => { + const title_font_size = isMobile() ? 'xxs' : 'xs'; + const content_font_size = isMobile() ? 'xxxs' : 'xxs'; + + return ( +
+
+ {title && ( + + {title} + + )} + {(description || children) && ( + + {description && {description}} + {children} + + )} +
+ {action && ( +
+ + {action?.label} + + +
+ )} +
+ ); +}; + +export default SideNote; diff --git a/packages/components/src/index.js b/packages/components/src/index.js index 467c1727bccf..3e540a041adb 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.js @@ -55,6 +55,7 @@ export { default as Icon } from './components/icon'; export { default as IconTradeTypes } from './components/icon-trade-types'; // export { default as Icon/icons.js } from './components/icon/icons.js'; export { default as InfiniteDataList } from './components/infinite-data-list'; +export * from './components/inline-message'; export { default as Input } from './components/input'; export { default as InputField } from './components/input-field'; export { default as InputWithCheckbox } from './components/input-wth-checkbox'; @@ -90,6 +91,7 @@ export { default as RouteWithSubroutes } from './components/route-with-subroutes export { default as SelectNative } from './components/select-native'; export { default as StaticUrl } from './components/static-url'; export { default as SendEmailTemplate } from './components/send-email-template'; +export * from './components/side-note'; export { default as StatusBadge } from './components/status-badge'; export { default as SwipeableWrapper } from './components/swipeable-wrapper'; export { default as RelativeDatepicker } from './components/relative-datepicker'; diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 36572221fcf2..a008e8fe3a29 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -6,6 +6,7 @@ "dependencies": { "@deriv/api": "^1.0.0", "@deriv/stores": "^1.0.0", + "@deriv/utils": "^1.0.0", "react": "^17.0.2" }, "devDependencies": { diff --git a/packages/hooks/src/__tests__/useCurrencyConfig.spec.tsx b/packages/hooks/src/__tests__/useCurrencyConfig.spec.tsx new file mode 100644 index 000000000000..36ff5a724f39 --- /dev/null +++ b/packages/hooks/src/__tests__/useCurrencyConfig.spec.tsx @@ -0,0 +1,41 @@ +import * as React from 'react'; +import { APIProvider, useFetch } from '@deriv/api'; +import { renderHook } from '@testing-library/react-hooks'; +import useCurrencyConfig from '../useCurrencyConfig'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useFetch: jest.fn(), +})); + +const mockUseFetch = useFetch as jest.MockedFunction>; + +describe('useCurrencyConfig', () => { + test("should return undefined if the currency doesn't exist in currencies_config", () => { + // @ts-expect-error need to come up with a way to mock the return type of useFetch + mockUseFetch.mockReturnValue({}); + + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + const { result } = renderHook(() => useCurrencyConfig(), { wrapper }); + + expect(result.current.getConfig('USD')).toBe(undefined); + }); + + test('should return currency config object for the given currency', () => { + mockUseFetch.mockReturnValue({ + // @ts-expect-error need to come up with a way to mock the return type of useFetch + data: { website_status: { currencies_config: { USD: { type: 'fiat', name: 'US Dollar' } } } }, + }); + + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + const { result } = renderHook(() => useCurrencyConfig(), { wrapper }); + + expect(result.current.getConfig('USD')?.code).toBe('USD'); + expect(result.current.getConfig('USD')?.icon).toBe('IcCurrencyUsd'); + expect(result.current.getConfig('USD')?.is_fiat).toBe(true); + expect(result.current.getConfig('USD')?.is_crypto).toBe(false); + expect(result.current.getConfig('USD')?.is_USD).toBe(true); + }); +}); diff --git a/packages/hooks/src/__tests__/useDepositCryptoAddress.spec.tsx b/packages/hooks/src/__tests__/useDepositCryptoAddress.spec.tsx new file mode 100644 index 000000000000..705bbd2a87bf --- /dev/null +++ b/packages/hooks/src/__tests__/useDepositCryptoAddress.spec.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { APIProvider, useRequest } from '@deriv/api'; +import { renderHook } from '@testing-library/react-hooks'; +import useDepositCryptoAddress from '../useDepositCryptoAddress'; + +jest.mock('@deriv/api', () => ({ + ...jest.requireActual('@deriv/api'), + useRequest: jest.fn(() => ({ mutate: jest.fn() })), +})); + +// @ts-expect-error need to come up with a way to mock the return type of useFetch +const mockUseRequest = useRequest as jest.MockedFunction>; + +describe('useDepositCryptoAddress', () => { + test('should return undefined if the response is not ready yet', () => { + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + const { result } = renderHook(() => useDepositCryptoAddress(), { wrapper }); + + expect(result.current.data).toBe(undefined); + }); + + test('should return the crypto deposit address', () => { + const address = 'bc1q5wklqjz05jhcdkajlwsl673g97z3te5cktf7xg'; + mockUseRequest.mockReturnValue({ + // @ts-expect-error need to come up with a way to mock the return type of useFetch + data: { cashier: { deposit: { address } } }, + mutate: jest.fn(), + }); + + const wrapper = ({ children }: { children: JSX.Element }) => {children}; + + const { result } = renderHook(() => useDepositCryptoAddress(), { wrapper }); + + expect(result.current.data).toBe(address); + }); +}); diff --git a/packages/hooks/src/__tests__/useInputATMFormatter.spec.tsx b/packages/hooks/src/__tests__/useInputATMFormatter.spec.tsx new file mode 100644 index 000000000000..7d64a683059f --- /dev/null +++ b/packages/hooks/src/__tests__/useInputATMFormatter.spec.tsx @@ -0,0 +1,87 @@ +import { RenderResult, act, renderHook } from '@testing-library/react-hooks'; +import useInputATMFormatter from '../useInputATMFormatter'; + +const type = ( + input: RenderResult>, + characters: string[], + replace?: boolean +) => { + characters.forEach(char => { + let new_value = `${input.current.value}${char}`; + + if (replace) new_value = char; + if (char === 'BACKSPACE') new_value = `${input.current.value.substring(0, input.current.value.length - 1)}`; + + act(() => input.current.onChange({ target: { value: new_value } })); + }); +}; + +describe('useInputATMFormatter', () => { + test('should format the initial value correctly when initial value is undefined', async () => { + const { result } = renderHook(() => useInputATMFormatter()); + + expect(result.current.value).toBe('0.00'); + }); + + test('should format the initial value correctly when initial value is provided', async () => { + const { result } = renderHook(() => useInputATMFormatter(1234.56)); + + expect(result.current.value).toBe('1,234.56'); + }); + + test('should format the initial value correctly when locale is es-ES', async () => { + const { result } = renderHook(() => useInputATMFormatter(12345.678, { locale: 'es-ES' })); + + expect(result.current.value).toBe('12.345,67'); + }); + + test('should shift the numbers to left while user is typing', () => { + const { result } = renderHook(() => useInputATMFormatter()); + + type(result, ['1', '2', '3', '4', '5']); + + expect(result.current.value).toBe('123.45'); + }); + + test('should shift the numbers to left while user is typing with 3 fraction digits', () => { + const { result } = renderHook(() => useInputATMFormatter(0, { fraction_digits: 3 })); + + type(result, ['1', '2', '3', '4', '5']); + + expect(result.current.value).toBe('12.345'); + }); + + test('should shift the numbers correctly when user removes something while typing', () => { + const { result } = renderHook(() => useInputATMFormatter()); + + type(result, ['1', '2', '3', '4', 'BACKSPACE', '5']); + + expect(result.current.value).toBe('12.35'); + }); + + test('should shift the numbers correctly when user changes something in the middle of the input', () => { + const { result } = renderHook(() => useInputATMFormatter(0, { fraction_digits: 3 })); + + type(result, ['1', '2', '3', '4', 'BACKSPACE']); + act(() => result.current.onChange({ target: { value: `${result.current.value.replace('2', '9')}` } })); + type(result, ['5', 'BACKSPACE', '8']); + + expect(result.current.value).toBe('1.938'); + }); + + test('should shift the numbers correctly when user types zeros', () => { + const { result } = renderHook(() => useInputATMFormatter()); + + type(result, ['1', '0', '1', '0', 'BACKSPACE', '1']); + + expect(result.current.value).toBe('10.11'); + }); + + test('should format correctly on paste when decimal points are more than accepted', () => { + const { result } = renderHook(() => useInputATMFormatter()); + + type(result, ['1234.5678'], true); + + expect(result.current.value).toBe('1,234.56'); + }); +}); diff --git a/packages/hooks/src/__tests__/useInputDecimalFormatter.spec.tsx b/packages/hooks/src/__tests__/useInputDecimalFormatter.spec.tsx new file mode 100644 index 000000000000..9324f409299b --- /dev/null +++ b/packages/hooks/src/__tests__/useInputDecimalFormatter.spec.tsx @@ -0,0 +1,113 @@ +import { RenderResult, act, renderHook } from '@testing-library/react-hooks'; +import useInputDecimalFormatter from '../useInputDecimalFormatter'; + +const type = ( + input: RenderResult>, + characters: string[], + replace?: boolean +) => { + characters.forEach(char => { + let new_value = `${input.current.value}${char}`; + + if (replace) new_value = char; + if (char === 'BACKSPACE') new_value = `${input.current.value.substring(0, input.current.value.length - 1)}`; + + act(() => input.current.onChange({ target: { value: new_value } })); + }); +}; + +describe('useInputDecimalFormatter', () => { + test('should format the initial value correctly', () => { + const { result } = renderHook(() => useInputDecimalFormatter(69.42)); + + expect(result.current.value).toBe('69.42'); + }); + + test('should only accept numbers', () => { + const { result } = renderHook(() => useInputDecimalFormatter()); + + type(result, ['-', 'f', '4', 'o', '*', '+', '2', '/', 'b', 'a', '0']); + + expect(result.current.value).toBe('420'); + }); + + test('should only accept dot after zero if it starts with zero', () => { + const { result } = renderHook(() => useInputDecimalFormatter()); + + type(result, ['0', '6', '9', '.']); + + expect(result.current.value).toBe('0.'); + }); + + test('should only accept three fractional digits after dot', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { fraction_digits: 3 })); + + type(result, ['0', '2', '0', '.', '8', 'x', '5', '4', '2', '0']); + + expect(result.current.value).toBe('0.854'); + }); + + test('should only accept one dot', () => { + const { result } = renderHook(() => useInputDecimalFormatter()); + + type(result, ['0', '2', '0', '.', '8', '.', '5', '4']); + + expect(result.current.value).toBe('0.85'); + }); + + test('should only accept dot after zero if it starts with signed zero', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['-', '0', '-', '6', '9', '.']); + + expect(result.current.value).toBe('-0.'); + }); + + test('should accept negative sign', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['-', '6', '9', '.', '4', '2', '0']); + + expect(result.current.value).toBe('-69.42'); + }); + + test('should accept positive sign', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['+', '6', '9', '.', '4', '2', '0']); + + expect(result.current.value).toBe('+69.42'); + }); + + test('should only accept negative sign as starting character', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['-', '6', '9', '-', '4', '2', '0']); + + expect(result.current.value).toBe('-69420'); + }); + + test('should only accept positive sign as starting character', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['+', '6', '9', '+', '4', '2', '0']); + + expect(result.current.value).toBe('+69420'); + }); + + test('should work with random inputs', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['0.85', '', '-69', '00.00', 'foo', '+4.20'], true); + + expect(result.current.value).toBe('+4.20'); + }); + + test('should not accept + or - signs after dot', () => { + const { result } = renderHook(() => useInputDecimalFormatter(0, { with_sign: true })); + + type(result, ['+', '+.', '+.-', '+.0-', '+2.02'], true); + + expect(result.current.value).toBe('+2.02'); + }); +}); diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts index 653f867cea6a..fa43af674ed7 100644 --- a/packages/hooks/src/index.ts +++ b/packages/hooks/src/index.ts @@ -5,6 +5,8 @@ export { default as useCFDDemoAccounts } from './useCFDDemoAccounts'; export { default as useCFDRealAccounts } from './useCFDRealAccounts'; export { default as useCashierLocked } from './useCashierLocked'; export { default as useCountdown } from './useCountdown'; +export { default as useCurrencyConfig } from './useCurrencyConfig'; +export { default as useDepositCryptoAddress } from './useDepositCryptoAddress'; export { default as useDepositLocked } from './useDepositLocked'; export { default as useExchangeRate } from './useExchangeRate'; export { default as useFeatureFlags } from './useFeatureFlags'; @@ -17,6 +19,8 @@ export { default as useHasSetCurrency } from './useHasSetCurrency'; export { default as useHasSvgAccount } from './useHasSvgAccount'; export { default as useHasSwapFreeAccount } from './useHasSwapFreeAccount'; export { default as useHasUSDCurrency } from './useHasUSDCurrency'; +export { default as useInputATMFormatter } from './useInputATMFormatter'; +export { default as useInputDecimalFormatter } from './useInputDecimalFormatter'; export { default as useIsP2PEnabled } from './useIsP2PEnabled'; export { default as useIsRealAccountNeededForCashier } from './useIsRealAccountNeededForCashier'; export { default as useIsSystemMaintenance } from './useIsSystemMaintenance'; diff --git a/packages/hooks/src/useCurrencyConfig.ts b/packages/hooks/src/useCurrencyConfig.ts new file mode 100644 index 000000000000..30712fb4bd11 --- /dev/null +++ b/packages/hooks/src/useCurrencyConfig.ts @@ -0,0 +1,81 @@ +import { useCallback, useMemo } from 'react'; +import { useFetch } from '@deriv/api'; + +/** A custom hook to get the currency config information from `website_status` endpoint */ +const useCurrencyConfig = () => { + const { data } = useFetch('website_status'); + + const currencies_config = useMemo(() => { + if (!data?.website_status?.currencies_config) return undefined; + + const modified_currencies_config = Object.keys(data.website_status.currencies_config).map(currency => { + const currency_config = data?.website_status?.currencies_config[currency]; + + return { + ...currency_config, + /** determine if the currency is a `crypto` currency */ + is_crypto: currency_config?.type === 'crypto', + /** determine if the currency is a `fiat` currency */ + is_fiat: currency_config?.type === 'fiat', + /** determine if the currency is `Australian Dollar` */ + is_AUD: currency === 'AUD', + /** determine if the currency is `US Dollar` */ + is_USD: currency === 'USD', + /** determine if the currency is `Euro` */ + is_EUR: currency === 'EUR', + /** determine if the currency is `Pound Sterling` */ + is_GBP: currency === 'GBP', + /** determine if the currency is `Bitcoin` */ + is_BTC: currency === 'BTC', + /** determine if the currency is `Ethereum` */ + is_ETH: currency === 'ETH', + /** determine if the currency is `Litecoin` */ + is_LTC: currency === 'LTC', + /** determine if the currency is `Multi-Collateral DAI` */ + is_DAI: currency === 'DAI', + /** determine if the currency is `IDK` */ + is_IDK: currency === 'IDK', + /** determine if the currency is `Paxos Standard` */ + is_PAX: currency === 'PAX', + /** determine if the currency is `Binary Coin` */ + is_USB: currency === 'USB', + /** determine if the currency is `Tether Omni` */ + is_USDT: currency === 'UST', + /** determine if the currency is `True USD` */ + is_TUSD: currency === 'TUSD', + /** determine if the currency is `Binance USD` */ + is_BUSD: currency === 'BUSD', + /** determine if the currency is `STATIS Euro` */ + is_EURS: currency === 'EURS', + /** determine if the currency is `Tether ERC20` */ + is_eUSDT: currency === 'eUSDT', + /** determine if the currency is `Tether TRC20` */ + is_tUSDT: currency === 'tUSDT', + /** determine if the currency is `USD Coin` */ + is_USDC: currency === 'USDC', + /** determine if the currency is `USDK` */ + is_USDK: currency === 'USDK', + /** Currency code */ + code: currency, + /** Local asset name for the currency icon. ex: `IcCurrencyUsd` for `USD` */ + icon: `IcCurrency${currency[0].toUpperCase() + currency.slice(1).toLowerCase()}`, + }; + }); + + return modified_currencies_config.reduce>( + (previous, current) => ({ ...previous, [current.code]: current }), + {} + ); + }, [data?.website_status?.currencies_config]); + + const getConfig = useCallback((currency: string) => currencies_config?.[currency], [currencies_config]); + + return { + /** Returns the currency config object for the given currency */ + getConfig, + /** Available currencies and their information */ + currencies_config, + }; +}; + +export default useCurrencyConfig; diff --git a/packages/hooks/src/useDepositCryptoAddress.ts b/packages/hooks/src/useDepositCryptoAddress.ts new file mode 100644 index 000000000000..324e6e493432 --- /dev/null +++ b/packages/hooks/src/useDepositCryptoAddress.ts @@ -0,0 +1,24 @@ +import { useCallback, useEffect } from 'react'; +import { useRequest } from '@deriv/api'; + +const useDepositCryptoAddress = () => { + const { data, mutate, ...rest } = useRequest('cashier'); + const deposit_address = typeof data?.cashier !== 'string' ? data?.cashier?.deposit?.address : undefined; + + const send = useCallback( + () => mutate({ payload: { cashier: 'deposit', provider: 'crypto', type: 'api' } }), + [mutate] + ); + + useEffect(() => { + send(); + }, [send]); + + return { + ...rest, + resend: send, + data: deposit_address, + }; +}; + +export default useDepositCryptoAddress; diff --git a/packages/hooks/src/useInputATMFormatter.ts b/packages/hooks/src/useInputATMFormatter.ts new file mode 100644 index 000000000000..ead70d7e807c --- /dev/null +++ b/packages/hooks/src/useInputATMFormatter.ts @@ -0,0 +1,91 @@ +import { useCallback, useEffect, useMemo, useRef } from 'react'; +import { unFormatLocaleString } from '@deriv/utils'; +import useInputDecimalFormatter from './useInputDecimalFormatter'; + +type TOptions = { + fraction_digits?: number; + locale?: Intl.LocalesArgument; +}; + +const useInputATMFormatter = (initial?: number, options?: TOptions) => { + const is_pasting = useRef(false); + const { value, onChange: onChangeDecimal } = useInputDecimalFormatter(undefined, options); + const { locale, fraction_digits = 2 } = options || {}; + + const formatted_value = useMemo( + () => `${Number(value).toLocaleString(locale, { minimumFractionDigits: fraction_digits })}`, + [fraction_digits, locale, value] + ); + + const onChange = useCallback( + (e: DeepPartial> | React.ChangeEvent) => { + const new_value = e?.target?.value || ''; + const unformatted = unFormatLocaleString(new_value, locale); + // @ts-expect-error shouldn't cast to number because we will lose the trailing zeros. + const shifted = Math.fround(unformatted * 10).toFixed(fraction_digits); + // @ts-expect-error shouldn't cast to number because we will lose the trailing zeros. + const un_shifted = Math.fround(unformatted / 10).toFixed(fraction_digits); + const unformatted_fraction = unformatted.split('.')?.[1]?.length || fraction_digits; + + // If the user is pasting, we don't need to shift the decimal point, + // We just need to format the value. + if (is_pasting.current) { + is_pasting.current = false; + return onChangeDecimal({ target: { value: unformatted } }); + } + + // The new value has one more decimal places than the fraction_digits, + // so we need to shift the decimal point to the left. + if (unformatted_fraction - 1 === fraction_digits) { + return onChangeDecimal({ target: { value: shifted } }); + } + + // The new value has one less decimal places than the fraction_digits, + // so we need to shift the decimal point to the right. + if (unformatted_fraction + 1 === fraction_digits) { + return onChangeDecimal({ target: { value: un_shifted } }); + } + + // The new value has the same number of decimal places as the fraction_digits, + // so we don't need to shift the decimal point. + if (unformatted_fraction === fraction_digits) { + return onChangeDecimal({ target: { value: unformatted } }); + } + + // The new value has more decimal places than the fraction_digits, + // so we chop the extra decimal points. + if (unformatted_fraction - 1 > fraction_digits) { + return onChangeDecimal({ target: { value: unformatted } }); + } + + // The new value has less decimal places than the fraction_digits, + // so we add the missing extra decimal point. + if (unformatted_fraction + 1 < fraction_digits) { + return onChangeDecimal({ target: { value: unformatted } }); + } + + return onChangeDecimal({ target: { value: unformatted } }); + }, + [locale, fraction_digits, onChangeDecimal] + ); + + const onPaste: React.ClipboardEventHandler = useCallback( + e => (is_pasting.current = e.type === 'paste'), + [] + ); + + useEffect(() => { + if (initial) { + is_pasting.current = true; + onChange({ + target: { + value: `${Number(initial).toLocaleString(locale, { minimumFractionDigits: fraction_digits })}`, + }, + }); + } + }, [fraction_digits, initial, locale, onChange]); + + return { value: formatted_value, onChange, onPaste }; +}; + +export default useInputATMFormatter; diff --git a/packages/hooks/src/useInputDecimalFormatter.ts b/packages/hooks/src/useInputDecimalFormatter.ts new file mode 100644 index 000000000000..ea229c620870 --- /dev/null +++ b/packages/hooks/src/useInputDecimalFormatter.ts @@ -0,0 +1,72 @@ +import { useCallback, useEffect, useState } from 'react'; + +type TOptions = { + fraction_digits?: number; + with_sign?: boolean; +}; + +const useInputDecimalFormatter = (initial?: number, options?: TOptions) => { + const [value, setValue] = useState(''); + const { fraction_digits = 2, with_sign = false } = options || {}; + + const onChange = useCallback( + (e: DeepPartial> | React.ChangeEvent) => { + setValue(old_value => { + const new_value = e?.target?.value || ''; + const isEmpty = new_value === ''; + + // The field has been cleared, So we return the new value. + if (isEmpty) return new_value; + + const text = with_sign ? new_value : new_value.replaceAll(/[+-]/g, ''); + const inputs = text.split('.'); + + // The field contains more than one dot, So we return the old value as only one dot + // is allowed. + if (inputs.length > 2) return old_value; + + const left = inputs[0]; + const right = inputs.length > 1 ? inputs[1] : null; + const has_right = right !== null && right !== ''; + + // The field value is positive or negative sign, So we return the new value without + // any calculations. + if ((left === '-' || left === '+') && !has_right) return new_value; + + // The field value is 0, So we return the new value without any calculations. + if (left === '0' && !has_right) return new_value; + + const is_number = !isNaN(Number(new_value)); + + // The input value is not a valid number, So we return the old value. + if (!is_number) return old_value; + + const new_left = left.replaceAll(/[+-]/g, ''); + const has_decimal = new_value.includes('.'); + + // The field starts with 0 but doesn't have decimal point, So we return the old value + // as the only valid input at this step is decimal point. + if (new_left.startsWith('0') && new_left.length !== 1 && !has_decimal) return old_value; + + // The field have a decimal point and decimal places are already as allowed fraction + // digits, So we remove the extra decimal digits from the right and return the new value. + if (has_right && right.length > fraction_digits) { + const new_right = right.substring(0, fraction_digits); + + return `${left}.${new_right}`; + } + + return new_value; + }); + }, + [fraction_digits, with_sign] + ); + + useEffect(() => { + if (initial) onChange({ target: { value: `${initial}` } }); + }, [initial, onChange]); + + return { value, onChange }; +}; + +export default useInputDecimalFormatter; diff --git a/packages/p2p/src/components/orders/orders.scss b/packages/p2p/src/components/orders/orders.scss index 69b915d2bae8..ca8c454bc6fb 100644 --- a/packages/p2p/src/components/orders/orders.scss +++ b/packages/p2p/src/components/orders/orders.scss @@ -212,7 +212,7 @@ &--danger { color: var(--brand-red-coral); - background-color: rgba(236, 63, 63, 0.16); + background-color: $color-status-error; } &--alert { color: var(--status-warning); @@ -220,7 +220,7 @@ } &--success { color: var(--text-profit-success); - background-color: rgba(75, 180, 179, 0.16); + background-color: $color-status-announcement; } &--disabled { color: var(--text-less-prominent); diff --git a/packages/shared/src/styles/constants.scss b/packages/shared/src/styles/constants.scss index 1c2216a40054..4b7fd385221d 100644 --- a/packages/shared/src/styles/constants.scss +++ b/packages/shared/src/styles/constants.scss @@ -65,6 +65,12 @@ $color-yellow-1: #b3760d; $color-yellow-2: #ffa912; $color-yellow-3: rgba(255, 173, 58, 0.16); +/* status colors */ +$color-status-warning: rgba(255, 173, 58, 0.16); +$color-status-information: rgba(55, 124, 252, 0.16); +$color-status-announcement: rgba(75, 180, 179, 0.16); +$color-status-error: rgba(236, 63, 63, 0.16); + /* alpha colors */ $alpha-color-black-1: transparentize($color-black-7, 0.28); $alpha-color-black-2: transparentize($color-black, 0.04); diff --git a/types/utils.d.ts b/types/utils.d.ts index b40dfa643381..20e842a31490 100644 --- a/types/utils.d.ts +++ b/types/utils.d.ts @@ -41,6 +41,15 @@ declare global { : Required; type NoStringIndex = { [K in keyof T as string extends K ? never : K]: T[K] }; + + type Prettify = { + [K in keyof T]: T[K]; + // eslint-disable-next-line @typescript-eslint/ban-types + } & {}; + + type RequireAtLeastOne = { + [K in keyof T]-?: Required> & Partial>>; + }[keyof T]; } export {}; From 3059cb3c0e3e2fee78b8a8eea3d0757f95813f64 Mon Sep 17 00:00:00 2001 From: kate-deriv <121025168+kate-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:13:48 +0300 Subject: [PATCH 014/104] Kate / Update text content for accumulators (#8606) * feat: update text content for accumulators * chore: add new text for tp and sl for bot * chore: update tests according to content changes * feat: add new text content * refactor: test improvements * feat: change table header text in reports for acc * chore: add new text in open positions dropdown * chore: add lower case * chore: add initial stake in open pos reports * chore: empty commit * chore: add imports --------- Co-authored-by: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> --- .../Trade Definition/multiplier_stop_loss.js | 8 ++----- .../multiplier_take_profit.js | 8 ++----- packages/bot-web-ui/src/constants/contract.js | 1 + .../accumulator-card-body.jsx | 4 ++-- .../src/Constants/data-table-constants.tsx | 8 +++---- .../reports/src/Containers/open-positions.tsx | 2 +- .../reports/src/sass/app/modules/reports.scss | 2 +- .../shared/src/utils/constants/contract.tsx | 1 + packages/trader/src/Constants/contract.js | 1 + .../Accumulator/__tests__/accumulator.spec.js | 2 +- .../accumulators-info-display.spec.js | 4 ++-- .../TradeParams/Accumulator/accumulator.jsx | 4 ++-- .../Accumulator/accumulators-info-display.jsx | 21 ++++++++++++++----- .../Form/TradeParams/Multiplier/stop-loss.jsx | 4 +--- .../TradeParams/Multiplier/take-profit.jsx | 2 +- .../Form/TradeParams/Multiplier/widgets.jsx | 2 +- .../Containers/radio-group-options-modal.jsx | 2 +- .../trader/src/sass/app/modules/reports.scss | 2 +- .../trader/src/sass/app/modules/trading.scss | 15 +++++++------ 19 files changed, 48 insertions(+), 45 deletions(-) diff --git a/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_stop_loss.js b/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_stop_loss.js index c17e8570157d..7968a78aef7e 100644 --- a/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_stop_loss.js +++ b/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_stop_loss.js @@ -29,18 +29,14 @@ Blockly.Blocks.multiplier_stop_loss = { colourTertiary: Blockly.Colours.Base.colourTertiary, previousStatement: null, nextStatement: null, - tooltip: localize( - 'Your contract is closed automatically when your loss is more than or equals to this amount.' - ), + tooltip: localize('Your contract will be closed automatically if your loss reaches this amount.'), category: Blockly.Categories.Trade_Definition, }; }, meta() { return { display_name: localize('Stop loss'), - description: localize( - 'Your contract is closed automatically when your loss is more than or equals to this amount.' - ), + description: localize('Your contract will be closed automatically if your loss reaches this amount.'), }; }, onchange(event) { diff --git a/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_take_profit.js b/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_take_profit.js index 23890b01ff4d..c9811fa26fdd 100644 --- a/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_take_profit.js +++ b/packages/bot-skeleton/src/scratch/blocks/Binary/Trade Definition/multiplier_take_profit.js @@ -29,18 +29,14 @@ Blockly.Blocks.multiplier_take_profit = { colourTertiary: Blockly.Colours.Base.colourTertiary, previousStatement: null, nextStatement: null, - tooltip: localize( - 'Your contract is closed automatically when your profit is more than or equals to this amount.' - ), + tooltip: localize('Your contract will be closed automatically if your profit reaches this amount.'), category: Blockly.Categories.Trade_Definition, }; }, meta() { return { display_name: localize('Take Profit'), - description: localize( - 'Your contract is closed automatically when your profit is more than or equals to this amount.' - ), + description: localize('Your contract will be closed automatically if your profit reaches this amount.'), }; }, onchange(event) { diff --git a/packages/bot-web-ui/src/constants/contract.js b/packages/bot-web-ui/src/constants/contract.js index 55b89c3971ce..6f0fb05e38c4 100644 --- a/packages/bot-web-ui/src/constants/contract.js +++ b/packages/bot-web-ui/src/constants/contract.js @@ -16,6 +16,7 @@ export const getCardLabels = () => ({ PROFIT_LOSS: localize('Profit/Loss:'), POTENTIAL_PROFIT_LOSS: localize('Potential profit/loss:'), INDICATIVE_PRICE: localize('Indicative price:'), + INITIAL_STAKE: localize('Initial stake:'), PAYOUT: localize('Sell Price:'), PURCHASE_PRICE: localize('Buy price:'), POTENTIAL_PAYOUT: localize('Payout limit:'), diff --git a/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.jsx b/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.jsx index 5dabbae66fc7..0a7f1cda3c9d 100644 --- a/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.jsx +++ b/packages/components/src/components/contract-card/contract-card-items/accumulator-card-body.jsx @@ -30,12 +30,12 @@ const AccumulatorCardBody = ({ const { buy_price, profit, limit_order, sell_price } = contract_info; const { take_profit } = getLimitOrderAmount(contract_update || limit_order); const is_valid_to_sell = isValidToSell(contract_info); - const { CURRENT_STAKE, STAKE, TAKE_PROFIT, TOTAL_PROFIT_LOSS } = getCardLabels(); + const { CURRENT_STAKE, INITIAL_STAKE, TAKE_PROFIT, TOTAL_PROFIT_LOSS } = getCardLabels(); return (
- + diff --git a/packages/reports/src/Constants/data-table-constants.tsx b/packages/reports/src/Constants/data-table-constants.tsx index 81dc94859060..1577cfb117b9 100644 --- a/packages/reports/src/Constants/data-table-constants.tsx +++ b/packages/reports/src/Constants/data-table-constants.tsx @@ -454,9 +454,9 @@ export const getAccumulatorOpenPositionsColumnsTemplate = ({ }, }, { - title: localize('Accumulate'), - col_index: 'accumulator', - renderCellContent: ({ row_obj }: TCellContentProps) => + title: localize('Growth rate'), + col_index: 'growth_rate', + renderCellContent: ({ row_obj }) => row_obj.contract_info && row_obj.contract_info.growth_rate ? `${getGrowthRatePercentage(row_obj.contract_info.growth_rate)}%` : '', @@ -469,7 +469,7 @@ export const getAccumulatorOpenPositionsColumnsTemplate = ({ ), }, { - title: isMobile() ? localize('Total stake') : localize('Stake'), + title: isMobile() ? localize('Total stake') : localize('Initial stake'), col_index: isMobile() ? 'purchase' : 'buy_price', renderCellContent: ({ row_obj }: TCellContentProps) => { if (row_obj.contract_info) { diff --git a/packages/reports/src/Containers/open-positions.tsx b/packages/reports/src/Containers/open-positions.tsx index 9c745e96f1d0..d32e5ab18f30 100644 --- a/packages/reports/src/Containers/open-positions.tsx +++ b/packages/reports/src/Containers/open-positions.tsx @@ -476,7 +476,7 @@ const OpenPositions = ({ const [contract_type_value, setContractTypeValue] = React.useState( contract_types.find(type => type.is_default)?.text || localize('Options') ); - const accumulator_rates = [localize('All rates'), '1%', '2%', '3%', '4%', '5%']; + const accumulator_rates = [localize('All growth rates'), '1%', '2%', '3%', '4%', '5%']; const [accumulator_rate, setAccumulatorRate] = React.useState(accumulator_rates[0]); const is_accumulator_selected = contract_type_value === contract_types[2].text; const is_multiplier_selected = contract_type_value === contract_types[1].text; diff --git a/packages/reports/src/sass/app/modules/reports.scss b/packages/reports/src/sass/app/modules/reports.scss index c0c2c49c568a..c011a5d930fc 100644 --- a/packages/reports/src/sass/app/modules/reports.scss +++ b/packages/reports/src/sass/app/modules/reports.scss @@ -865,7 +865,7 @@ $side-padding: 1.2em; padding-bottom: 0px; } } - .accumulator, + .growth_rate, .buy_price, .payout, .indicative, diff --git a/packages/shared/src/utils/constants/contract.tsx b/packages/shared/src/utils/constants/contract.tsx index 1de3fed50503..f3e162df7878 100644 --- a/packages/shared/src/utils/constants/contract.tsx +++ b/packages/shared/src/utils/constants/contract.tsx @@ -209,6 +209,7 @@ export const getCardLabels = () => ({ PROFIT_LOSS: localize('Profit/Loss:'), POTENTIAL_PROFIT_LOSS: localize('Potential profit/loss:'), INDICATIVE_PRICE: localize('Indicative price:'), + INITIAL_STAKE: localize('Initial stake:'), LOST: localize('Lost'), PAYOUT: localize('Sell price:'), PURCHASE_PRICE: localize('Buy price:'), diff --git a/packages/trader/src/Constants/contract.js b/packages/trader/src/Constants/contract.js index 81b981f0bd4e..64debe49ba5e 100644 --- a/packages/trader/src/Constants/contract.js +++ b/packages/trader/src/Constants/contract.js @@ -27,6 +27,7 @@ export const getCardLabels = () => ({ PROFIT_LOSS: localize('Profit/Loss:'), POTENTIAL_PROFIT_LOSS: localize('Potential profit/loss:'), INDICATIVE_PRICE: localize('Indicative price:'), + INITIAL_STAKE: localize('Initial stake:'), LOST: localize('Lost'), PAYOUT: localize('Sell price:'), PURCHASE_PRICE: localize('Buy price:'), diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js index dbdd1c541d23..54c75b6ccc1e 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulator.spec.js @@ -21,7 +21,7 @@ describe('Accumulator', () => { {children} ), }); - expect(screen.getByText('Accumulate')).toBeInTheDocument(); + expect(screen.getByText('Growth rate')).toBeInTheDocument(); expect(screen.getByText('1%')).toBeInTheDocument(); expect(screen.getByText('2%')).toBeInTheDocument(); expect(screen.getByText('3%')).toBeInTheDocument(); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js index 323ce2276a8f..cd3b55ca40d9 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/__tests__/accumulators-info-display.spec.js @@ -22,9 +22,9 @@ describe('AccumulatorsInfoDisplay', () => { ), }); expect(screen.getByRole('group')).toHaveClass('trade-container__fieldset accu-info-display'); - expect(screen.getByText(/maximum payout/i)).toBeInTheDocument(); + expect(screen.getByText(/max. payout/i)).toBeInTheDocument(); expect(screen.getByText('10,000.00 USD')).toBeInTheDocument(); - expect(screen.getByText(/maximum ticks/i)).toBeInTheDocument(); + expect(screen.getByText(/max. ticks/i)).toBeInTheDocument(); expect(screen.getByText('250 ticks')).toBeInTheDocument(); }); }); diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx index 41fa888784f7..b802226fed17 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Accumulator/accumulator.jsx @@ -24,11 +24,11 @@ const Accumulator = observer(() => { return (
{ const { currency, maximum_payout, maximum_ticks } = useTraderStore(); const content = [ { - label: localize('Maximum payout'), + label: localize('Max. payout'), value: , + tooltip_text: localize('Your contract will be automatically closed when your payout reaches this amount.'), }, { - label: localize('Maximum ticks'), + label: localize('Max. ticks'), value: `${maximum_ticks || 0} ${maximum_ticks === 1 ? localize('tick') : localize('ticks')}`, + tooltip_text: localize('Your contract will be automatically closed upon reaching this number of ticks.'), }, ]; return (
- {content.map(({ label, value }) => ( + {content.map(({ label, value, tooltip_text }) => (
{label} - + {value} +
))} diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx index 359885d07488..c1cff1b1b70d 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/stop-loss.jsx @@ -52,9 +52,7 @@ const StopLoss = observer(props => { name='stop_loss' onChange={changeValue} setCurrentFocus={setCurrentFocus} - tooltip_label={localize( - 'Your contract is closed automatically when your loss is more than or equals to this amount.' - )} + tooltip_label={localize('Your contract will be closed automatically if your loss reaches this amount.')} tooltip_alignment='left' error_message_alignment='left' value={stop_loss} diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx index 74b8c86d8979..5c826feba36d 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/take-profit.jsx @@ -55,7 +55,7 @@ const TakeProfit = observer(props => { onChange={changeValue} setCurrentFocus={setCurrentFocus} tooltip_label={localize( - 'Your contract is closed automatically when your profit is more than or equal to this amount.' + 'Your contract will be closed automatically if your profit reaches this amount.' )} tooltip_alignment='left' error_message_alignment='left' diff --git a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx index 3d73bfdb0205..cfdd0305e532 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/TradeParams/Multiplier/widgets.jsx @@ -96,6 +96,6 @@ export const MultiplierOptionsWidget = observer(() => { export const AccumulatorOptionsWidget = observer(() => { const { growth_rate } = useTraderStore(); const displayed_trade_param = `${getGrowthRatePercentage(growth_rate)}%`; - const modal_title = localize('Accumulate'); + const modal_title = localize('Growth rate'); return ; }); diff --git a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx index 63090bd44529..d3c294d48fe3 100644 --- a/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx +++ b/packages/trader/src/Modules/Trading/Containers/radio-group-options-modal.jsx @@ -41,7 +41,7 @@ const RadioGroupOptionsModal = observer(({ is_open, modal_title, toggleModal }) contract_name='accumulator' current_value_object={{ name: 'growth_rate', value: growth_rate }} info={localize( - 'Your stake will grow by {{growth_rate}}% at every tick starting from the second tick, as long as the price remains within a range of ±{{tick_size_barrier}} from the previous tick price.', + 'Your stake will grow at {{growth_rate}}% per tick as long as the current spot price remains within ±{{tick_size_barrier}} from the previous spot price.', { growth_rate: getGrowthRatePercentage(growth_rate), tick_size_barrier: getTickSizeBarrierPercentage(tick_size_barrier), diff --git a/packages/trader/src/sass/app/modules/reports.scss b/packages/trader/src/sass/app/modules/reports.scss index fa23c05646c5..6b5c4e740926 100644 --- a/packages/trader/src/sass/app/modules/reports.scss +++ b/packages/trader/src/sass/app/modules/reports.scss @@ -814,7 +814,7 @@ $side-padding: 1.2em; padding-bottom: 0px; } } - .accumulator, + .growth_rate, .buy_price, .payout, .indicative, diff --git a/packages/trader/src/sass/app/modules/trading.scss b/packages/trader/src/sass/app/modules/trading.scss index 7b03de5f8f8f..ed301bec8ca9 100644 --- a/packages/trader/src/sass/app/modules/trading.scss +++ b/packages/trader/src/sass/app/modules/trading.scss @@ -132,22 +132,21 @@ padding: 0; } &.accu-info-display { - height: 7rem; + height: 7.6rem; display: flex; flex-direction: column; justify-content: space-between; - padding: 1.5rem 1.6rem; + padding: 1.5rem 0.8rem 1.5rem 1.6rem; - .accu-info-display__row { + .accu-info-display__row, + .accu-info-display__row > div { display: flex; height: 2rem; justify-content: space-between; align-items: center; - span { - line-height: 1rem; - &:not(:first-child) { - flex-shrink: 0; - } + gap: 0.8rem; + .dc-popover__target { + height: 1.6rem; } } } From eacd860b1569c081e58bda00e2e28a455f95096c Mon Sep 17 00:00:00 2001 From: maryia-matskevich-deriv <103181650+maryia-matskevich-deriv@users.noreply.github.com> Date: Mon, 12 Jun 2023 10:28:10 +0300 Subject: [PATCH 015/104] fix: imports of bot-web-ui package (#8895) --- packages/bot-web-ui/src/app/app.js | 2 +- .../bot-web-ui/src/app/dbot-providers.tsx | 4 +-- .../blockly-loading/blockly-loading.tsx | 2 +- .../bot-footer-extensions.tsx | 2 +- .../bot-notification-messages.tsx | 2 +- .../bot-web-ui/src/components/chart/chart.tsx | 8 ++--- .../src/components/chart/toolbar-widgets.tsx | 2 +- .../dashboard/bot-builder/bot-builder.tsx | 2 +- .../toolbar/__tests__/toolbar.spec.tsx | 2 +- .../bot-builder/toolbar/icon-button.tsx | 2 +- .../bot-builder/toolbar/toolbar-icon.tsx | 2 +- .../dashboard/bot-builder/toolbar/toolbar.tsx | 4 +-- .../bot-builder/toolbar/workspace-group.tsx | 2 +- .../toolbox/__tests__/toolbox.spec.tsx | 2 +- .../toolbox/search-box/search-box.tsx | 2 +- .../dashboard/bot-builder/toolbox/toolbox.tsx | 6 ++-- .../bot-builder/workspace-wrapper.tsx | 6 ++-- .../components/dashboard/bot-notification.tsx | 2 +- .../__tests__/dashboard-component.spec.tsx | 4 +-- .../__tests__/user-guide.spec.tsx | 2 +- .../dashboard/dashboard-component/cards.tsx | 4 +-- .../dashboard-component.tsx | 10 +++--- .../dashboard-component/info-panel.tsx | 4 +-- .../load-bot-preview/delete-dialog.tsx | 6 ++-- .../load-bot-preview/google-drive.tsx | 2 +- .../load-bot-preview/icon-radio.tsx | 2 +- .../load-bot-preview/local-footer.tsx | 2 +- .../load-bot-preview/local.tsx | 4 +-- .../load-bot-preview/recent-workspace.tsx | 4 +-- .../load-bot-preview/recent.tsx | 10 +++--- .../load-bot-preview/save-modal.tsx | 12 +++---- .../dashboard/dashboard-component/sidebar.tsx | 2 +- .../stop-bot-modal-content.tsx | 2 +- .../dashboard-component/user-guide.tsx | 2 +- .../src/components/dashboard/dashboard.tsx | 6 ++-- .../components/dashboard/joyride-config.tsx | 8 ++--- .../components.types.ts | 34 +++++++++---------- .../quick-strategy-components/container.tsx | 2 +- .../data/data-fields.ts | 2 +- .../data/data-uniq-input-obj.ts | 4 +-- .../duration-fields.tsx | 4 +-- .../quick-strategy-components/fields.tsx | 2 +- .../quick-strategy-components/footer.tsx | 2 +- .../quick-strategy-components/index.ts | 18 +++++----- .../quick-strategy-components/input-field.tsx | 6 ++-- .../quick-strategy-components/inputs.tsx | 4 +-- .../select-field.tsx | 4 +-- .../quick-strategy-components/selects.tsx | 6 ++-- .../quick-strategy/quick-strategy.tsx | 4 +-- .../src/components/dashboard/tour-guide.tsx | 6 ++-- .../src/components/dashboard/tour-slider.tsx | 8 ++--- .../dashboard/tour-trigger-dialog.tsx | 8 ++--- .../dashboard/tutorial-tab/faq-content.tsx | 4 +-- .../dashboard/tutorial-tab/guide-content.tsx | 4 +-- .../dashboard/tutorial-tab/sidebar.tsx | 12 +++---- .../tutorial-tab/tutorial-content.tsx | 2 +- .../src/components/download/download.tsx | 2 +- .../components/flyout/flyout-block-group.jsx | 4 +-- .../src/components/flyout/flyout.jsx | 6 ++-- .../flyout/help-contents/flyout-help-base.jsx | 10 +++--- packages/bot-web-ui/src/components/index.js | 10 +++--- .../journal-components/filter-dialog.tsx | 4 +-- .../journal/journal-components/filters.tsx | 2 +- .../journal-components/format-message.tsx | 6 ++-- .../journal/journal-components/index.ts | 2 +- .../journal-components/journal-item.tsx | 8 ++--- .../journal-components/journal-loader.tsx | 2 +- .../journal-components/journal-tools.tsx | 6 ++-- .../src/components/journal/journal.tsx | 8 ++--- .../src/components/load-modal/load-modal.tsx | 2 +- .../components/load-modal/local-footer.tsx | 2 +- .../src/components/load-modal/local.tsx | 4 +-- .../load-modal/recent-workspace.tsx | 4 +-- .../src/components/load-modal/recent.tsx | 2 +- .../network-toast-popup.jsx | 2 +- .../src/components/notify-item/index.js | 4 +-- .../components/notify-item/notify-item.jsx | 2 +- .../route-prompt-dialog.tsx | 2 +- .../src/components/run-panel/run-panel.jsx | 14 ++++---- .../src/components/save-modal/save-modal.jsx | 10 +++--- .../self-exclusion/self-exclusion.jsx | 8 ++--- .../src/components/summary/summary-card.tsx | 6 ++-- .../src/components/summary/summary.tsx | 6 ++-- .../trade-animation/trade-animation.jsx | 6 ++-- .../components/transactions/transaction.jsx | 10 +++--- .../components/transactions/transactions.jsx | 8 ++--- packages/bot-web-ui/src/constants/contract.js | 2 +- packages/bot-web-ui/src/stores/app-store.js | 6 ++-- .../bot-web-ui/src/stores/blockly-store.ts | 4 +-- packages/bot-web-ui/src/stores/chart-store.js | 2 +- packages/bot-web-ui/src/stores/connect.js | 2 +- .../bot-web-ui/src/stores/dashboard-store.ts | 10 +++--- .../src/stores/data-collection-store.js | 4 +-- .../bot-web-ui/src/stores/download-store.js | 2 +- .../src/stores/flyout-help-store.js | 2 +- .../bot-web-ui/src/stores/flyout-store.js | 2 +- .../src/stores/google-drive-store.js | 6 ++-- .../bot-web-ui/src/stores/journal-store.js | 8 ++--- .../bot-web-ui/src/stores/load-modal-store.ts | 8 ++--- .../src/stores/quick-strategy-store.ts | 4 +-- packages/bot-web-ui/src/stores/root-store.ts | 22 ++++++------ .../src/stores/route-prompt-dialog-store.js | 2 +- .../bot-web-ui/src/stores/run-panel-store.js | 8 ++--- .../bot-web-ui/src/stores/save-modal-store.ts | 10 +++--- .../src/stores/self-exclusion-store.js | 2 +- .../src/stores/summary-card-store.js | 4 +-- .../bot-web-ui/src/stores/toolbar-store.ts | 4 +-- .../bot-web-ui/src/stores/toolbox-store.js | 4 +-- .../src/stores/transactions-store.js | 4 +-- .../bot-web-ui/src/stores/useDBotStore.tsx | 4 +-- packages/bot-web-ui/src/types/index.ts | 2 +- packages/bot-web-ui/src/types/ws.types.ts | 4 +-- .../bot-web-ui/src/utils/bot-notifications.js | 2 +- .../utils/help-content/help-strings/index.js | 2 +- .../trade_definition_multiplier.js | 2 +- .../src/utils/journal-notifications.js | 2 +- 116 files changed, 289 insertions(+), 289 deletions(-) diff --git a/packages/bot-web-ui/src/app/app.js b/packages/bot-web-ui/src/app/app.js index 9eb24289c859..833a994836d8 100644 --- a/packages/bot-web-ui/src/app/app.js +++ b/packages/bot-web-ui/src/app/app.js @@ -1,6 +1,6 @@ import React from 'react'; -import { makeLazyLoader, moduleLoader } from '@deriv/shared'; import { Loading } from '@deriv/components'; +import { makeLazyLoader, moduleLoader } from '@deriv/shared'; const Bot = makeLazyLoader( () => moduleLoader(() => import(/* webpackChunkName: "bot-web-ui-app", webpackPreload: true */ './app.tsx')), diff --git a/packages/bot-web-ui/src/app/dbot-providers.tsx b/packages/bot-web-ui/src/app/dbot-providers.tsx index 3dc28a6b74bf..501dbbf47bc7 100644 --- a/packages/bot-web-ui/src/app/dbot-providers.tsx +++ b/packages/bot-web-ui/src/app/dbot-providers.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { DBotStoreProvider } from 'Stores/useDBotStore'; import { StoreProvider } from '@deriv/stores'; -import type { TWebSocket, TRootStore } from 'Types'; +import type { TRootStore, TWebSocket } from 'Types'; +import { DBotStoreProvider } from 'Stores/useDBotStore'; const DBotProviders = ({ children, store, WS }: React.PropsWithChildren<{ store: TRootStore; WS: TWebSocket }>) => { return ( diff --git a/packages/bot-web-ui/src/components/blockly-loading/blockly-loading.tsx b/packages/bot-web-ui/src/components/blockly-loading/blockly-loading.tsx index e328cc3796aa..c7338c44f42f 100644 --- a/packages/bot-web-ui/src/components/blockly-loading/blockly-loading.tsx +++ b/packages/bot-web-ui/src/components/blockly-loading/blockly-loading.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Loading } from '@deriv/components'; -import RootStore from 'Stores/index'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; type TBlocklyLoadingProps = { is_loading: boolean; diff --git a/packages/bot-web-ui/src/components/bot-footer-extensions/bot-footer-extensions.tsx b/packages/bot-web-ui/src/components/bot-footer-extensions/bot-footer-extensions.tsx index 9c1cb2e2454f..23dcf927fb0c 100644 --- a/packages/bot-web-ui/src/components/bot-footer-extensions/bot-footer-extensions.tsx +++ b/packages/bot-web-ui/src/components/bot-footer-extensions/bot-footer-extensions.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import RootStore from 'Stores/index'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; import SecurityAndPrivacy from './security-and-privacy'; type TPopulateFooterExtensionsProps = { diff --git a/packages/bot-web-ui/src/components/bot-notification-messages/bot-notification-messages.tsx b/packages/bot-web-ui/src/components/bot-notification-messages/bot-notification-messages.tsx index 203dbee689c6..a61931436508 100644 --- a/packages/bot-web-ui/src/components/bot-notification-messages/bot-notification-messages.tsx +++ b/packages/bot-web-ui/src/components/bot-notification-messages/bot-notification-messages.tsx @@ -1,6 +1,6 @@ +import React from 'react'; import classNames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; diff --git a/packages/bot-web-ui/src/components/chart/chart.tsx b/packages/bot-web-ui/src/components/chart/chart.tsx index 28c4dfcf8930..954002992b9a 100644 --- a/packages/bot-web-ui/src/components/chart/chart.tsx +++ b/packages/bot-web-ui/src/components/chart/chart.tsx @@ -1,14 +1,14 @@ import React from 'react'; +import classNames from 'classnames'; +import { ActiveSymbols, ForgetRequest } from '@deriv/api-types'; // TODO Remove this after smartcharts is replaced // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { ChartTitle, SmartChart } from '@deriv/deriv-charts'; -import RootStore from 'Stores/index'; +import { isDesktop, isMobile } from '@deriv/shared'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; import ToolbarWidgets from './toolbar-widgets'; -import classNames from 'classnames'; -import { ActiveSymbols, ForgetRequest } from '@deriv/api-types'; -import { isDesktop, isMobile } from '@deriv/shared'; interface TChartProps { chart_type: string; diff --git a/packages/bot-web-ui/src/components/chart/toolbar-widgets.tsx b/packages/bot-web-ui/src/components/chart/toolbar-widgets.tsx index 0f0728a123e4..b3fe6cc97879 100644 --- a/packages/bot-web-ui/src/components/chart/toolbar-widgets.tsx +++ b/packages/bot-web-ui/src/components/chart/toolbar-widgets.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ToolbarWidget, ChartMode, DrawTools, Share, StudyLegend, Views } from '@deriv/deriv-charts'; +import { ChartMode, DrawTools, Share, StudyLegend, ToolbarWidget, Views } from '@deriv/deriv-charts'; import { isDesktop, isMobile } from '@deriv/shared'; type TToolbarWidgetsProps = { diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/bot-builder.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/bot-builder.tsx index 029ee7896aff..2c67df5bcdd9 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/bot-builder.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/bot-builder.tsx @@ -3,12 +3,12 @@ import classNames from 'classnames'; import { DesktopWrapper, MobileWrapper } from '@deriv/components'; import LoadModal from 'Components/load-modal'; import SaveModal from 'Components/save-modal'; -import ReactJoyrideWrapper from '../react-joyride-wrapper'; import AppStore from 'Stores/app-store'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { BOT_BUILDER_TOUR } from '../joyride-config'; import QuickStrategy from '../quick-strategy'; +import ReactJoyrideWrapper from '../react-joyride-wrapper'; import TourSlider from '../tour-slider'; import WorkspaceWrapper from './workspace-wrapper'; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/__tests__/toolbar.spec.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/__tests__/toolbar.spec.tsx index e8447b6d5a23..1e8d30f85574 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/__tests__/toolbar.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/__tests__/toolbar.spec.tsx @@ -1,7 +1,7 @@ import React from 'react'; +import { isDesktop, isMobile } from '@deriv/shared'; import { render, screen } from '@testing-library/react'; import Toolbar from '..'; -import { isDesktop, isMobile } from '@deriv/shared'; jest.mock('Stores/connect', () => ({ __esModule: true, diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/icon-button.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/icon-button.tsx index 2b0215f16380..0800bcf6aaed 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/icon-button.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/icon-button.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Popover, Icon } from '@deriv/components'; +import { Icon, Popover } from '@deriv/components'; import { popover_zindex } from 'Constants/z-indexes'; type TIconButton = { diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar-icon.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar-icon.tsx index 459a1b8bfc58..0feeb407332e 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar-icon.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar-icon.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { popover_zindex } from 'Constants/z-indexes'; import { Icon, Popover } from '@deriv/components'; import { isMobile } from '@deriv/shared'; +import { popover_zindex } from 'Constants/z-indexes'; type TToolbarIcon = { popover_message: string; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar.tsx index e5c659a46611..6dd97fc2ae26 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/toolbar.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { Dialog } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import WorkspaceGroup from './workspace-group'; import ToolbarButton from './toolbar-button'; -import { isMobile } from '@deriv/shared'; +import WorkspaceGroup from './workspace-group'; type TToolbar = { active_tab: string; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/workspace-group.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/workspace-group.tsx index 56ea39e87b53..8c60785c5a99 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/workspace-group.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbar/workspace-group.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { localize } from '@deriv/translations'; -import ToolbarIcon from './toolbar-icon'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; +import ToolbarIcon from './toolbar-icon'; type TWorkspaceGroup = { has_redo_stack: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/__tests__/toolbox.spec.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/__tests__/toolbox.spec.tsx index 6526a1bd1a56..1799cd6428f4 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/__tests__/toolbox.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/__tests__/toolbox.spec.tsx @@ -1,8 +1,8 @@ import React from 'react'; +import { isMobile } from '@deriv/shared'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import Toolbox from '../toolbox'; -import { isMobile } from '@deriv/shared'; jest.mock('Stores/connect', () => ({ __esModule: true, diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/search-box/search-box.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/search-box/search-box.tsx index 055e77a9c1a1..974516a4a022 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/search-box/search-box.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/search-box/search-box.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Field as FormField, Formik, Form, FieldProps } from 'formik'; +import { Field as FormField, FieldProps, Form, Formik } from 'formik'; import { Input } from '@deriv/components'; import { localize } from '@deriv/translations'; import SearchIcon from './search-icon'; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/toolbox.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/toolbox.tsx index 0bcaef559674..a9af8cd157c0 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/toolbox.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/toolbox/toolbox.tsx @@ -1,13 +1,13 @@ import React from 'react'; import classNames from 'classnames'; import { Icon, Text } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { ToolboxItems } from './toolbox-items'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import SearchBox from './search-box'; -import { isMobile } from '@deriv/shared'; import ToolbarButton from '../toolbar/toolbar-button'; +import SearchBox from './search-box'; +import { ToolboxItems } from './toolbox-items'; type TToolbox = { hasSubCategory: (param: HTMLCollection) => boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-builder/workspace-wrapper.tsx b/packages/bot-web-ui/src/components/dashboard/bot-builder/workspace-wrapper.tsx index 11fd55a0dc9d..f51b5284f881 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-builder/workspace-wrapper.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-builder/workspace-wrapper.tsx @@ -1,11 +1,11 @@ import React from 'react'; +import Flyout from 'Components/flyout'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import Flyout from 'Components/flyout'; -import Toolbox from './toolbox'; +import StopBotModal from '../dashboard-component/load-bot-preview/stop-bot-modal'; import Toolbar from './toolbar'; +import Toolbox from './toolbox'; import './workspace.scss'; -import StopBotModal from '../dashboard-component/load-bot-preview/stop-bot-modal'; type TWorkspaceWrapper = { onMount: () => void; diff --git a/packages/bot-web-ui/src/components/dashboard/bot-notification.tsx b/packages/bot-web-ui/src/components/dashboard/bot-notification.tsx index 611acd2cf1db..3f1573ed922b 100644 --- a/packages/bot-web-ui/src/components/dashboard/bot-notification.tsx +++ b/packages/bot-web-ui/src/components/dashboard/bot-notification.tsx @@ -2,8 +2,8 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Toast } from '@deriv/components'; import { localize } from '@deriv/translations'; -import RootStore from 'Stores/root-store'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/root-store'; type TBotNotification = { show_toast: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/dashboard-component.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/dashboard-component.spec.tsx index bb2e0d983862..1444b660a87a 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/dashboard-component.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/dashboard-component.spec.tsx @@ -1,9 +1,9 @@ import React from 'react'; +import { isMobile } from '@deriv/shared'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import UserGuide from '../user-guide'; -import { isMobile } from '@deriv/shared'; import Sidebar from '../sidebar'; +import UserGuide from '../user-guide'; const mock_connect_props = { dialog_options: { diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/user-guide.spec.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/user-guide.spec.tsx index 45962d837079..0a64d5e07cbf 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/user-guide.spec.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/__tests__/user-guide.spec.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import UserGuide from '../user-guide'; import userEvent from '@testing-library/user-event'; +import UserGuide from '../user-guide'; import { mocked_props } from './dashboard-component.spec'; jest.mock('@deriv/components', () => { diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/cards.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/cards.tsx index 70820cae36af..35224f8fa3cd 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/cards.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/cards.tsx @@ -1,9 +1,9 @@ //kept sometihings commented beacuse of mobx to integrate popup functionality here +import React from 'react'; +import classNames from 'classnames'; import { DesktopWrapper, Dialog, Icon, MobileFullPageModal, MobileWrapper, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; -import classNames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import SaveModalStore from 'Stores/save-modal-store'; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/dashboard-component.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/dashboard-component.tsx index 4282fac15c52..dbbdb2a6b28c 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/dashboard-component.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/dashboard-component.tsx @@ -1,14 +1,14 @@ +import React from 'react'; +import classNames from 'classnames'; import { DesktopWrapper, MobileWrapper, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; +import { observer } from '@deriv/stores'; import { localize } from '@deriv/translations'; -import classNames from 'classnames'; -import React from 'react'; +import { useDBotStore } from 'Stores/useDBotStore'; +import Local from './load-bot-preview/local'; import Cards from './cards'; import InfoPanel from './info-panel'; -import Local from './load-bot-preview/local'; import UserGuide from './user-guide'; -import { useDBotStore } from 'Stores/useDBotStore'; -import { observer } from '@deriv/stores'; type TMobileIconGuide = { has_dashboard_strategies: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/info-panel.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/info-panel.tsx index 369b04055449..6b11a21f519d 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/info-panel.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/info-panel.tsx @@ -1,8 +1,8 @@ +import React from 'react'; +import classNames from 'classnames'; import { DesktopWrapper, Icon, MobileWrapper, Modal, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; -import classNames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { SIDEBAR_INTRO } from './constants'; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/delete-dialog.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/delete-dialog.tsx index ed5c3b679a0a..0702af559996 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/delete-dialog.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/delete-dialog.tsx @@ -1,10 +1,10 @@ import React from 'react'; +import localForage from 'localforage'; +import LZString from 'lz-string'; +import { getSavedWorkspaces } from '@deriv/bot-skeleton'; import { Dialog, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; -import { getSavedWorkspaces } from '@deriv/bot-skeleton'; -import LZString from 'lz-string'; -import localForage from 'localforage'; type TDeleteDialog = { is_delete_modal_open: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/google-drive.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/google-drive.tsx index a5d56f29c697..1b1fcee97c26 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/google-drive.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/google-drive.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classnames from 'classnames'; import { Button, Icon, StaticUrl } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; -import { isMobile } from '@deriv/shared'; import RootStore from 'Stores/root-store'; type TGoogleDriveProps = { diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/icon-radio.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/icon-radio.tsx index 52bc7172f068..43252ec061d1 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/icon-radio.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/icon-radio.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; -import { localize } from '@deriv/translations'; import { Text } from '@deriv/components'; +import { localize } from '@deriv/translations'; type TIconRadio = { google_drive_connected: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local-footer.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local-footer.tsx index cf95f2e7bc78..bd73f3be1675 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local-footer.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local-footer.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { Button } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import './index.scss'; -import { isMobile } from '@deriv/shared'; type Nullable = T | null; type TLocalFooter = { diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local.tsx index 4288a49b2f26..a53650b5054c 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/local.tsx @@ -1,10 +1,10 @@ +import React from 'react'; +import classNames from 'classnames'; import { Dialog, Icon, MobileWrapper, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; -import classNames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; import { clearInjectionDiv } from 'Constants/load-modal'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import BotPreview from './bot-preview'; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent-workspace.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent-workspace.tsx index c51ac3379a9b..8aa4f481ecfc 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent-workspace.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent-workspace.tsx @@ -1,10 +1,10 @@ +import React from 'react'; +import classnames from 'classnames'; import { timeSince } from '@deriv/bot-skeleton'; import { save_types } from '@deriv/bot-skeleton/src/constants/save-type'; import { DesktopWrapper, Icon, MobileWrapper, Text } from '@deriv/components'; import { isDesktop, isMobile } from '@deriv/shared'; -import classnames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { useComponentVisibility } from '../../hooks/useComponentVisibility'; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent.tsx index ac4c17f804b2..3652b6931f24 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/recent.tsx @@ -1,16 +1,16 @@ +import React from 'react'; +import classNames from 'classnames'; import { getSavedWorkspaces } from '@deriv/bot-skeleton'; import { MobileWrapper, Text } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { Localize } from '@deriv/translations'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { TWorkspace } from 'Stores/load-modal-store'; +import SaveModal from '../../../save-modal'; import DeleteDialog from './delete-dialog'; -import './index.scss'; import RecentWorkspace from './recent-workspace'; -import { isMobile } from '@deriv/shared'; -import SaveModal from '../../../save-modal'; -import classNames from 'classnames'; +import './index.scss'; type TRecentComponent = { dashboard_strategies: Array; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/save-modal.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/save-modal.tsx index 5b09e7416f9d..47f800ece5e5 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/save-modal.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/load-bot-preview/save-modal.tsx @@ -1,22 +1,22 @@ import React from 'react'; import classNames from 'classnames'; +import { Field, Form, Formik } from 'formik'; +import { config, save_types } from '@deriv/bot-skeleton'; import { Button, Checkbox, Icon, - Modal, - RadioGroup, Input, MobileFullPageModal, - ThemedScrollbars, + Modal, + RadioGroup, Text, + ThemedScrollbars, } from '@deriv/components'; -import { Formik, Form, Field } from 'formik'; +import { isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; -import { config, save_types } from '@deriv/bot-skeleton'; import { connect } from 'Stores/connect'; import IconRadio from './icon-radio'; -import { isMobile } from '@deriv/shared'; type TSaveModalForm = { bot_name: string; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/sidebar.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/sidebar.tsx index dbf3602586d6..18983c8264b5 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/sidebar.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/sidebar.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Icon } from '@deriv/components'; import classNames from 'classnames'; +import { Icon } from '@deriv/components'; import { SIDEBAR_INTRO } from './constants'; import IntroCard from './intro-card'; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/stop-bot-modal-content.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/stop-bot-modal-content.tsx index 72ccd2fbe0d3..49d612739534 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/stop-bot-modal-content.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/stop-bot-modal-content.tsx @@ -1,6 +1,6 @@ +import React from 'react'; import { Dialog, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; -import React from 'react'; export type TStopBotModalContent = { is_running: boolean; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard-component/user-guide.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard-component/user-guide.tsx index 6e69d359ecc7..dac85f096871 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard-component/user-guide.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard-component/user-guide.tsx @@ -1,7 +1,7 @@ +import React from 'react'; import { Icon, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; type TUserGuide = { setActiveTab: (param: number) => void; diff --git a/packages/bot-web-ui/src/components/dashboard/dashboard.tsx b/packages/bot-web-ui/src/components/dashboard/dashboard.tsx index dec5e36b7f82..88491d3d57ac 100644 --- a/packages/bot-web-ui/src/components/dashboard/dashboard.tsx +++ b/packages/bot-web-ui/src/components/dashboard/dashboard.tsx @@ -1,17 +1,17 @@ +import React from 'react'; +import classNames from 'classnames'; import { initTrashCan } from '@deriv/bot-skeleton/src/scratch/hooks/trashcan'; import { DesktopWrapper, Dialog, MobileWrapper, Tabs } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import classNames from 'classnames'; import Chart from 'Components/chart'; import { DBOT_TABS, TAB_IDS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import RunPanel from '../run-panel'; +import RunStrategy from './dashboard-component/run-strategy'; import BotNotification from './bot-notification'; import DashboardComponent from './dashboard-component'; -import RunStrategy from './dashboard-component/run-strategy'; import { DBOT_ONBOARDING, getTourSettings, diff --git a/packages/bot-web-ui/src/components/dashboard/joyride-config.tsx b/packages/bot-web-ui/src/components/dashboard/joyride-config.tsx index 6861081e90cb..b80b88567d94 100644 --- a/packages/bot-web-ui/src/components/dashboard/joyride-config.tsx +++ b/packages/bot-web-ui/src/components/dashboard/joyride-config.tsx @@ -1,10 +1,10 @@ +import { getImageLocation } from '../../public-path'; import React from 'react'; -import { Text, Icon } from '@deriv/components'; -import { Localize, localize } from '@deriv/translations'; import { CallBackProps } from 'react-joyride'; -import { storeSetting, getSetting } from '../../utils/settings'; +import { Icon, Text } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; +import { getSetting, storeSetting } from '../../utils/settings'; import TourGuide from './tour-guide'; -import { getImageLocation } from '../../public-path'; type TJoyrideConfig = Record< 'showProgress' | 'spotlightClicks' | 'disableBeacon' | 'disableOverlay' | 'disableCloseOnEsc', diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/components.types.ts b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/components.types.ts index 4014abff7b7e..808d2df1db42 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/components.types.ts +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/components.types.ts @@ -1,32 +1,32 @@ -import { FormikProps, FormikErrors } from 'formik'; +import { FormikErrors, FormikProps } from 'formik'; import { TCreateStrategy, + TDropdownItems, + TDropdowns, + TDurationOptions, TDurationUnitDropdown, - TTypeStrategiesDropdown, + TFormValues, + TGetSizeDesc, + TInputBaseFields, + TInputsFieldNames, + TMarketOption, TOnChangeDropdownItem, TOnChangeInputValue, TOnHideDropdownList, TOnScrollStopDropdownList, + TQuickStrategyFormValues, + TSelectedValuesSelect, + TSelectsFieldNames, + TSetCurrentFocus, + TSetFieldValue, TSymbolDropdown, - TTradeTypeDropdown, TTradeType, - TDurationOptions, - TSetCurrentFocus, + TTradeTypeDropdown, + TTypeStrategiesDropdown, TTypeStrategy, - TSetFieldValue, - TFormValues, - TMarketOption, - TGetSizeDesc, - TQuickStrategyFormValues, - TSelectsFieldNames, - TDropdowns, - TSelectedValuesSelect, - TDropdownItems, - TInputBaseFields, - TInputsFieldNames, } from '../quick-strategy.types'; -import { TDataUniqInput } from './data/data-uniq-input-obj'; import { TCommonInputsProperties } from './data/common-input-properties'; +import { TDataUniqInput } from './data/data-uniq-input-obj'; export type TQuickStrategyForm = { active_index: number; diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/container.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/container.tsx index 5be8f18bab17..6b97c61ca7f3 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/container.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/container.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { TQuickStrategyProps, TSymbolItem } from '../quick-strategy.types'; -import { QuickStrategyForm, MarketOption, TradeTypeOption } from '.'; +import { MarketOption, QuickStrategyForm, TradeTypeOption } from '.'; const QuickStrategyContainer = (props: TQuickStrategyProps) => { const { diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-fields.ts b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-fields.ts index 84c9376a703f..7f9ab8d5a313 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-fields.ts +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-fields.ts @@ -1,5 +1,5 @@ +import { TDropdownItems, TInputBaseFields, TInputsFieldNames, TSelectsFieldNames } from '../../quick-strategy.types'; import { common_inputs_properties } from '..'; -import { TSelectsFieldNames, TDropdownItems, TInputBaseFields, TInputsFieldNames } from '../../quick-strategy.types'; import { TCommonInputsProperties } from './common-input-properties'; const getMessage = (property: string) => `The bot will stop trading if your total ${property} exceeds this amount.`; diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-uniq-input-obj.ts b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-uniq-input-obj.ts index 2833f020f6e2..f1c1e68dc002 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-uniq-input-obj.ts +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/data/data-uniq-input-obj.ts @@ -1,7 +1,7 @@ import QuickStrategyStore from 'Stores/quick-strategy-store'; -import common_inputs_properties, { TCommonInputsProperties } from './common-input-properties'; -import { TInputUniqFields } from '../../quick-strategy.types'; import RootStore from 'Stores/root-store'; +import { TInputUniqFields } from '../../quick-strategy.types'; +import common_inputs_properties, { TCommonInputsProperties } from './common-input-properties'; const quick_strategy_store = new QuickStrategyStore(RootStore); diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/duration-fields.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/duration-fields.tsx index fdbeb02c8c69..d445de6de724 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/duration-fields.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/duration-fields.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classNames from 'classnames'; -import { SelectField } from '.'; +import { isMobile } from '@deriv/shared'; import { TDropdownItems, TSelectsFieldNames } from '../quick-strategy.types'; import { TDurationFields } from './components.types'; -import { isMobile } from '@deriv/shared'; +import { SelectField } from '.'; const DurationFields = ({ id, diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/fields.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/fields.tsx index 92b9b86f1b83..e1841f17b133 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/fields.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/fields.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { Inputs, Description, Selects, DurationFields, data_fields, data_uniq_input_obj } from '.'; import { TDropdownItems, TDropdowns, TSelectedValuesSelect } from '../quick-strategy.types'; import { TDropdownLists, TQuickStrategyFields, TSelectedValues } from './components.types'; +import { data_fields, data_uniq_input_obj, Description, DurationFields, Inputs, Selects } from '.'; const QuickStrategyFields = React.memo( ({ diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/footer.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/footer.tsx index cd557f9fb51a..7cadb6bacd6a 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/footer.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/footer.tsx @@ -1,7 +1,7 @@ +import React from 'react'; import { Button } from '@deriv/components'; import { isDesktop } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import React from 'react'; import { TQuickStrategyFooter } from './components.types'; const QuickStrategyFooter = ({ diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/index.ts b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/index.ts index 4ea3b3f861bf..807fdec5b73a 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/index.ts +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/index.ts @@ -1,15 +1,15 @@ export { default as QuickStrategyContainer } from './container'; -export { default as QuickStrategyForm } from './form'; -export { default as MarketOption } from './market-option'; -export { default as TradeTypeOption } from './trade-type-option'; -export { default as QuickStrategyFooter } from './footer'; -export { default as QuickStrategyFields } from './fields'; -export { default as data_uniq_input_obj } from './data/data-uniq-input-obj'; export { default as common_inputs_properties } from './data/common-input-properties'; export { default as data_fields } from './data/data-fields'; -export { default as SelectField } from './select-field'; +export { default as data_uniq_input_obj } from './data/data-uniq-input-obj'; +export { default as Description } from './description'; +export { default as DurationFields } from './duration-fields'; +export { default as QuickStrategyFields } from './fields'; +export { default as QuickStrategyFooter } from './footer'; +export { default as QuickStrategyForm } from './form'; export { default as InputField } from './input-field'; export { default as Inputs } from './inputs'; -export { default as Description } from './description'; +export { default as MarketOption } from './market-option'; +export { default as SelectField } from './select-field'; export { default as Selects } from './selects'; -export { default as DurationFields } from './duration-fields'; +export { default as TradeTypeOption } from './trade-type-option'; diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/input-field.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/input-field.tsx index f3062e066e98..d81a723d946b 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/input-field.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/input-field.tsx @@ -1,12 +1,12 @@ -import { Field, FieldProps } from 'formik'; import React from 'react'; +import { Field, FieldProps } from 'formik'; import { Icon, Input, Popover } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { data_fields } from '.'; +import { TFormValues, TInputBaseFields, TInputCommonFields } from '../quick-strategy.types'; import { TDataFields } from './data/data-fields'; import { TDataUniqInput } from './data/data-uniq-input-obj'; -import { TFormValues, TInputBaseFields, TInputCommonFields } from '../quick-strategy.types'; import { TInputFieldProps } from './components.types'; +import { data_fields } from '.'; const InputField = ({ idx, diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/inputs.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/inputs.tsx index 6b37dc15daab..33a9090969dd 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/inputs.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/inputs.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classNames from 'classnames'; -import { InputField } from '.'; +import { isMobile } from '@deriv/shared'; import { TInputsFieldNames } from '../quick-strategy.types'; import { TInputs } from './components.types'; -import { isMobile } from '@deriv/shared'; +import { InputField } from '.'; const Inputs = ({ idx, diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/select-field.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/select-field.tsx index ebd21a4d324d..4f99e9612bd9 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/select-field.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/select-field.tsx @@ -1,6 +1,6 @@ -import { Field, FieldProps } from 'formik'; import React from 'react'; -import { Autocomplete, SelectNative, Icon, IconTradeTypes, Text } from '@deriv/components'; +import { Field, FieldProps } from 'formik'; +import { Autocomplete, Icon, IconTradeTypes, SelectNative, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; import { TFormValues, TSelectsFieldNames } from '../quick-strategy.types'; import { TSelectFieldProps } from './components.types'; diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/selects.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/selects.tsx index 2d48f5bfeb0c..ec2eeaf9473e 100644 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/selects.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy-components/selects.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { SelectField } from '.'; -import { TSelectsFieldNames, TDropdownItems } from '../quick-strategy.types'; -import { TSelects } from './components.types'; import { isMobile } from '@deriv/shared'; +import { TDropdownItems, TSelectsFieldNames } from '../quick-strategy.types'; +import { TSelects } from './components.types'; +import { SelectField } from '.'; const Selects = ({ field_name, diff --git a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy.tsx b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy.tsx index 525d4a2489a6..9401f3905e71 100755 --- a/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy.tsx +++ b/packages/bot-web-ui/src/components/dashboard/quick-strategy/quick-strategy.tsx @@ -1,11 +1,11 @@ +import React from 'react'; import { MobileFullPageModal, Modal } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import { QuickStrategyContainer } from './quick-strategy-components'; import { TQuickStrategyProps } from './quick-strategy.types'; +import { QuickStrategyContainer } from './quick-strategy-components'; const QuickStrategy = (props: TQuickStrategyProps) => { const is_mobile = isMobile(); diff --git a/packages/bot-web-ui/src/components/dashboard/tour-guide.tsx b/packages/bot-web-ui/src/components/dashboard/tour-guide.tsx index d9f845c8b4b4..57519e50dd96 100644 --- a/packages/bot-web-ui/src/components/dashboard/tour-guide.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tour-guide.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { Text, Loading } from '@deriv/components'; -import RootStore from 'Stores/index'; -import { connect } from 'Stores/connect'; +import { Loading, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; +import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; type TTourGuide = { content: string[]; diff --git a/packages/bot-web-ui/src/components/dashboard/tour-slider.tsx b/packages/bot-web-ui/src/components/dashboard/tour-slider.tsx index b87341ca0941..93d11e358546 100644 --- a/packages/bot-web-ui/src/components/dashboard/tour-slider.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tour-slider.tsx @@ -1,10 +1,10 @@ import React from 'react'; -import { ProgressBarOnboarding, Text, Icon } from '@deriv/components'; +import classNames from 'classnames'; +import { Icon, ProgressBarOnboarding, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { BOT_BUILDER_MOBILE, DBOT_ONBOARDING_MOBILE, TStepMobile } from './joyride-config'; -import RootStore from 'Stores/index'; import { connect } from 'Stores/connect'; -import classNames from 'classnames'; +import RootStore from 'Stores/index'; +import { BOT_BUILDER_MOBILE, DBOT_ONBOARDING_MOBILE, TStepMobile } from './joyride-config'; type TTourButton = { type?: string; diff --git a/packages/bot-web-ui/src/components/dashboard/tour-trigger-dialog.tsx b/packages/bot-web-ui/src/components/dashboard/tour-trigger-dialog.tsx index 3022d262862a..67184401340d 100644 --- a/packages/bot-web-ui/src/components/dashboard/tour-trigger-dialog.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tour-trigger-dialog.tsx @@ -1,11 +1,11 @@ import React from 'react'; +import classNames from 'classnames'; import { Dialog, Text } from '@deriv/components'; -import { localize, Localize } from '@deriv/translations'; +import { isMobile } from '@deriv/shared'; +import { Localize, localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import classNames from 'classnames'; -import { isMobile } from '@deriv/shared'; -import { tour_type, setTourSettings, tour_status_ended } from './joyride-config'; +import { setTourSettings, tour_status_ended, tour_type } from './joyride-config'; type TTourTriggrerDialog = { active_tab: number; diff --git a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/faq-content.tsx b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/faq-content.tsx index 32b774d77a2c..79c65d973507 100644 --- a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/faq-content.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/faq-content.tsx @@ -1,9 +1,9 @@ import React from 'react'; -import RootStore from 'Stores/index'; -import { Text, Accordion } from '@deriv/components'; +import { Accordion, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; import { TDescription } from './tutorial-content'; type TFAQContent = { diff --git a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/guide-content.tsx b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/guide-content.tsx index 123e861bf576..9bf684962a59 100644 --- a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/guide-content.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/guide-content.tsx @@ -1,9 +1,9 @@ +import React from 'react'; +import classNames from 'classnames'; import { Dialog, Icon, Text } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import classNames from 'classnames'; import { DBOT_TABS } from 'Constants/bot-contents'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { removeKeyValue } from '../../../utils/settings'; diff --git a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/sidebar.tsx b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/sidebar.tsx index b2164b58edb5..33b21097cc37 100644 --- a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/sidebar.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/sidebar.tsx @@ -1,13 +1,13 @@ import React from 'react'; -import RootStore from 'Stores/index'; -import { Tabs, Icon, DesktopWrapper, MobileWrapper, SelectNative } from '@deriv/components'; -import { connect } from 'Stores/connect'; -import { localize } from '@deriv/translations'; +import classNames from 'classnames'; import debounce from 'lodash.debounce'; +import { DesktopWrapper, Icon, MobileWrapper, SelectNative, Tabs } from '@deriv/components'; import { isMobile } from '@deriv/shared'; -import classNames from 'classnames'; -import GuideContent from './guide-content'; +import { localize } from '@deriv/translations'; +import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; import FAQContent from './faq-content'; +import GuideContent from './guide-content'; import { faq_content, guide_content, user_guide_content } from './tutorial-content'; type TSidebarProps = { diff --git a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/tutorial-content.tsx b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/tutorial-content.tsx index f2142dfb632d..e9953d60c3af 100644 --- a/packages/bot-web-ui/src/components/dashboard/tutorial-tab/tutorial-content.tsx +++ b/packages/bot-web-ui/src/components/dashboard/tutorial-tab/tutorial-content.tsx @@ -1,5 +1,5 @@ -import { localize } from '@deriv/translations'; import { getImageLocation } from '../../../public-path'; +import { localize } from '@deriv/translations'; export type TDescription = Pick; diff --git a/packages/bot-web-ui/src/components/download/download.tsx b/packages/bot-web-ui/src/components/download/download.tsx index b68dcba8facc..40424fca8338 100644 --- a/packages/bot-web-ui/src/components/download/download.tsx +++ b/packages/bot-web-ui/src/components/download/download.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { Button, Icon, Popover } from '@deriv/components'; import { localize } from '@deriv/translations'; -import RootStore from 'Stores/index'; import { connect } from 'Stores/connect'; +import RootStore from 'Stores/index'; type TDownloadProps = { onClickDownloadTransaction: () => void; diff --git a/packages/bot-web-ui/src/components/flyout/flyout-block-group.jsx b/packages/bot-web-ui/src/components/flyout/flyout-block-group.jsx index 1e8242f94fc7..b4e9693270de 100644 --- a/packages/bot-web-ui/src/components/flyout/flyout-block-group.jsx +++ b/packages/bot-web-ui/src/components/flyout/flyout-block-group.jsx @@ -1,8 +1,8 @@ -import { Button, Text } from '@deriv/components'; import React from 'react'; +import classNames from 'classnames'; import { PropTypes } from 'prop-types'; +import { Button, Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; -import classNames from 'classnames'; import FlyoutBlock from './flyout-block.jsx'; const FlyoutBlockGroup = ({ onInfoClick, block_node, is_active, should_hide_display_name }) => { diff --git a/packages/bot-web-ui/src/components/flyout/flyout.jsx b/packages/bot-web-ui/src/components/flyout/flyout.jsx index e5549199c38d..b30fa383f9f1 100644 --- a/packages/bot-web-ui/src/components/flyout/flyout.jsx +++ b/packages/bot-web-ui/src/components/flyout/flyout.jsx @@ -1,9 +1,9 @@ -import classNames from 'classnames'; import React from 'react'; +import classNames from 'classnames'; import PropTypes from 'prop-types'; -import { localize } from '@deriv/translations'; +import { Icon, Input, Text, ThemedScrollbars } from '@deriv/components'; import { getPlatformSettings } from '@deriv/shared'; -import { Icon, ThemedScrollbars, Input, Text } from '@deriv/components'; +import { localize } from '@deriv/translations'; import { help_content_config } from 'Utils/help-content/help-content.config'; import { connect } from 'Stores/connect'; import FlyoutBlockGroup from './flyout-block-group.jsx'; diff --git a/packages/bot-web-ui/src/components/flyout/help-contents/flyout-help-base.jsx b/packages/bot-web-ui/src/components/flyout/help-contents/flyout-help-base.jsx index c58e58fe9e62..1d967b8db994 100644 --- a/packages/bot-web-ui/src/components/flyout/help-contents/flyout-help-base.jsx +++ b/packages/bot-web-ui/src/components/flyout/help-contents/flyout-help-base.jsx @@ -1,13 +1,13 @@ -import { Button, Icon, Text } from '@deriv/components'; import React from 'react'; import PropTypes from 'prop-types'; +import { Button, Icon, Text } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { help_content_types, help_content_config } from 'Utils/help-content/help-content.config'; +import { help_content_config, help_content_types } from 'Utils/help-content/help-content.config'; import { connect } from 'Stores/connect'; -import FlyoutVideo from './flyout-video.jsx'; -import FlyoutText from './flyout-text.jsx'; -import FlyoutImage from './flyout-img.jsx'; import FlyoutBlock from '../flyout-block.jsx'; +import FlyoutImage from './flyout-img.jsx'; +import FlyoutText from './flyout-text.jsx'; +import FlyoutVideo from './flyout-video.jsx'; const HelpBase = ({ block_node, diff --git a/packages/bot-web-ui/src/components/index.js b/packages/bot-web-ui/src/components/index.js index a9c9ada42334..55ac3a0393f1 100644 --- a/packages/bot-web-ui/src/components/index.js +++ b/packages/bot-web-ui/src/components/index.js @@ -1,15 +1,17 @@ export { default as Audio } from './audio'; +export { default as BotFooterExtensions } from './bot-footer-extensions'; export { default as BotNotificationMessages } from './bot-notification-messages'; export { default as Chart } from './chart'; -export { default as Dashboard } from './dashboard'; export { default as ContractCardLoader } from './contract-card-loading'; export { default as ContractResultOverlay } from './contract-result-overlay'; +export { default as Dashboard } from './dashboard'; +export { default as QuickStrategy } from './dashboard/quick-strategy'; export { default as Download } from './download'; export { default as Flyout } from './flyout'; export { default as Journal } from './journal'; export { default as LoadModal } from './load-modal'; -export { messageWithButton, messageWithImage, arrayAsMessage } from './notify-item'; -export { default as QuickStrategy } from './dashboard/quick-strategy'; +export { default as NetworkToastPopup } from './network-toast-popup'; +export { arrayAsMessage, messageWithButton, messageWithImage } from './notify-item'; export { default as RoutePromptDialog } from './route-prompt-dialog'; export { default as RunPanel } from './run-panel'; export { default as SaveModal } from './save-modal'; @@ -17,5 +19,3 @@ export { default as SelfExclusion } from './self-exclusion'; export { default as Summary } from './summary'; export { default as TradeAnimation } from './trade-animation'; export { default as Transactions } from './transactions'; -export { default as NetworkToastPopup } from './network-toast-popup'; -export { default as BotFooterExtensions } from './bot-footer-extensions'; diff --git a/packages/bot-web-ui/src/components/journal/journal-components/filter-dialog.tsx b/packages/bot-web-ui/src/components/journal/journal-components/filter-dialog.tsx index a4720e13d07e..1157b4f72e1b 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/filter-dialog.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/filter-dialog.tsx @@ -1,7 +1,7 @@ -import { useOnClickOutside } from '@deriv/components'; import React from 'react'; -import { Filters } from '.'; +import { useOnClickOutside } from '@deriv/components'; import { TFilterDialogProps } from '../journal.types'; +import { Filters } from '.'; const FilterDialog = ({ toggle_ref, diff --git a/packages/bot-web-ui/src/components/journal/journal-components/filters.tsx b/packages/bot-web-ui/src/components/journal/journal-components/filters.tsx index f5d5a5712822..21767b47cb95 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/filters.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/filters.tsx @@ -1,5 +1,5 @@ -import { Checkbox } from '@deriv/components'; import React from 'react'; +import { Checkbox } from '@deriv/components'; import { TFiltersProps } from '../journal.types'; const Filters = ({ diff --git a/packages/bot-web-ui/src/components/journal/journal-components/format-message.tsx b/packages/bot-web-ui/src/components/journal/journal-components/format-message.tsx index 191f34ad9ee4..27702cd8653b 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/format-message.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/format-message.tsx @@ -1,9 +1,9 @@ +import React from 'react'; +import classnames from 'classnames'; import { log_types } from '@deriv/bot-skeleton'; import { Text } from '@deriv/components'; import { formatMoney, getCurrencyDisplayCode } from '@deriv/shared'; -import { localize, Localize } from '@deriv/translations'; -import classnames from 'classnames'; -import React from 'react'; +import { Localize, localize } from '@deriv/translations'; import { TFormatMessageProps } from '../journal.types'; const FormatMessage = ({ logType, className, extra }: TFormatMessageProps) => { diff --git a/packages/bot-web-ui/src/components/journal/journal-components/index.ts b/packages/bot-web-ui/src/components/journal/journal-components/index.ts index 7a8a89d01289..ad72c129d6de 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/index.ts +++ b/packages/bot-web-ui/src/components/journal/journal-components/index.ts @@ -1,7 +1,7 @@ -export { default as FormatMessage } from './format-message'; export { default as DateItem } from './date-item'; export { default as FilterDialog } from './filter-dialog'; export { default as Filters } from './filters'; +export { default as FormatMessage } from './format-message'; export { default as JournalItem } from './journal-item'; export { default as JournalLoader } from './journal-loader'; export { default as JournalTools } from './journal-tools'; diff --git a/packages/bot-web-ui/src/components/journal/journal-components/journal-item.tsx b/packages/bot-web-ui/src/components/journal/journal-components/journal-item.tsx index 1012e66c6708..e08429e07b37 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/journal-item.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/journal-item.tsx @@ -1,10 +1,10 @@ -import { message_types } from '@deriv/bot-skeleton'; -import { useNewRowTransition } from '@deriv/shared'; -import classnames from 'classnames'; import React from 'react'; +import classnames from 'classnames'; import { CSSTransition } from 'react-transition-group'; +import { message_types } from '@deriv/bot-skeleton'; +import { useNewRowTransition } from '@deriv/shared'; import { TJournalItemExtra, TJournalItemProps } from '../journal.types'; -import { FormatMessage, DateItem } from '.'; +import { DateItem, FormatMessage } from '.'; const getJournalItemContent = ( message: string | ((value: () => void) => string), diff --git a/packages/bot-web-ui/src/components/journal/journal-components/journal-loader.tsx b/packages/bot-web-ui/src/components/journal/journal-components/journal-loader.tsx index 67df6108fe6e..3e95c52ac306 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/journal-loader.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/journal-loader.tsx @@ -1,5 +1,5 @@ -import classnames from 'classnames'; import React from 'react'; +import classnames from 'classnames'; import ContentLoader from 'react-content-loader'; const JournalLoader = ({ is_mobile }: { is_mobile: boolean }) => ( diff --git a/packages/bot-web-ui/src/components/journal/journal-components/journal-tools.tsx b/packages/bot-web-ui/src/components/journal/journal-components/journal-tools.tsx index 1a5fccd5597d..409d491ca092 100644 --- a/packages/bot-web-ui/src/components/journal/journal-components/journal-tools.tsx +++ b/packages/bot-web-ui/src/components/journal/journal-components/journal-tools.tsx @@ -1,10 +1,10 @@ +import React from 'react'; +import { CSSTransition } from 'react-transition-group'; import { DesktopWrapper, Icon, Text } from '@deriv/components'; import { Localize } from '@deriv/translations'; import Download from 'Components/download'; -import React from 'react'; -import { CSSTransition } from 'react-transition-group'; -import { FilterDialog } from '.'; import { TJournalToolsProps } from '../journal.types'; +import { FilterDialog } from '.'; const JournalTools = ({ checked_filters, diff --git a/packages/bot-web-ui/src/components/journal/journal.tsx b/packages/bot-web-ui/src/components/journal/journal.tsx index d1366e193493..42a37429c97c 100644 --- a/packages/bot-web-ui/src/components/journal/journal.tsx +++ b/packages/bot-web-ui/src/components/journal/journal.tsx @@ -1,13 +1,13 @@ +import React from 'react'; +import classnames from 'classnames'; import { DataList, Icon, Text } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import classnames from 'classnames'; import { contract_stages } from 'Constants/contract-stage'; -import React from 'react'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; -import { JournalItem, JournalLoader, JournalTools } from './journal-components'; import { TCheckedFilters, TFilterMessageValues, TJournalDataListArgs, TJournalProps } from './journal.types'; -import { isMobile } from '@deriv/shared'; +import { JournalItem, JournalLoader, JournalTools } from './journal-components'; const Journal = ({ contract_stage, diff --git a/packages/bot-web-ui/src/components/load-modal/load-modal.tsx b/packages/bot-web-ui/src/components/load-modal/load-modal.tsx index ef681be05eca..3e07e73567b0 100644 --- a/packages/bot-web-ui/src/components/load-modal/load-modal.tsx +++ b/packages/bot-web-ui/src/components/load-modal/load-modal.tsx @@ -1,10 +1,10 @@ +import React from 'react'; import { MobileFullPageModal, Modal, Tabs } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { tabs_title } from 'Constants/load-modal'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/root-store'; -import React from 'react'; import GoogleDrive from '../dashboard/dashboard-component/load-bot-preview/google-drive'; import Local from './local'; import LocalFooter from './local-footer'; diff --git a/packages/bot-web-ui/src/components/load-modal/local-footer.tsx b/packages/bot-web-ui/src/components/load-modal/local-footer.tsx index 0d06bddc603e..384056add341 100644 --- a/packages/bot-web-ui/src/components/load-modal/local-footer.tsx +++ b/packages/bot-web-ui/src/components/load-modal/local-footer.tsx @@ -1,9 +1,9 @@ +import React from 'react'; import { Button } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/root-store'; -import React from 'react'; type TLocalFooterProps = { is_open_button_loading: boolean; diff --git a/packages/bot-web-ui/src/components/load-modal/local.tsx b/packages/bot-web-ui/src/components/load-modal/local.tsx index 1f0c9d6cbab1..bdbc581830dd 100644 --- a/packages/bot-web-ui/src/components/load-modal/local.tsx +++ b/packages/bot-web-ui/src/components/load-modal/local.tsx @@ -1,12 +1,12 @@ +import React from 'react'; +import classNames from 'classnames'; import { Button, Icon } from '@deriv/components'; import { isMobile } from '@deriv/shared'; import { Localize, localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/root-store'; -import React from 'react'; import LocalFooter from './local-footer'; import WorkspaceControl from './workspace-control'; -import classNames from 'classnames'; type TLocalComponentProps = { active_tab: number; diff --git a/packages/bot-web-ui/src/components/load-modal/recent-workspace.tsx b/packages/bot-web-ui/src/components/load-modal/recent-workspace.tsx index d26ff2806272..b118c28464b8 100644 --- a/packages/bot-web-ui/src/components/load-modal/recent-workspace.tsx +++ b/packages/bot-web-ui/src/components/load-modal/recent-workspace.tsx @@ -1,8 +1,8 @@ -import classnames from 'classnames'; import React from 'react'; -import { Icon } from '@deriv/components'; +import classnames from 'classnames'; import { timeSince } from '@deriv/bot-skeleton'; import { save_types } from '@deriv/bot-skeleton/src/constants/save-type'; +import { Icon } from '@deriv/components'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/root-store'; diff --git a/packages/bot-web-ui/src/components/load-modal/recent.tsx b/packages/bot-web-ui/src/components/load-modal/recent.tsx index a7b9aaeaa525..a29dc547512c 100644 --- a/packages/bot-web-ui/src/components/load-modal/recent.tsx +++ b/packages/bot-web-ui/src/components/load-modal/recent.tsx @@ -1,5 +1,5 @@ -import classnames from 'classnames'; import React from 'react'; +import classnames from 'classnames'; import { Icon } from '@deriv/components'; import { Localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; diff --git a/packages/bot-web-ui/src/components/network-toast-popup/network-toast-popup.jsx b/packages/bot-web-ui/src/components/network-toast-popup/network-toast-popup.jsx index be94bf2291f5..cafc369966b3 100644 --- a/packages/bot-web-ui/src/components/network-toast-popup/network-toast-popup.jsx +++ b/packages/bot-web-ui/src/components/network-toast-popup/network-toast-popup.jsx @@ -1,6 +1,6 @@ +import React from 'react'; import classNames from 'classnames'; import PropTypes from 'prop-types'; -import React from 'react'; import ReactDOM from 'react-dom'; import { MobileWrapper, Toast } from '@deriv/components'; import { connect } from 'Stores/connect'; diff --git a/packages/bot-web-ui/src/components/notify-item/index.js b/packages/bot-web-ui/src/components/notify-item/index.js index 10e7aa736b8b..d5199f07b61d 100644 --- a/packages/bot-web-ui/src/components/notify-item/index.js +++ b/packages/bot-web-ui/src/components/notify-item/index.js @@ -1,4 +1,4 @@ -import { messageWithButton, messageWithImage, arrayAsMessage } from './notify-item.jsx'; +import { arrayAsMessage, messageWithButton, messageWithImage } from './notify-item.jsx'; import './notify-item.scss'; -export { messageWithButton, messageWithImage, arrayAsMessage }; +export { arrayAsMessage, messageWithButton, messageWithImage }; diff --git a/packages/bot-web-ui/src/components/notify-item/notify-item.jsx b/packages/bot-web-ui/src/components/notify-item/notify-item.jsx index 813149da67c0..ef37861da106 100644 --- a/packages/bot-web-ui/src/components/notify-item/notify-item.jsx +++ b/packages/bot-web-ui/src/components/notify-item/notify-item.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Button, Icon, ExpansionPanel } from '@deriv/components'; +import { Button, ExpansionPanel, Icon } from '@deriv/components'; const getIcon = type => { switch (type) { diff --git a/packages/bot-web-ui/src/components/route-prompt-dialog/route-prompt-dialog.tsx b/packages/bot-web-ui/src/components/route-prompt-dialog/route-prompt-dialog.tsx index f304e84b3de0..e134b87426c2 100644 --- a/packages/bot-web-ui/src/components/route-prompt-dialog/route-prompt-dialog.tsx +++ b/packages/bot-web-ui/src/components/route-prompt-dialog/route-prompt-dialog.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { localize, Localize } from '@deriv/translations'; import { Dialog } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; diff --git a/packages/bot-web-ui/src/components/run-panel/run-panel.jsx b/packages/bot-web-ui/src/components/run-panel/run-panel.jsx index 34833f3b4d9e..2b04c7445eb4 100644 --- a/packages/bot-web-ui/src/components/run-panel/run-panel.jsx +++ b/packages/bot-web-ui/src/components/run-panel/run-panel.jsx @@ -1,16 +1,16 @@ -import { Button, Drawer, Modal, Money, Tabs, ThemedScrollbars, Text } from '@deriv/components'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; import React from 'react'; -import { localize, Localize } from '@deriv/translations'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; +import { Button, Drawer, Modal, Money, Tabs, Text, ThemedScrollbars } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; +import { Localize, localize } from '@deriv/translations'; import Journal from 'Components/journal'; +import SelfExclusion from 'Components/self-exclusion'; import Summary from 'Components/summary'; -import Transactions from 'Components/transactions'; import TradeAnimation from 'Components/trade-animation'; -import SelfExclusion from 'Components/self-exclusion'; +import Transactions from 'Components/transactions'; import { popover_zindex } from 'Constants/z-indexes'; import { connect } from 'Stores/connect'; -import { isMobile } from '@deriv/shared'; const StatisticsTile = ({ content, contentClassName, title }) => (
diff --git a/packages/bot-web-ui/src/components/save-modal/save-modal.jsx b/packages/bot-web-ui/src/components/save-modal/save-modal.jsx index b487320e3bf3..c6f0a31ebb58 100644 --- a/packages/bot-web-ui/src/components/save-modal/save-modal.jsx +++ b/packages/bot-web-ui/src/components/save-modal/save-modal.jsx @@ -1,12 +1,12 @@ +import React from 'react'; import classNames from 'classnames'; +import { Field, Form, Formik } from 'formik'; import PropTypes from 'prop-types'; -import React from 'react'; -import { Button, Icon, Modal, RadioGroup, Input, MobileFullPageModal, ThemedScrollbars, Text } from '@deriv/components'; -import { Formik, Form, Field } from 'formik'; -import { localize } from '@deriv/translations'; import { config, save_types } from '@deriv/bot-skeleton'; -import { connect } from 'Stores/connect'; +import { Button, Icon, Input, MobileFullPageModal, Modal, RadioGroup, Text, ThemedScrollbars } from '@deriv/components'; import { isMobile } from '@deriv/shared'; +import { localize } from '@deriv/translations'; +import { connect } from 'Stores/connect'; const SaveModalForm = ({ bot_name, diff --git a/packages/bot-web-ui/src/components/self-exclusion/self-exclusion.jsx b/packages/bot-web-ui/src/components/self-exclusion/self-exclusion.jsx index 898cb8900c05..a0f09ef11acf 100644 --- a/packages/bot-web-ui/src/components/self-exclusion/self-exclusion.jsx +++ b/packages/bot-web-ui/src/components/self-exclusion/self-exclusion.jsx @@ -1,11 +1,11 @@ import React from 'react'; +import classNames from 'classnames'; +import { Field, Form, Formik } from 'formik'; import PropTypes from 'prop-types'; -import { Input, Button, Modal, MobileWrapper, Div100vhContainer, FadeWrapper, PageOverlay } from '@deriv/components'; +import { Button, Div100vhContainer, FadeWrapper, Input, MobileWrapper, Modal, PageOverlay } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { Formik, Form, Field } from 'formik'; -import classNames from 'classnames'; import { connect } from 'Stores/connect'; -import { isMobile } from '@deriv/shared'; const SelfExclusionForm = props => { const [max_losses_error, setMaxLossesError] = React.useState(''); diff --git a/packages/bot-web-ui/src/components/summary/summary-card.tsx b/packages/bot-web-ui/src/components/summary/summary-card.tsx index 738a9827c632..8ff77faaff3a 100644 --- a/packages/bot-web-ui/src/components/summary/summary-card.tsx +++ b/packages/bot-web-ui/src/components/summary/summary-card.tsx @@ -1,14 +1,14 @@ import React from 'react'; import classNames from 'classnames'; -import { localize } from '@deriv/translations'; import { ContractCard, Text } from '@deriv/components'; +import { isMobile } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import ContractCardLoader from 'Components/contract-card-loading'; import { getCardLabels, getContractTypeDisplay } from 'Constants/contract'; -import { connect } from 'Stores/connect'; import { connectWithContractUpdate } from 'Utils/multiplier'; +import { connect } from 'Stores/connect'; import RootStore from 'Stores/index'; import { TSummaryCardProps } from './summary-card.types'; -import { isMobile } from '@deriv/shared'; const SummaryCard = ({ addToast, diff --git a/packages/bot-web-ui/src/components/summary/summary.tsx b/packages/bot-web-ui/src/components/summary/summary.tsx index c0d717436dc2..041c2138f383 100644 --- a/packages/bot-web-ui/src/components/summary/summary.tsx +++ b/packages/bot-web-ui/src/components/summary/summary.tsx @@ -1,11 +1,11 @@ -import classnames from 'classnames'; import React from 'react'; +import classnames from 'classnames'; import { ThemedScrollbars } from '@deriv/components'; -import SummaryCard from './summary-card'; import { isMobile } from '@deriv/shared'; import { connect } from 'Stores/connect'; -import { TContractInfo } from './summary-card.types'; import RootStore from 'Stores/index'; +import SummaryCard from './summary-card'; +import { TContractInfo } from './summary-card.types'; type TSummary = { is_drawer_open: boolean; diff --git a/packages/bot-web-ui/src/components/trade-animation/trade-animation.jsx b/packages/bot-web-ui/src/components/trade-animation/trade-animation.jsx index b2260bf1f7e1..9c8ef62a2ec9 100644 --- a/packages/bot-web-ui/src/components/trade-animation/trade-animation.jsx +++ b/packages/bot-web-ui/src/components/trade-animation/trade-animation.jsx @@ -1,12 +1,12 @@ -import classNames from 'classnames'; import React from 'react'; +import classNames from 'classnames'; import PropTypes from 'prop-types'; import { Button, Icon, Modal, Text } from '@deriv/components'; -import { localize, Localize } from '@deriv/translations'; +import { isMobile } from '@deriv/shared'; +import { Localize, localize } from '@deriv/translations'; import ContractResultOverlay from 'Components/contract-result-overlay'; import { contract_stages } from 'Constants/contract-stage'; import { connect } from 'Stores/connect'; -import { isMobile } from '@deriv/shared'; const CircularWrapper = ({ className }) => (
diff --git a/packages/bot-web-ui/src/components/transactions/transaction.jsx b/packages/bot-web-ui/src/components/transactions/transaction.jsx index cc8238a8b442..c2e731aebe5f 100644 --- a/packages/bot-web-ui/src/components/transactions/transaction.jsx +++ b/packages/bot-web-ui/src/components/transactions/transaction.jsx @@ -1,11 +1,11 @@ -import classNames from 'classnames'; -import { Icon, Money, Popover, IconTradeTypes } from '@deriv/components'; -import { localize } from '@deriv/translations'; -import { convertDateFormat } from '@deriv/shared'; import React from 'react'; -import ContentLoader from 'react-content-loader'; +import classNames from 'classnames'; import PropTypes from 'prop-types'; +import ContentLoader from 'react-content-loader'; import { getContractTypeName } from '@deriv/bot-skeleton'; +import { Icon, IconTradeTypes, Money, Popover } from '@deriv/components'; +import { convertDateFormat } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import { popover_zindex } from 'Constants/z-indexes'; import { connect } from 'Stores/connect'; diff --git a/packages/bot-web-ui/src/components/transactions/transactions.jsx b/packages/bot-web-ui/src/components/transactions/transactions.jsx index aa77e18100a5..5ff532a24a12 100644 --- a/packages/bot-web-ui/src/components/transactions/transactions.jsx +++ b/packages/bot-web-ui/src/components/transactions/transactions.jsx @@ -1,10 +1,10 @@ +import React from 'react'; import classnames from 'classnames'; -import { Icon, DesktopWrapper, DataList, ThemedScrollbars, Text } from '@deriv/components'; -import { localize } from '@deriv/translations'; -import { useNewRowTransition, isMobile } from '@deriv/shared'; import { PropTypes } from 'prop-types'; -import React from 'react'; import { CSSTransition } from 'react-transition-group'; +import { DataList, DesktopWrapper, Icon, Text, ThemedScrollbars } from '@deriv/components'; +import { isMobile, useNewRowTransition } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import Download from 'Components/download'; import { contract_stages } from 'Constants/contract-stage'; import { transaction_elements } from 'Constants/transactions'; diff --git a/packages/bot-web-ui/src/constants/contract.js b/packages/bot-web-ui/src/constants/contract.js index 6f0fb05e38c4..b13a1fd2afcf 100644 --- a/packages/bot-web-ui/src/constants/contract.js +++ b/packages/bot-web-ui/src/constants/contract.js @@ -1,5 +1,5 @@ -import { localize } from '@deriv/translations'; import { getTotalProfit } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import { getBuyPrice } from 'Utils/multiplier'; export const getCardLabels = () => ({ diff --git a/packages/bot-web-ui/src/stores/app-store.js b/packages/bot-web-ui/src/stores/app-store.js index 75461bbd0b47..a81c3a963972 100644 --- a/packages/bot-web-ui/src/stores/app-store.js +++ b/packages/bot-web-ui/src/stores/app-store.js @@ -1,7 +1,7 @@ -import { action, reaction, makeObservable } from 'mobx'; -import { isEuResidenceWithOnlyVRTC, showDigitalOptionsUnavailableError, routes } from '@deriv/shared'; +import { action, makeObservable, reaction } from 'mobx'; +import { ApiHelpers, DBot, runIrreversibleEvents } from '@deriv/bot-skeleton'; +import { isEuResidenceWithOnlyVRTC, routes, showDigitalOptionsUnavailableError } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { runIrreversibleEvents, ApiHelpers, DBot } from '@deriv/bot-skeleton'; export default class AppStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/blockly-store.ts b/packages/bot-web-ui/src/stores/blockly-store.ts index d9a43e6d2438..08729aff403f 100644 --- a/packages/bot-web-ui/src/stores/blockly-store.ts +++ b/packages/bot-web-ui/src/stores/blockly-store.ts @@ -1,7 +1,7 @@ -import { action, observable, makeObservable } from 'mobx'; +import { action, makeObservable, observable } from 'mobx'; import { onWorkspaceResize } from '@deriv/bot-skeleton'; import { tabs_title } from 'Constants/bot-contents'; -import { storeSetting, getSetting } from 'Utils/settings'; +import { getSetting, storeSetting } from 'Utils/settings'; import RootStore from './root-store'; export interface IBlocklyStore { diff --git a/packages/bot-web-ui/src/stores/chart-store.js b/packages/bot-web-ui/src/stores/chart-store.js index dbc5a99eea5b..522ce6ef6785 100644 --- a/packages/bot-web-ui/src/stores/chart-store.js +++ b/packages/bot-web-ui/src/stores/chart-store.js @@ -1,4 +1,4 @@ -import { action, computed, observable, reaction, makeObservable } from 'mobx'; +import { action, computed, makeObservable, observable, reaction } from 'mobx'; // import { tabs_title } from '../constants/bot-contents'; import { ServerTime } from '@deriv/bot-skeleton'; diff --git a/packages/bot-web-ui/src/stores/connect.js b/packages/bot-web-ui/src/stores/connect.js index 3dcec298c8a1..8e604f1b83d3 100644 --- a/packages/bot-web-ui/src/stores/connect.js +++ b/packages/bot-web-ui/src/stores/connect.js @@ -1,5 +1,5 @@ -import { useObserver } from 'mobx-react'; import React from 'react'; +import { useObserver } from 'mobx-react'; const isClassComponent = Component => !!(typeof Component === 'function' && Component.prototype && Component.prototype.isReactComponent); diff --git a/packages/bot-web-ui/src/stores/dashboard-store.ts b/packages/bot-web-ui/src/stores/dashboard-store.ts index 03867ea5ea4c..baf272925d36 100644 --- a/packages/bot-web-ui/src/stores/dashboard-store.ts +++ b/packages/bot-web-ui/src/stores/dashboard-store.ts @@ -1,9 +1,9 @@ -import { observable, action, computed, reaction, makeObservable } from 'mobx'; -import { tour_type, setTourSettings, TTourType } from '../components/dashboard/joyride-config'; -import RootStore from './root-store'; -import { clearInjectionDiv } from 'Constants/load-modal'; +import { action, computed, makeObservable, observable, reaction } from 'mobx'; +import { blocksCoordinate, setColors } from '@deriv/bot-skeleton'; import { isMobile } from '@deriv/shared'; -import { setColors, blocksCoordinate } from '@deriv/bot-skeleton'; +import { clearInjectionDiv } from 'Constants/load-modal'; +import { setTourSettings, tour_type, TTourType } from '../components/dashboard/joyride-config'; +import RootStore from './root-store'; export interface IDashboardStore { active_tab: number; diff --git a/packages/bot-web-ui/src/stores/data-collection-store.js b/packages/bot-web-ui/src/stores/data-collection-store.js index 10d48a7b3ed2..2aae1d51089c 100644 --- a/packages/bot-web-ui/src/stores/data-collection-store.js +++ b/packages/bot-web-ui/src/stores/data-collection-store.js @@ -1,7 +1,7 @@ -import { reaction, makeObservable, observable, action } from 'mobx'; import crc32 from 'crc-32/crc32'; -import { isProduction, cloneObject } from '@deriv/shared'; +import { action, makeObservable, observable, reaction } from 'mobx'; import { DBot } from '@deriv/bot-skeleton'; +import { cloneObject, isProduction } from '@deriv/shared'; export default class DataCollectionStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/download-store.js b/packages/bot-web-ui/src/stores/download-store.js index 0712ad8c75b0..1b87f8090a74 100644 --- a/packages/bot-web-ui/src/stores/download-store.js +++ b/packages/bot-web-ui/src/stores/download-store.js @@ -1,6 +1,6 @@ import { action, makeObservable } from 'mobx'; -import { localize } from '@deriv/translations'; import { log_types } from '@deriv/bot-skeleton'; +import { localize } from '@deriv/translations'; export default class DownloadStore { constructor(root_store) { diff --git a/packages/bot-web-ui/src/stores/flyout-help-store.js b/packages/bot-web-ui/src/stores/flyout-help-store.js index 2a1ac038ab2d..19187fc2b844 100644 --- a/packages/bot-web-ui/src/stores/flyout-help-store.js +++ b/packages/bot-web-ui/src/stores/flyout-help-store.js @@ -1,4 +1,4 @@ -import { observable, action, runInAction, makeObservable } from 'mobx'; +import { action, makeObservable, observable, runInAction } from 'mobx'; import { config } from '@deriv/bot-skeleton'; import { help_content_config } from 'Utils/help-content/help-content.config'; import * as help_strings from 'Utils/help-content/help-strings'; diff --git a/packages/bot-web-ui/src/stores/flyout-store.js b/packages/bot-web-ui/src/stores/flyout-store.js index 9dd59a541851..8e3808335ff7 100644 --- a/packages/bot-web-ui/src/stores/flyout-store.js +++ b/packages/bot-web-ui/src/stores/flyout-store.js @@ -1,5 +1,5 @@ /* eslint-disable no-underscore-dangle */ -import { observable, action, computed, makeObservable } from 'mobx'; +import { action, computed, makeObservable, observable } from 'mobx'; import { config } from '@deriv/bot-skeleton'; import GTM from 'Utils/gtm'; diff --git a/packages/bot-web-ui/src/stores/google-drive-store.js b/packages/bot-web-ui/src/stores/google-drive-store.js index 64f6bdd4da2e..b1a6ea018946 100644 --- a/packages/bot-web-ui/src/stores/google-drive-store.js +++ b/packages/bot-web-ui/src/stores/google-drive-store.js @@ -1,6 +1,6 @@ -import { observable, action, makeObservable } from 'mobx'; -import { localize, getLanguage } from '@deriv/translations'; -import { importExternal, config } from '@deriv/bot-skeleton'; +import { action, makeObservable, observable } from 'mobx'; +import { config, importExternal } from '@deriv/bot-skeleton'; +import { getLanguage, localize } from '@deriv/translations'; import { button_status } from 'Constants/button-status'; export default class GoogleDriveStore { diff --git a/packages/bot-web-ui/src/stores/journal-store.js b/packages/bot-web-ui/src/stores/journal-store.js index e8eac7ee485f..70814f364f2e 100644 --- a/packages/bot-web-ui/src/stores/journal-store.js +++ b/packages/bot-web-ui/src/stores/journal-store.js @@ -1,11 +1,11 @@ -import { observable, action, computed, reaction, when, makeObservable } from 'mobx'; -import { localize } from '@deriv/translations'; -import { formatDate } from '@deriv/shared'; +import { action, computed, makeObservable, observable, reaction, when } from 'mobx'; import { log_types, message_types } from '@deriv/bot-skeleton'; import { config } from '@deriv/bot-skeleton/src/constants/config'; -import { storeSetting, getSetting } from '../utils/settings'; +import { formatDate } from '@deriv/shared'; +import { localize } from '@deriv/translations'; import { isCustomJournalMessage } from '../utils/journal-notifications'; import { getStoredItemsByKey, getStoredItemsByUser, setStoredItemsByKey } from '../utils/session-storage'; +import { getSetting, storeSetting } from '../utils/settings'; export default class JournalStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/load-modal-store.ts b/packages/bot-web-ui/src/stores/load-modal-store.ts index 7b34469f2eb0..0ed63d706c65 100644 --- a/packages/bot-web-ui/src/stores/load-modal-store.ts +++ b/packages/bot-web-ui/src/stores/load-modal-store.ts @@ -1,17 +1,17 @@ +import React from 'react'; +import { action, autorun, computed, makeObservable, observable, reaction } from 'mobx'; import { config, getSavedWorkspaces, load, + observer as globalObserver, removeExistingWorkspace, save_types, setColors, - observer as globalObserver, } from '@deriv/bot-skeleton'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { tabs_title, clearInjectionDiv } from 'Constants/load-modal'; -import { action, computed, makeObservable, observable, reaction, autorun } from 'mobx'; -import React from 'react'; +import { clearInjectionDiv, tabs_title } from 'Constants/load-modal'; import RootStore from './root-store'; export type TWorkspace = { diff --git a/packages/bot-web-ui/src/stores/quick-strategy-store.ts b/packages/bot-web-ui/src/stores/quick-strategy-store.ts index 3ed1eb292151..a6d079b9513f 100644 --- a/packages/bot-web-ui/src/stores/quick-strategy-store.ts +++ b/packages/bot-web-ui/src/stores/quick-strategy-store.ts @@ -1,7 +1,7 @@ -import { computed, observable, action, runInAction, makeObservable } from 'mobx'; -import { localize } from '@deriv/translations'; +import { action, computed, makeObservable, observable, runInAction } from 'mobx'; import { ApiHelpers, config, load } from '@deriv/bot-skeleton'; import { save_types } from '@deriv/bot-skeleton/src/constants/save-type'; +import { localize } from '@deriv/translations'; import GTM from 'Utils/gtm'; import { getSetting, storeSetting } from 'Utils/settings'; import { diff --git a/packages/bot-web-ui/src/stores/root-store.ts b/packages/bot-web-ui/src/stores/root-store.ts index 28f74bf6131c..785f18bdc804 100644 --- a/packages/bot-web-ui/src/stores/root-store.ts +++ b/packages/bot-web-ui/src/stores/root-store.ts @@ -1,25 +1,25 @@ +import type { TDbot, TRootStore, TWebSocket } from 'Types'; +import AppStore from './app-store'; +import BlocklyStore from './blockly-store'; import ChartStore from './chart-store'; +import DashboardStore from './dashboard-store'; +import DataCollectionStore from './data-collection-store'; import DownloadStore from './download-store'; -import FlyoutStore from './flyout-store'; import FlyoutHelpStore from './flyout-help-store'; +import FlyoutStore from './flyout-store'; import GoogleDriveStore from './google-drive-store'; import JournalStore from './journal-store'; import LoadModalStore from './load-modal-store'; +import QuickStrategyStore from './quick-strategy-store'; +import RoutePromptDialogStore from './route-prompt-dialog-store'; import RunPanelStore from './run-panel-store'; import SaveModalStore from './save-modal-store'; -import SummaryStore from './summary-store'; +import SelfExclusionStore from './self-exclusion-store'; import SummaryCardStore from './summary-card-store'; +import SummaryStore from './summary-store'; import ToolbarStore from './toolbar-store'; -import TransactionsStore from './transactions-store'; -import QuickStrategyStore from './quick-strategy-store'; -import RoutePromptDialogStore from './route-prompt-dialog-store'; -import DataCollectionStore from './data-collection-store'; -import BlocklyStore from './blockly-store'; -import SelfExclusionStore from './self-exclusion-store'; import ToolboxStore from './toolbox-store'; -import AppStore from './app-store'; -import DashboardStore from './dashboard-store'; -import type { TDbot, TWebSocket, TRootStore } from 'Types'; +import TransactionsStore from './transactions-store'; // TODO: need to write types for the individual classes and convert them to ts export default class RootStore { diff --git a/packages/bot-web-ui/src/stores/route-prompt-dialog-store.js b/packages/bot-web-ui/src/stores/route-prompt-dialog-store.js index 9c3af9d4600d..d6d6a56e9644 100644 --- a/packages/bot-web-ui/src/stores/route-prompt-dialog-store.js +++ b/packages/bot-web-ui/src/stores/route-prompt-dialog-store.js @@ -1,4 +1,4 @@ -import { observable, action, makeObservable } from 'mobx'; +import { action, makeObservable, observable } from 'mobx'; export default class RoutePromptDialogStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/run-panel-store.js b/packages/bot-web-ui/src/stores/run-panel-store.js index 8fd6c5cf4d7c..b94142c736ab 100644 --- a/packages/bot-web-ui/src/stores/run-panel-store.js +++ b/packages/bot-web-ui/src/stores/run-panel-store.js @@ -1,11 +1,11 @@ import React from 'react'; -import { observable, action, reaction, computed, runInAction, makeObservable } from 'mobx'; -import { localize, Localize } from '@deriv/translations'; -import { error_types, unrecoverable_errors, observer, message_types } from '@deriv/bot-skeleton'; +import { action, computed, makeObservable, observable, reaction, runInAction } from 'mobx'; +import { error_types, message_types, observer, unrecoverable_errors } from '@deriv/bot-skeleton'; +import { isSafari, mobileOSDetect } from '@deriv/shared'; +import { Localize, localize } from '@deriv/translations'; import { contract_stages } from 'Constants/contract-stage'; import { run_panel } from 'Constants/run-panel'; import { journalError, switch_account_notification } from 'Utils/bot-notifications'; -import { isSafari, mobileOSDetect } from '@deriv/shared'; export default class RunPanelStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/save-modal-store.ts b/packages/bot-web-ui/src/stores/save-modal-store.ts index 489dfd98bfd5..0ea7b4f44f2f 100644 --- a/packages/bot-web-ui/src/stores/save-modal-store.ts +++ b/packages/bot-web-ui/src/stores/save-modal-store.ts @@ -1,17 +1,17 @@ +import localForage from 'localforage'; +import LZString from 'lz-string'; +import { action, makeObservable, observable } from 'mobx'; import { getSavedWorkspaces, + observer as globalObserver, save, - saveWorkspaceToRecent, save_types, + saveWorkspaceToRecent, updateWorkspaceName, - observer as globalObserver, } from '@deriv/bot-skeleton'; import { localize } from '@deriv/translations'; import { MAX_STRATEGIES } from 'Constants/bot-contents'; import { button_status } from 'Constants/button-status'; -import localForage from 'localforage'; -import LZString from 'lz-string'; -import { action, makeObservable, observable } from 'mobx'; import RootStore from './root-store'; interface ISaveModalStore { diff --git a/packages/bot-web-ui/src/stores/self-exclusion-store.js b/packages/bot-web-ui/src/stores/self-exclusion-store.js index 855409a3e605..91bec112bd0d 100644 --- a/packages/bot-web-ui/src/stores/self-exclusion-store.js +++ b/packages/bot-web-ui/src/stores/self-exclusion-store.js @@ -1,4 +1,4 @@ -import { observable, action, computed, makeObservable } from 'mobx'; +import { action, computed, makeObservable, observable } from 'mobx'; export default class SelfExclusionStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/summary-card-store.js b/packages/bot-web-ui/src/stores/summary-card-store.js index 7930b9ce0191..daa95f947e82 100644 --- a/packages/bot-web-ui/src/stores/summary-card-store.js +++ b/packages/bot-web-ui/src/stores/summary-card-store.js @@ -1,7 +1,7 @@ -import { action, computed, observable, reaction, makeObservable } from 'mobx'; +import { action, computed, makeObservable, observable, reaction } from 'mobx'; import { getIndicativePrice, isEqualObject, isMultiplierContract } from '@deriv/shared'; -import { contract_stages } from 'Constants/contract-stage'; import { getValidationRules } from 'Constants/contract'; +import { contract_stages } from 'Constants/contract-stage'; import { getContractUpdateConfig } from 'Utils/multiplier'; import Validator from 'Utils/validator'; diff --git a/packages/bot-web-ui/src/stores/toolbar-store.ts b/packages/bot-web-ui/src/stores/toolbar-store.ts index 404a4a16f9f9..e614e5286b37 100644 --- a/packages/bot-web-ui/src/stores/toolbar-store.ts +++ b/packages/bot-web-ui/src/stores/toolbar-store.ts @@ -1,5 +1,5 @@ -import { action, observable, makeObservable } from 'mobx'; -import { runGroupedEvents, load, config } from '@deriv/bot-skeleton'; +import { action, makeObservable, observable } from 'mobx'; +import { config, load, runGroupedEvents } from '@deriv/bot-skeleton'; import RootStore from './root-store'; interface IToolbarStore { diff --git a/packages/bot-web-ui/src/stores/toolbox-store.js b/packages/bot-web-ui/src/stores/toolbox-store.js index ae43b9e5e58e..b1a5f1ebc26a 100644 --- a/packages/bot-web-ui/src/stores/toolbox-store.js +++ b/packages/bot-web-ui/src/stores/toolbox-store.js @@ -1,7 +1,7 @@ -import { observable, action, reaction, makeObservable } from 'mobx'; +import { action, makeObservable, observable, reaction } from 'mobx'; +import { scrollWorkspace } from '@deriv/bot-skeleton'; import { isMobile } from '@deriv/shared'; import { localize } from '@deriv/translations'; -import { scrollWorkspace } from '@deriv/bot-skeleton'; export default class ToolboxStore { constructor(root_store, core) { diff --git a/packages/bot-web-ui/src/stores/transactions-store.js b/packages/bot-web-ui/src/stores/transactions-store.js index e81060ad3db0..f1a6299903f0 100644 --- a/packages/bot-web-ui/src/stores/transactions-store.js +++ b/packages/bot-web-ui/src/stores/transactions-store.js @@ -1,6 +1,6 @@ -import { action, computed, observable, reaction, makeObservable } from 'mobx'; -import { formatDate, isEnded, isBot } from '@deriv/shared'; +import { action, computed, makeObservable, observable, reaction } from 'mobx'; import { log_types } from '@deriv/bot-skeleton'; +import { formatDate, isBot, isEnded } from '@deriv/shared'; import { transaction_elements } from '../constants/transactions'; import { getStoredItemsByKey, getStoredItemsByUser, setStoredItemsByKey } from '../utils/session-storage'; diff --git a/packages/bot-web-ui/src/stores/useDBotStore.tsx b/packages/bot-web-ui/src/stores/useDBotStore.tsx index 9e216fbb2eec..53f9fdf1ce26 100644 --- a/packages/bot-web-ui/src/stores/useDBotStore.tsx +++ b/packages/bot-web-ui/src/stores/useDBotStore.tsx @@ -1,8 +1,8 @@ import React, { createContext, PropsWithChildren, useContext, useMemo } from 'react'; -import { useStore } from '@deriv/stores'; import { DBot } from '@deriv/bot-skeleton'; -import RootStore from './root-store'; +import { useStore } from '@deriv/stores'; import type { TWebSocket } from 'Types'; +import RootStore from './root-store'; const DBotStoreContext = createContext(null); diff --git a/packages/bot-web-ui/src/types/index.ts b/packages/bot-web-ui/src/types/index.ts index 1b00429051e0..f84266305db1 100644 --- a/packages/bot-web-ui/src/types/index.ts +++ b/packages/bot-web-ui/src/types/index.ts @@ -1,3 +1,3 @@ export * from './dbot.types'; -export * from './ws.types'; export * from './root-stores.types'; +export * from './ws.types'; diff --git a/packages/bot-web-ui/src/types/ws.types.ts b/packages/bot-web-ui/src/types/ws.types.ts index 0bb091c030cf..b18aeb644fe1 100644 --- a/packages/bot-web-ui/src/types/ws.types.ts +++ b/packages/bot-web-ui/src/types/ws.types.ts @@ -1,10 +1,10 @@ import { PriceProposalOpenContractsRequest, PriceProposalOpenContractsResponse, - UpdateContractRequest, - UpdateContractResponse, TicksStreamRequest, TicksStreamResponse, + UpdateContractRequest, + UpdateContractResponse, } from '@deriv/api-types'; export type TServerError = { diff --git a/packages/bot-web-ui/src/utils/bot-notifications.js b/packages/bot-web-ui/src/utils/bot-notifications.js index 6f70cbde58ed..405814f15db9 100644 --- a/packages/bot-web-ui/src/utils/bot-notifications.js +++ b/packages/bot-web-ui/src/utils/bot-notifications.js @@ -1,5 +1,5 @@ -import { localize } from '@deriv/translations'; import { platform_name } from '@deriv/shared'; +import { localize } from '@deriv/translations'; export const switch_account_notification = { key: 'bot_switch_account', diff --git a/packages/bot-web-ui/src/utils/help-content/help-strings/index.js b/packages/bot-web-ui/src/utils/help-content/help-strings/index.js index 56634f403146..6fde9938fd8e 100644 --- a/packages/bot-web-ui/src/utils/help-content/help-strings/index.js +++ b/packages/bot-web-ui/src/utils/help-content/help-strings/index.js @@ -36,6 +36,6 @@ export { default as todatetime } from './todatetime'; export { default as totimestamp } from './totimestamp'; export { default as trade_again } from './trade_again'; export { default as trade_definition } from './trade_definition'; -export { default as trade_definition_tradeoptions } from './trade_definition_tradeoptions'; export { default as trade_definition_multiplier } from './trade_definition_multiplier'; +export { default as trade_definition_tradeoptions } from './trade_definition_tradeoptions'; export { default as variables_set } from './variables_set'; diff --git a/packages/bot-web-ui/src/utils/help-content/help-strings/trade_definition_multiplier.js b/packages/bot-web-ui/src/utils/help-content/help-strings/trade_definition_multiplier.js index 67d94376cd77..31c5e31af256 100644 --- a/packages/bot-web-ui/src/utils/help-content/help-strings/trade_definition_multiplier.js +++ b/packages/bot-web-ui/src/utils/help-content/help-strings/trade_definition_multiplier.js @@ -1,6 +1,6 @@ import React from 'react'; -import { localize, Localize } from '@deriv/translations'; import { StaticUrl } from '@deriv/components'; +import { Localize, localize } from '@deriv/translations'; export default { text: [ diff --git a/packages/bot-web-ui/src/utils/journal-notifications.js b/packages/bot-web-ui/src/utils/journal-notifications.js index 793de19203a5..f837d95507a3 100644 --- a/packages/bot-web-ui/src/utils/journal-notifications.js +++ b/packages/bot-web-ui/src/utils/journal-notifications.js @@ -1,5 +1,5 @@ +import { arrayAsMessage, messageWithButton } from '@deriv/components'; import { localize } from '@deriv/translations'; -import { messageWithButton, arrayAsMessage } from 'Components'; const showErrorMessageWithButton = (message, block_id, showErrorMessage, centerAndHighlightBlock) => { showErrorMessage( From 1249f2d003200d674eb851771407c1cbdc177ef4 Mon Sep 17 00:00:00 2001 From: vinu-deriv <100689171+vinu-deriv@users.noreply.github.com> Date: Tue, 13 Jun 2023 05:13:14 +0400 Subject: [PATCH 016/104] fix: imports of functions in journal-notifications (#8984) --- packages/bot-web-ui/src/utils/journal-notifications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bot-web-ui/src/utils/journal-notifications.js b/packages/bot-web-ui/src/utils/journal-notifications.js index f837d95507a3..ea469f70e0c0 100644 --- a/packages/bot-web-ui/src/utils/journal-notifications.js +++ b/packages/bot-web-ui/src/utils/journal-notifications.js @@ -1,5 +1,5 @@ -import { arrayAsMessage, messageWithButton } from '@deriv/components'; import { localize } from '@deriv/translations'; +import { arrayAsMessage, messageWithButton } from 'Components'; const showErrorMessageWithButton = (message, block_id, showErrorMessage, centerAndHighlightBlock) => { showErrorMessage( From d1dad1a1769fc0131a01b37b0f373d4935e059a6 Mon Sep 17 00:00:00 2001 From: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> Date: Tue, 13 Jun 2023 18:51:41 +0800 Subject: [PATCH 017/104] Revert "Shaheer/wall 565/language related fixes (#8880)" (#9004) This reverts commit 6d31e2ce77b31e115fe17a8bfa83907d14877763. --- .../Elements/LiveChat/use-livechat.ts | 2 +- packages/core/src/Stores/client-store.js | 30 ++++++++----------- packages/shared/src/utils/storage/storage.ts | 4 +-- packages/shared/src/utils/url/constants.ts | 1 - packages/shared/src/utils/url/helpers.ts | 3 -- packages/translations/src/i18next/i18next.ts | 2 +- 6 files changed, 15 insertions(+), 27 deletions(-) diff --git a/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts b/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts index 68d923a16422..7e5c9bf7e796 100644 --- a/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts +++ b/packages/core/src/App/Components/Elements/LiveChat/use-livechat.ts @@ -44,7 +44,7 @@ const useLiveChat = (has_cookie_account = false, active_loginid?: string) => { let client_last_name = ''; const domain = /^(.)*deriv\.(com|me|be)$/gi.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME - : deriv_urls.DERIV_TEST_LINK_DOMAIN; + : 'binary.sx'; const client_information = Cookies.getJSON('client_information', { domain, }); diff --git a/packages/core/src/Stores/client-store.js b/packages/core/src/Stores/client-store.js index 59647b2679b4..d52a1fd5a7a9 100644 --- a/packages/core/src/Stores/client-store.js +++ b/packages/core/src/Stores/client-store.js @@ -1,12 +1,12 @@ -import Cookies from 'js-cookie'; import * as SocketCache from '_common/base/socket_cache'; + import { CFD_PLATFORMS, LocalStore, State, + deriv_urls, excludeParamsFromUrlQuery, filterUrlQuery, - getCurrentdomain, getPropertyValue, getUrlBinaryBot, getUrlSmartTrader, @@ -18,6 +18,7 @@ import { isStaging, isTestLink, redirectToLogin, + removeCookies, routes, setCurrencies, toMoment, @@ -26,12 +27,13 @@ import { import { WS, requestLogout } from 'Services'; import { action, computed, makeObservable, observable, reaction, runInAction, toJS, when } from 'mobx'; import { getAccountTitle, getClientAccountType, getAvailableAccount } from './Helpers/client'; -import { getLanguage, localize, isLanguageAvailable } from '@deriv/translations'; +import { getLanguage, localize } from '@deriv/translations'; import { getRegion, isEuCountry, isMultipliersOnly, isOptionsBlocked } from '_common/utility'; import BaseStore from './base-store'; import BinarySocket from '_common/base/socket_base'; import BinarySocketGeneral from 'Services/socket-general'; +import Cookies from 'js-cookie'; import { buildCurrenciesList } from './Modules/Trading/Helpers/currency'; import moment from 'moment'; import { setDeviceDataCookie } from './Helpers/device'; @@ -42,7 +44,6 @@ const storage_key = 'client.accounts'; const store_name = 'client_store'; const eu_shortcode_regex = new RegExp('^(maltainvest|malta|iom)$'); const eu_excluded_regex = new RegExp('^mt$'); -const current_domain = getCurrentdomain(); export default class ClientStore extends BaseStore { loginid; @@ -1184,6 +1185,8 @@ export default class ClientStore extends BaseStore { }; setCookieAccount() { + const domain = /deriv\.(com|me)/.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME : 'binary.sx'; + // eslint-disable-next-line max-len const { loginid, @@ -1210,16 +1213,14 @@ export default class ClientStore extends BaseStore { preferred_language, user_id, }; - Cookies.set('region', getRegion(landing_company_shortcode, residence), { current_domain }); - Cookies.set('client_information', client_information, { current_domain }); + Cookies.set('region', getRegion(landing_company_shortcode, residence), { domain }); + Cookies.set('client_information', client_information, { domain }); // need to find other way to get the boolean value and set this cookie since `this.is_p2p_enabled` is deprecated and we can't use hooks here - Cookies.set('is_p2p_disabled', !this.is_p2p_enabled, { current_domain }); + Cookies.set('is_p2p_disabled', !this.is_p2p_enabled, { domain }); this.has_cookie_account = true; } else { - Cookies.remove('region', { current_domain }); - Cookies.remove('client_information', { current_domain }); - Cookies.remove('is_p2p_disabled', { current_domain }); + removeCookies('region', 'client_information', 'is_p2p_disabled'); this.has_cookie_account = false; } } @@ -1568,10 +1569,6 @@ export default class ClientStore extends BaseStore { ]; const authorize_response = await this.setUserLogin(login_new_user); - const getLanguageFromDerivCom = () => { - const lang_from_deriv_com = Cookies.get('user_language')?.toUpperCase(); - return isLanguageAvailable(lang_from_deriv_com) ? lang_from_deriv_com : undefined; - }; if (action_param === 'signup') { this.root_store.ui.setIsNewAccount(); @@ -1647,11 +1644,8 @@ export default class ClientStore extends BaseStore { runInAction(() => { this.is_populating_account_list = false; }); + const language = authorize_response.authorize.preferred_language; const stored_language = LocalStore.get(LANGUAGE_KEY); - const language = - stored_language || // if login from deriv app, language from local storage - getLanguageFromDerivCom() || // if login from deriv.com, language from cookie - authorize_response.authorize.preferred_language; if (language !== 'EN' && stored_language && language !== stored_language) { window.history.replaceState({}, document.title, urlForLanguage(language)); await this.root_store.common.changeSelectedLanguage(language); diff --git a/packages/shared/src/utils/storage/storage.ts b/packages/shared/src/utils/storage/storage.ts index a2435f7dae63..0c66975d32f4 100644 --- a/packages/shared/src/utils/storage/storage.ts +++ b/packages/shared/src/utils/storage/storage.ts @@ -156,9 +156,7 @@ export const CookieStorage = function (this: TCookieStorageThis, cookie_name: st this.domain = cookie_domain || /* eslint-disable no-nested-ternary */ - (hostname.includes(deriv_urls.DERIV_TEST_LINK_DOMAIN) - ? deriv_urls.DERIV_TEST_LINK_DOMAIN - : deriv_urls.DERIV_HOST_NAME); + (hostname.includes('binary.sx') ? 'binary.sx' : deriv_urls.DERIV_HOST_NAME); /* eslint-enable no-nested-ternary */ this.path = '/'; this.expires = new Date('Thu, 1 Jan 2037 12:00:00 GMT'); diff --git a/packages/shared/src/utils/url/constants.ts b/packages/shared/src/utils/url/constants.ts index 398110b08e50..cc288d8d4615 100644 --- a/packages/shared/src/utils/url/constants.ts +++ b/packages/shared/src/utils/url/constants.ts @@ -19,7 +19,6 @@ export const deriv_urls = Object.freeze({ SMARTTRADER_STAGING: `https://staging-smarttrader.${domain_url}`, BINARYBOT_PRODUCTION: `https://bot.${domain_url}`, BINARYBOT_STAGING: `https://staging-bot.${domain_url}`, - DERIV_TEST_LINK_DOMAIN: 'binary.sx', }); export const whatsapp_url = 'https://wa.me/35699578341'; diff --git a/packages/shared/src/utils/url/helpers.ts b/packages/shared/src/utils/url/helpers.ts index 8649b320c951..999cd695b6a5 100644 --- a/packages/shared/src/utils/url/helpers.ts +++ b/packages/shared/src/utils/url/helpers.ts @@ -59,6 +59,3 @@ export const isStaging = (domain = window.location.hostname) => { return is_staging_deriv_app; }; - -export const getCurrentdomain = () => - /deriv\.(com|me)/.test(window.location.hostname) ? deriv_urls.DERIV_HOST_NAME : deriv_urls.DERIV_TEST_LINK_DOMAIN; diff --git a/packages/translations/src/i18next/i18next.ts b/packages/translations/src/i18next/i18next.ts index c2d04dc0e7ed..3c2c8cae0c3f 100644 --- a/packages/translations/src/i18next/i18next.ts +++ b/packages/translations/src/i18next/i18next.ts @@ -50,7 +50,7 @@ const isStaging = () => /staging-app\.deriv\.com/i.test(window.location.hostname const isLocal = () => /localhost\.binary\.sx/i.test(window.location.hostname); -export const isLanguageAvailable = (lang: string) => { +const isLanguageAvailable = (lang: string) => { if (!lang) return false; const selected_language = lang.toUpperCase(); From 1ffc0b4cd549153c8bb0550720ebc5e18976d6ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:52:30 +0800 Subject: [PATCH 018/104] =?UTF-8?q?translations:=20=F0=9F=93=9A=20sync=20t?= =?UTF-8?q?ranslations=20with=20crowdin=20(#9005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: DerivFE <80095553+DerivFE@users.noreply.github.com> --- packages/translations/crowdin/messages.json | 2 +- .../translations/src/translations/ach.json | 19 +- .../translations/src/translations/ar.json | 39 +- .../translations/src/translations/bn.json | 19 +- .../translations/src/translations/de.json | 19 +- .../translations/src/translations/es.json | 19 +- .../translations/src/translations/fr.json | 27 +- .../translations/src/translations/id.json | 19 +- .../translations/src/translations/it.json | 19 +- .../translations/src/translations/ko.json | 21 +- .../translations/src/translations/pl.json | 19 +- .../translations/src/translations/pt.json | 19 +- .../translations/src/translations/ru.json | 19 +- .../translations/src/translations/si.json | 19 +- .../translations/src/translations/th.json | 19 +- .../translations/src/translations/tr.json | 195 +++--- .../translations/src/translations/vi.json | 653 +++++++++--------- .../translations/src/translations/zh_cn.json | 19 +- .../translations/src/translations/zh_tw.json | 19 +- 19 files changed, 637 insertions(+), 547 deletions(-) diff --git a/packages/translations/crowdin/messages.json b/packages/translations/crowdin/messages.json index f84d4db8cf27..12a470394ee4 100644 --- a/packages/translations/crowdin/messages.json +++ b/packages/translations/crowdin/messages.json @@ -1 +1 @@ -{"0":"","1014140":"You may also call <0>+447723580049 to place your complaint.","1485191":"1:1000","3125515":"Your Deriv MT5 password is for logging in to your Deriv MT5 accounts on the desktop, web, and mobile apps.","3215342":"Last 30 days","3420069":"To avoid delays, enter your <0>name and <0>date of birth exactly as they appear on your identity document.","7100308":"Hour must be between 0 and 23.","11539750":"set {{ variable }} to Relative Strength Index Array {{ dummy }}","11872052":"Yes, I'll come back later","14365404":"Request failed for: {{ message_type }}, retrying in {{ delay }}s","15377251":"Profit amount: {{profit}}","17843034":"Check proof of identity document verification status","19424289":"Username","19552684":"USD Basket","21035405":"Please tell us why you’re leaving. (Select up to {{ allowed_reasons }} reasons.)","24900606":"Gold Basket","25854018":"This block displays messages in the developer’s console with an input that can be either a string of text, a number, boolean, or an array of data.","26566655":"Summary","26596220":"Finance","27582767":"{{amount}} {{currency}}","27731356":"Your account is temporarily disabled. Please contact us via <0>live chat to enable deposits and withdrawals again.","27830635":"Deriv (V) Ltd","28581045":"Add a real MT5 account","30801950":"Your account will be opened with {{legal_entity_name}}, regulated by the Malta Gaming Authority, and will be subject to the laws of Malta.","33433576":"Please use an e-wallet to withdraw your funds.","35089987":"Upload the front and back of your driving licence.","41737927":"Thank you","44877997":"Residence permit","45453595":"Binary Coin","45941470":"Where would you like to start?","46523711":"Your proof of identity is verified","49963458":"Choose an option","50200731":"FX majors (standard/micro lots), FX minors, basket indices, commodities, and cryptocurrencies","53801223":"Hong Kong 50","53964766":"5. Hit Save to download your bot. You can choose to download your bot to your device or your Google Drive.","54185751":"Less than $100,000","55340304":"Keep your current contract?","55916349":"All","58254854":"Scopes","59169515":"If you select \"Asian Rise\", you will win the payout if the last tick is higher than the average of the ticks.","59341501":"Unrecognized file format","59662816":"Stated limits are subject to change without prior notice.","62748351":"List Length","63869411":"This block tests a given number according to the selection","64402604":"Check transfer information","65185694":"Fiat onramp","65982042":"Total","66519591":"Investor password","68885999":"Repeats the previous trade when an error is encountered.","69005593":"The example below restarts trading after 30 or more seconds after 1 minute candle was started.","71016232":"OMG/USD","71445658":"Open","71563326":"A fast and secure fiat-to-crypto payment service. Deposit cryptocurrencies from anywhere in the world using your credit/debit cards and bank transfers.","71853457":"$100,001 - $500,000","72500774":"Please fill in Tax residence.","73086872":"You have self-excluded from trading","73326375":"The low is the lowest point ever reached by the market during the contract period.","74963864":"Under","76916358":"You have reached the withdrawal limit.<0/>Please upload your proof of identity and address to lift the limit to continue your withdrawal.","77945356":"Trade on the go with our mobile app.","81450871":"We couldn’t find that page","82839270":"Upload the page of your passport that contains your photo.","83202647":"Collapse Block","84402478":"Where do I find the blocks I need?","85343079":"Financial assessment","85359122":"40 or more","85389154":"Steps required to continue verification on your mobile","89062902":"Trade on MT5","90266322":"2. Start a chat with your newly created Telegram bot and make sure to send it some messages before proceeding to the next step. (e.g. Hello Bot!)","91993812":"The Martingale Strategy is a classic trading technique that has been used for more than a hundred years, popularised by the French mathematician Paul Pierre Levy in the 18th century.","93154671":"1. Hit Reset at the bottom of stats panel.","96381225":"ID verification failed","98473502":"We’re not obliged to conduct an appropriateness test, nor provide you with any risk warnings.","98972777":"random item","100239694":"Upload front of card from your computer","102226908":"Field cannot be empty","108916570":"Duration: {{duration}} days","109073671":"Please use an e-wallet that you have used for deposits previously. Ensure the e-wallet supports withdrawal. See the list of e-wallets that support withdrawals <0>here.","111215238":"Move away from direct light","111718006":"End date","111931529":"Max. total stake over 7 days","113378532":"ETH/USD","115032488":"Buy price and P/L","116005488":"Indicators","117318539":"Password should have lower and uppercase English letters with numbers.","118586231":"Document number (identity card, passport)","119261701":"Prediction:","119446122":"Contract type is not selected","120340777":"Complete your personal details","123454801":"{{withdraw_amount}} {{currency_symbol}}","124723298":"Upload a proof of address to verify your address","125443840":"6. Restart last trade on error","127307725":"A politically exposed person (PEP) is someone appointed with a prominent public position. Close associates and family members of a PEP are also considered to be PEPs.","129729742":"Tax Identification Number*","130567238":"THEN","132596476":"In providing our services to you, we are required to ask you for some information to assess if a given product or service is appropriate for you and whether you have the experience and knowledge to understand the risks involved.<0/><0/>","132689841":"Trade on web terminal","133523018":"Please go to the Deposit page to get an address.","133536621":"and","133655768":"Note: If you wish to learn more about the Bot Builder, you can proceed to the <0>Tutorials tab.","139454343":"Confirm my limits","141265840":"Funds transfer information","141626595":"Make sure your device has a working camera","142050447":"set {{ variable }} to create text with","142390699":"Connected to your mobile","143970826":"Payment problems?","145146541":"Our accounts and services are unavailable for the Jersey postal code","145736466":"Take a selfie","150486954":"Token name","151344063":"The exit spot is the market price when the contract is closed.","151646545":"Unable to read file {{name}}","152415091":"Math","152524253":"Trade the world’s markets with our popular user-friendly platform.","154545319":"Country of residence is where you currently live.","157593038":"random integer from {{ start_number }} to {{ end_number }}","158373715":"Exit tour","160746023":"Tether as an Omni token (USDT) is a version of Tether that is hosted on the Omni layer on the Bitcoin blockchain.","160863687":"Camera not detected","162080773":"For Put","164112826":"This block allows you to load blocks from a URL if you have them stored on a remote server, and they will be loaded only when your bot runs.","164564432":"Deposits are temporarily unavailable due to system maintenance. You can make your deposits when the maintenance is complete.","165294347":"Please set your country of residence in your account settings to access the cashier.","165312615":"Continue on phone","165682516":"If you don’t mind sharing, which other trading platforms do you use?","170185684":"Ignore","170244199":"I’m closing my account for other reasons.","171307423":"Recovery","171579918":"Go to Self-exclusion","171638706":"Variables","173991459":"We’re sending your request to the blockchain.","174793462":"Strike","176078831":"Added","176319758":"Max. total stake over 30 days","176654019":"$100,000 - $250,000","177099483":"Your address verification is pending, and we’ve placed some restrictions on your account. The restrictions will be lifted once your address is verified.","178413314":"First name should be between 2 and 50 characters.","179083332":"Date","179737767":"Our legacy options trading platform.","181346014":"Notes ","181881956":"Contract Type: {{ contract_type }}","184024288":"lower case","189705706":"This block uses the variable \"i\" to control the iterations. With each iteration, the value of \"i\" is determined by the items in a given list.","189759358":"Creates a list by repeating a given item","190834737":"Guide","191372501":"Accumulation of Income/Savings","192436105":"No need for symbols, digits, or uppercase letters","192573933":"Verification complete","195972178":"Get character","196998347":"We hold customer funds in bank accounts separate from our operational accounts which would not, in the event of insolvency, form part of the company's assets. This meets the <0>Gambling Commission's requirements for the segregation of customer funds at the level: <1>medium protection.","197190401":"Expiry date","201091938":"30 days","203179929":"<0>You can open this account once your submitted documents have been verified.","203271702":"Try again","203297887":"The Quick Strategy you just created will be loaded to the workspace.","204797764":"Transfer to client","204863103":"Exit time","206010672":"Delete {{ delete_count }} Blocks","207824122":"Please withdraw your funds from the following Deriv account(s):","209533725":"You’ve transferred {{amount}} {{currency}}","210385770":"If you have an active account, please log in to continue. Otherwise, please sign up.","211224838":"Investment","211461880":"Common names and surnames are easy to guess","211847965":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable withdrawals.","216650710":"You are using a demo account","217403651":"St. Vincent & Grenadines","217504255":"Financial assessment submitted successfully","218441288":"Identity card number","220014242":"Upload a selfie from your computer","220186645":"Text Is empty","220232017":"demo CFDs","223120514":"In this example, each point of the SMA line is an arithmetic average of close prices for the last 50 days.","223607908":"Last digit stats for latest 1000 ticks for {{underlying_name}}","224650827":"IOT/USD","224929714":"Virtual events based bets in the UK and the Isle of Man are offered by {{legal_entity_name}}, Millennium House, Level 1, Victoria Road, Douglas IM2 4RW, Isle of Man, licensed and regulated in Great Britain by the Gambling Commission under <0>account no. 39172 and by the Gambling Supervision Commission in the Isle of Man (<1>view licence).","225887649":"This block is mandatory. It's added to your strategy by default when you create new strategy. You can not add more than one copy of this block to the canvas.","227591929":"To timestamp {{ input_datetime }} {{ dummy }}","227903202":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts.","228079844":"Click here to upload","228521812":"Tests whether a string of text is empty. Returns a boolean value (true or false).","229355215":"Trade on {{platform_name_dbot}}","233500222":"- High: the highest price","235583807":"SMA is a frequently used indicator in technical analysis. It calculates the average market price over a specified period, and is usually used to identify market trend direction: up or down. For example, if the SMA is moving upwards, it means the market trend is up. ","236642001":"Journal","238496287":"Leverage trading is high-risk, so it's a good idea to use risk management features such as stop loss. Stop loss allows you to","243537306":"1. Under the Blocks menu, go to Utility > Variables.","243614144":"This is only available for existing clients.","245005091":"lower","245187862":"The DRC will make a <0>decision on the complaint (please note that the DRC mentions no timeframe for announcing its decision).","245812353":"if {{ condition }} return {{ value }}","247418415":"Gaming trading can become a real addiction, as can any other activity pushed to its limits. To avoid the danger of such an addiction, we provide a reality-check that gives you a summary of your trades and accounts on a regular basis.","248565468":"Check your {{ identifier_title }} account email and click the link in the email to proceed.","248909149":"Send a secure link to your phone","251134918":"Account Information","251322536":"Deriv EZ accounts","251445658":"Dark theme","251882697":"Thank you! Your response has been recorded into our system.<0/><0/>Please click ‘OK’ to continue.","254912581":"This block is similar to EMA, except that it gives you the entire EMA line based on the input list and the given period.","256031314":"Cash Business","256602726":"If you close your account:","258448370":"MT5","258912192":"Trading assessment","260069181":"An error occured while trying to load the URL","260086036":"Place blocks here to perform tasks once when your bot starts running.","260361841":"Tax Identification Number can't be longer than 25 characters.","261074187":"4. Once the blocks are loaded onto the workspace, tweak the parameters if you want, or hit Run to start trading.","261250441":"Drag the <0>Trade again block and add it into the <0>do part of the <0>Repeat until block.","264976398":"3. 'Error' displays a message in red to highlight something that needs to be resolved immediately.","265644304":"Trade types","267992618":"The platforms lack key features or functionality.","268940240":"Your balance ({{format_balance}} {{currency}}) is less than the current minimum withdrawal allowed ({{format_min_withdraw_amount}} {{currency}}). Please top up your account to continue with your withdrawal.","269322978":"Deposit with your local currency via peer-to-peer exchange with fellow traders in your country.","269607721":"Upload","270339490":"If you select \"Over\", you will win the payout if the last digit of the last tick is greater than your prediction.","270610771":"In this example, the open price of a candle is assigned to the variable \"candle_open_price\".","270712176":"descending","270780527":"You've reached the limit for uploading your documents.","272042258":"When you set your limits, they will be aggregated across all your account types in {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} and {{platform_name_bbot}} on Deriv. For example, the losses made on all four platforms will add up and be counted towards the loss limit you set.","272179372":"This block is commonly used to adjust the parameters of your next trade and to implement stop loss/take profit logic.","273350342":"Copy and paste the token into the app.","273728315":"Should not be 0 or empty","274268819":"Volatility 100 Index","275116637":"Deriv X","277469417":"Exclude time cannot be for more than five years.","278684544":"get sub-list from # from end","282319001":"Check your image","282564053":"Next, we'll need your proof of address.","283830551":"Your address doesn’t match your profile","283986166":"Self-exclusion on the website only applies to your {{brand_website_name}} account and does not include other companies or websites.","284527272":"antimode","284772879":"Contract","284809500":"Financial Demo","287934290":"Are you sure you want to cancel this transaction?","289898640":"TERMS OF USE","291744889":"<0>1. Trade parameters:<0>","291817757":"Go to our Deriv community and learn about APIs, API tokens, ways to use Deriv APIs, and more.","292491635":"If you select “Stop loss” and specify an amount to limit your loss, your position will be closed automatically when your loss is more than or equals to this amount. Your loss may be more than the amount you entered depending on the market price at closing.","292526130":"Tick and candle analysis","292589175":"This will display the SMA for the specified period, using a candle list.","292887559":"Transfer to {{selected_value}} is not allowed, Please choose another account from dropdown","294305803":"Manage account settings","294335229":"Sell at market price","301441673":"Select your citizenship/nationality as it appears on your passport or other government-issued ID.","301472132":"Hi! Hit <0>Start for a quick tour to help you get started.","303959005":"Sell Price:","304309961":"We're reviewing your withdrawal request. You may still cancel this transaction if you wish. Once we start processing, you won't be able to cancel.","307971599":"<0>For Call:<1/>You will get a payout if the market price is higher than the strike price at the expiry time. Your payout will grow proportionally to the distance between the market and strike prices. You will start making a profit when the payout is higher than your stake. If the market price is equal to or below the strike price at the expiry time, there won’t be a payout.","308070472":"Can I trade cryptocurrencies on DBot?","310234308":"Close all your positions.","312142140":"Save new limits?","312300092":"Trims the spaces within a given string or text.","313298169":"Our cashier is temporarily down due to system maintenance. You can access the Cashier in a few minutes when the maintenance is complete.","313741895":"This block returns “True” if the last candle is black. It can be placed anywhere on the canvas except within the Trade parameters root block.","315306603":"You have an account that do not have currency assigned. Please choose a currency to trade with this account.","316694303":"Is candle black?","318865860":"close","318984807":"This block repeats the instructions contained within for a specific number of times.","323179846":"The time interval for each candle can be set from one minute to one day.","323209316":"Select a Deriv Bot Strategy","323360883":"Baskets","325662004":"Expand Block","325763347":"result","326770937":"Withdraw {{currency}} ({{currency_symbol}}) to your wallet","327534692":"Duration value is not allowed. To run the bot, please enter {{min}}.","328539132":"Repeats inside instructions specified number of times","329353047":"Malta Financial Services Authority (MFSA) (licence no. IS/70156)","329404045":"<0>Switch to your real account<1> to create a {{platform}} {{account_title}} account.","333121115":"Select Deriv MT5's account type","333456603":"Withdrawal limits","333807745":"Click on the block you want to remove and press Delete on your keyboard.","334680754":"Switch to your real account to create a Deriv MT5 account","334942497":"Buy time","335040248":"About us","337023006":"Start time cannot be in the past.","339449279":"Remaining time","339610914":"Spread Up/Spread Down","339879944":"GBP/USD","340807218":"Description not found.","342181776":"Cancel transaction","343873723":"This block displays a message. You can specify the color of the message and choose from 6 different sound options.","344418897":"These trading limits and self-exclusion help you control the amount of money and time you spend on {{brand_website_name}} and exercise <0>responsible trading.","345320063":"Invalid timestamp","345818851":"Sorry, an internal error occurred. Hit the above checkbox to try again.","347029309":"Forex: standard/micro","347039138":"Iterate (2)","348951052":"Your cashier is currently locked","349047911":"Over","349110642":"<0>{{payment_agent}}<1>'s contact details","350602311":"Stats show the history of consecutive tick counts, i.e. the number of ticks the price remained within range continuously.","351744408":"Tests if a given text string is empty","352363702":"You may see links to websites with a fake Deriv login page where you’ll get scammed for your money.","353731490":"Job done","354945172":"Submit document","357477280":"No face found","359053005":"Please enter a token name.","359649435":"Given candle list is not valid","359809970":"This block gives you the selected candle value from a list of candles within the selected time interval. You can choose from open price, close price, high price, low price, and open time.","360224937":"Logic","360773403":"Bot Builder","362772494":"This should not exceed {{max}} characters.","362946954":"Our legacy automated trading platform.","363576009":"- High price: the highest price","363738790":"Browser","363990763":"Sell price:","367801124":"Total assets in your Deriv accounts.","368160866":"in list","369035361":"<0>•Your account number","371151609":"Last used","371710104":"This scope will allow third-party apps to buy and sell contracts for you, renew your expired purchases, and top up your demo accounts.","372291654":"Exclude time must be after today.","372645383":"True if the market direction matches the selection","373021397":"random","373306660":"{{label}} is required.","373495360":"This block returns the entire SMA line, containing a list of all values for a given period.","374537470":"No results for \"{{text}}\"","375714803":"Deal Cancellation Error","379523479":"To avoid loss of funds, do not share tokens with the Admin scope with unauthorised parties.","380606668":"tick","380694312":"Maximum consecutive trades","382781785":"Your contract is closed automatically when your profit is more than or equals to this amount.","384303768":"This block returns \"True\" if the last candle is black. It can be placed anywhere on the canvas except within the Trade parameters root block.","386191140":"You can choose between CFD trading accounts or Options and Multipliers accounts","386278304":"Install the {{platform_name_trader}} web app","386502387":"Bot is not running","389923099":"Zoom in","390647540":"Real account","390890891":"Last quarter","391915203":"Hedging","392582370":"Fall Equals","393789743":"Letters, spaces, periods, hyphens, apostrophes only.","396418990":"Offline","396801529":"To start trading, top-up funds from your Deriv account into this account.","396961806":"We do not support Polygon (Matic), to deposit please use only Ethereum ({{token}}).","398816980":"Launch {{platform_name_trader}} in seconds the next time you want to trade.","401339495":"Verify address","402343402":"Due to an issue on our server, some of your {{platform}} accounts are unavailable at the moment. Please bear with us and thank you for your patience.","403456289":"The formula for SMA is:","404743411":"Total deposits","406359555":"Contract details","406497323":"Sell your active contract if needed (optional)","408477401":"We’ve also limited the maximum duration for every contract, and it differs according to the accumulator value that you choose. Your contract will be closed automatically when the maximum duration is reached.","411482865":"Add {{deriv_account}} account","412433839":"I agree to the <0>terms and conditions.","413594348":"Only letters, numbers, space, hyphen, period, and forward slash are allowed.","416296716":"Maximum payout","417714706":"If your margin level drops below our stop out level, your positions may be closed automatically to protect you from further losses.","417864079":"You’ll not be able to change currency once you have made a deposit.","418265501":"Demo Derived","419485005":"Spot","419736603":"If yes, go to <0>Tutorials.","420072489":"CFD trading frequency","422055502":"From","424272085":"We take your financial well-being seriously and want to ensure you are fully aware of the risks before trading.<0/><0/>","424897068":"Do you understand that you could potentially lose 100% of the money you use to trade?","426031496":"Stop","427134581":"Try using another file type.","427617266":"Bitcoin","428709688":"Your preferred time interval between each report:","430975601":"Town/City is not in a proper format.","432273174":"1:100","432508385":"Take Profit: {{ currency }} {{ take_profit }}","432519573":"Document uploaded","433348384":"Real accounts are not available to politically exposed persons (PEPs).","433616983":"2. Investigation phase","434548438":"Highlight function definition","434896834":"Custom functions","436364528":"Your account will be opened with {{legal_entity_name}}, and will be subject to the laws of Saint Vincent and the Grenadines.","437138731":"Create a new {{platform}} password","437453244":"Choose your preferred cryptocurrency","437485293":"File type not supported","437904704":"Maximum open positions","438067535":"Over $500,000","442520703":"$250,001 - $500,000","443559872":"Financial SVG","444484637":"Logic negation","445419365":"1 - 2 years","450983288":"Your deposit is unsuccessful due to an error on the blockchain. Please contact your crypto wallet service provider for more info.","451852761":"Continue on your phone","452054360":"Similar to RSI, this block gives you a list of values for each entry in the input list.","453175851":"Your MT5 Financial STP account will be opened through {{legal_entity_name}}. All trading in this account is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA). None of your other accounts, including your Deriv account, is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA).","453409608":"Your profit is the percentage change in market price times your stake and the multiplier of your choice.","454196938":"Regulation:","454593402":"2. Please upload one of the following:","456746157":"Grant access to your camera from your browser settings","457020083":"It’ll take longer to verify you if we can’t read it","457494524":"1. From the block library, enter a name for the new variable and click Create.","459612953":"Select account","459817765":"Pending","460070238":"Congratulations","460975214":"Complete your Appropriateness Test","461795838":"Please contact us via live chat to unlock it.","462079779":"Resale not offered","463361726":"Select an item","465993338":"Oscar's Grind","466369320":"Your gross profit is the percentage change in market price times your stake and the multiplier chosen here.","466837068":"Yes, increase my limits","467839232":"I trade forex CFDs and other complex financial instruments regularly on other platforms.","473154195":"Settings","474306498":"We’re sorry to see you leave. Your account is now closed.","475492878":"Try Synthetic Indices","476023405":"Didn't receive the email?","477557241":"Remote blocks to load must be a collection.","478280278":"This block displays a dialog box that uses a customised message to prompt for an input. The input can be either a string of text or a number and can be assigned to a variable. When the dialog box is displayed, your strategy is paused and will only resume after you enter a response and click \"OK\".","479420576":"Tertiary","480356486":"*Boom 300 and Crash 300 Index","481276888":"Goes Outside","483279638":"Assessment Completed<0/><0/>","483591040":"Delete all {{ delete_count }} blocks?","485379166":"View transactions","487239607":"Converts a given True or False to the opposite value","488150742":"Resend email","489768502":"Change investor password","491603904":"Unsupported browser","492198410":"Make sure everything is clear","492566838":"Taxpayer identification number","497518317":"Function that returns a value","498144457":"A recent utility bill (e.g. electricity, water or gas)","498562439":"or","499522484":"1. for \"string\": 1325.68 USD","500855527":"Chief Executives, Senior Officials and Legislators","500920471":"This block performs arithmetic operations between two numbers.","501401157":"You are only allowed to make deposits","501537611":"*Maximum number of open positions","502007051":"Demo Swap-Free SVG","502041595":"This block gives you a specific candle from within the selected time interval.","503137339":"Payout limit","505793554":"last letter","508390614":"Demo Financial STP","510815408":"Letters, numbers, spaces, hyphens only","514031715":"list {{ input_list }} is empty","514776243":"Your {{account_type}} password has been changed.","514948272":"Copy link","518955798":"7. Run Once at Start","520136698":"Boom 500 Index","521872670":"item","522283618":"Digital options trading experience","522703281":"divisible by","523123321":"- 10 to the power of a given number","524459540":"How do I create variables?","527329988":"This is a top-100 common password","529056539":"Options","529597350":"If you had any open positions, we have closed them and refunded you.","530953413":"Authorised applications","531114081":"3. Contract Type","531675669":"Euro","535041346":"Max. total stake per day","538017420":"0.5 pips","538228086":"Close-Low","541650045":"Manage {{platform}} password","541700024":"First, enter your driving licence number and the expiry date.","542038694":"Only letters, numbers, space, underscore, and hyphen are allowed for {{label}}.","542305026":"You must also submit a proof of identity.","543413346":"You have no open positions for this asset. To view other open positions, click Go to Reports","543915570":"Forex, stocks, stock indices, cryptocurrencies, synthetic indices","545476424":"Total withdrawals","546534357":"If you select “Deal cancellation”, you’ll be able to cancel your trade within a chosen time frame should the market move against your favour. We’ll charge a small fee for this, but we’ll return your stake amount without profit or loss. If the stop-out amount is reached before the deal cancellation expires, your position will be cancelled automatically and we’ll return your stake amount without profit or loss. While “Deal cancellation” is active:","549479175":"Deriv Multipliers","551569133":"Learn more about trading limits","554135844":"Edit","554410233":"This is a top-10 common password","555351771":"After defining trade parameters and trade options, you may want to instruct your bot to purchase contracts when specific conditions are met. To do that you can use conditional blocks and indicators blocks to help your bot to make decisions.","555881991":"National Identity Number Slip","556264438":"Time interval","559224320":"Our classic “drag-and-drop” tool for creating trading bots, featuring pop-up trading charts, for advanced users.","561982839":"Change your currency","562599414":"This block returns the purchase price for the selected trade type. This block can be used only in the \"Purchase conditions\" root block.","563034502":"We shall try to resolve your complaint within 15 business days. We will inform you of the outcome together with an explanation of our position and propose any remedial measures we intend to take.","563166122":"We shall acknowledge receiving your complaint, review it carefully, and keep you updated on the handling process. We might request further information or clarifications to facilitate the resolution of the complaint.","563652273":"Go to block","565410797":"The below image illustrates how Simple Moving Average Array block works:","566274201":"1. Market","567019968":"A variable is among the most important and powerful components in creating a bot. It is a way to store information, either as text or numbers. The information stored as a variable can be used and changed according to the given instructions. Variables can be given any name, but usually they are given useful, symbolic names so that it is easier to call them during the execution of instructions.","567163880":"Create a {{platform}} password","567755787":"Tax Identification Number is required.","569057236":"In which country was your document issued?","571921777":"Funds protection level","572576218":"Languages","573173477":"Is candle {{ input_candle }} black?","576355707":"Select your country and citizenship:","577215477":"count with {{ variable }} from {{ start_number }} to {{ end_number }} by {{ step_size }}","577779861":"Withdrawal","577883523":"4. Awards and orders","578640761":"Call Spread","579529868":"Show all details — including the bottom 2 lines","580431127":"Restart buy/sell on error (disable for better performance): {{ checkbox }}","580665362":"Stays In/Goes Out","580774080":"insert at","581168980":"Legal","582945649":"2 minutes","584028307":"Allow equals","587577425":"Secure my account","587856857":"Want to know more about APIs?","588609216":"Repeat tour","590508080":"If you select “Take profit” and specify an amount that you’d like to earn, your position will be closed automatically when your profit is more than or equal to this amount. Your profit may be more than the amount you entered depending on the market price (and accumulator value) at closing.","592087722":"Employment status is required.","593459109":"Try a different currency","595080994":"Example: CR123456789","595136687":"Save Strategy","597089493":"Here is where you can decide to sell your contract before it expires. Only one copy of this block is allowed.","597481571":"DISCLAIMER","597707115":"Tell us about your trading experience.","599469202":"{{secondPast}}s ago","602278674":"Verify identity","603849445":"Strike price","603849863":"Look for the <0>Repeat While/Until, and click the + icon to add the block to the workspace area.","606240547":"- Natural log","606877840":"Back to today","607807243":"Get candle","609519227":"This is the email address associated with your Deriv account.","609650241":"Infinite loop detected","610537973":"Any information you provide is confidential and will be used for verification purposes only.","611020126":"View address on Blockchain","611786123":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies, Stocks, and Stock Indices","617345387":"If you select \"Reset-Up”, you win the payout if the exit spot is strictly higher than either the entry spot or the spot at reset time.","618520466":"Example of a cut-off document","619268911":"<0>a.The Financial Commission will investigate the validity of the complaint within 5 business days.","619407328":"Are you sure you want to unlink from {{identifier_title}}?","623192233":"Please complete the <0>Appropriateness Test to access your cashier.","623542160":"Exponential Moving Average Array (EMAA)","625571750":"Entry spot:","626175020":"Standard Deviation Up Multiplier {{ input_number }}","626809456":"Resubmit","627292452":"<0>Your Proof of Identity or Proof of Address did not meet our requirements. Please check your email for further instructions.","627814558":"This block returns a value when a condition is true. Use this block within either of the function blocks above.","628193133":"Account ID","629145209":"In case if the \"AND\" operation is selected, the block returns \"True\" only if both given values are \"True\"","632398049":"This block assigns a null value to an item or statement.","634219491":"You have not provided your tax identification number. This information is necessary for legal and regulatory requirements. Please go to <0>Personal details in your account settings, and fill in your latest tax identification number.","636219628":"<0>c.If no settlement opportunity can be found, the complaint will proceed to the determination phase to be handled by the DRC.","639382772":"Please upload supported file type.","640596349":"You have yet to receive any notifications","640730141":"Refresh this page to restart the identity verification process","641420532":"We've sent you an email","642210189":"Please check your email for the verification link to complete the process.","642393128":"Enter amount","642546661":"Upload back of license from your computer","642995056":"Email","644150241":"The number of contracts you have won since you last cleared your stats.","645016681":"Trading frequency in other financial instruments","645902266":"EUR/NZD","647039329":"Proof of address required","647192851":"Contract will be sold at the prevailing market price when the request is received by our servers. This price may differ from the indicated price.","647745382":"Input List {{ input_list }}","649317411":"On the basis of the information provided in relation to your knowledge and experience, we consider that the investments available via this website are not appropriate for you.<0/><1/>","649923867":"Adds a sign to a number to create a barrier offset. (deprecated)","651284052":"Low Tick","651684094":"Notify","652041791":"To create a Deriv X real account, create a Deriv real account first.","652298946":"Date of birth","654264404":"Up to 1:30","654507872":"True-False","654924603":"Martingale","655937299":"We’ll update your limits. Click <0>Accept to acknowledge that you are fully responsible for your actions, and we are not liable for any addiction or loss.","657325150":"This block is used to define trade options within the Trade parameters root block. Some options are only applicable for certain trade types. Parameters such as duration and stake are common among most trade types. Prediction is used for trade types such as Digits, while barrier offsets are for trade types that involve barriers such as Touch/No Touch, Ends In/Out, etc.","659482342":"Please remember that it is your responsibility to keep your answers accurate and up to date. You can update your personal details at any time in your account settings.","660481941":"To access your mobile apps and other third-party apps, you'll first need to generate an API token.","660991534":"Finish","661759508":"On the basis of the information provided in relation to your knowledge and experience, we consider that the investments available via this website are not appropriate for you.<0/><0/>","662548260":"Forex, Stock indices, Commodities and Cryptocurrencies","662578726":"Available","662609119":"Download the MT5 app","665089217":"Please submit your <0>proof of identity to authenticate your account and access your Cashier.","665777772":"XLM/USD","665872465":"In the example below, the opening price is selected, which is then assigned to a variable called \"op\".","666724936":"Please enter a valid ID number.","672008428":"ZEC/USD","673915530":"Jurisdiction and choice of law","674973192":"Use this password to log in to your Deriv MT5 accounts on the desktop, web, and mobile apps.","676159329":"Could not switch to default account.","677918431":"Market: {{ input_market }} > {{ input_submarket }} > {{ input_symbol }}","680334348":"This block was required to correctly convert your old strategy.","680478881":"Total withdrawal limit","681926004":"Example of a blurry document","682056402":"Standard Deviation Down Multiplier {{ input_number }}","684282133":"Trading instruments","685391401":"If you're having trouble signing in, let us know via <0>chat","686312916":"Trading accounts","686387939":"How do I clear my transaction log?","687212287":"Amount is a required field.","688510664":"You've {{two_fa_status}} 2FA on this device. You'll be logged out of your account on other devices (if any). Use your password and a 2FA code to log back in.","689137215":"Purchase price","691956534":"<0>You have added a {{currency}} account.<0> Make a deposit now to start trading.","693396140":"Deal cancellation (expired)","696870196":"- Open time: the opening time stamp","697630556":"This market is presently closed.","698037001":"National Identity Number","699159918":"1. Filing complaints","700259824":"Account currency","701034660":"We are still processing your withdrawal request.<0 />Please wait for the transaction to be completed before deactivating your account.","701462190":"Entry spot","701647434":"Search for string","702451070":"National ID (No Photo)","705299518":"Next, upload the page of your passport that contains your photo.","706413212":"To access the cashier, you are now in your {{regulation}} {{currency}} ({{loginid}}) account.","706727320":"Binary options trading frequency","706755289":"This block performs trigonometric functions.","707662672":"{{unblock_date}} at {{unblock_time}}","708055868":"Driving licence number","710123510":"repeat {{ while_or_until }} {{ boolean }}","711999057":"Successful","712101776":"Take a photo of your passport photo page","712635681":"This block gives you the selected candle value from a list of candles. You can choose from open price, close price, high price, low price, and open time.","713054648":"Sending","714080194":"Submit proof","714746816":"MetaTrader 5 Windows app","715841616":"Please enter a valid phone number (e.g. +15417541234).","716428965":"(Closed)","718504300":"Postal/ZIP code","720293140":"Log out","720519019":"Reset my password","721011817":"- Raise the first number to the power of the second number","723045653":"You'll log in to your Deriv account with this email address.","723961296":"Manage password","724203548":"You can send your complaint to the <0>European Commission's Online Dispute Resolution (ODR) platform. This is not applicable to UK clients.","728042840":"To continue trading with us, please confirm where you live.","728824018":"Spanish Index","729651741":"Choose a photo","730473724":"This block performs the \"AND\" or the \"OR\" logic operation with the given values.","731382582":"BNB/USD","734390964":"Insufficient balance","734881840":"false","742469109":"Reset Balance","742676532":"Trade CFDs on forex, derived indices, cryptocurrencies, and commodities with high leverage.","744110277":"Bollinger Bands Array (BBA)","745656178":"Use this block to sell your contract at the market price.","745674059":"Returns the specific character from a given string of text according to the selected option. ","746112978":"Your computer may take a few seconds to update","750886728":"Switch to your real account to submit your documents","751692023":"We <0>do not guarantee a refund if you make a wrong transfer.","752024971":"Reached maximum number of digits","752992217":"This block gives you the selected constant values.","753088835":"Default","753184969":"In providing our services to you, we are required to obtain information from you in order to assess whether a given product or service is appropriate for you (that is, whether you possess the experience and knowledge to understand the risks involved).<0/><1/>","753727511":"Type","755867072":"{{platform_name_mt5}} is not available in {{country}}","756152377":"SMA places equal weight to the entire distribution of values.","758003269":"make list from text","759783233":"For more information and assistance to counselling and support services, please visit <0>begambleaware.org.","760528514":"Please note that changing the value of \"i\" won't change the value of the original item in the list","761576760":"Fund your account to start trading.","762185380":"<0>Multiply returns by <0>risking only what you put in.","762871622":"{{remaining_time}}s","763019867":"Your Gaming account is scheduled to be closed","764366329":"Trading limits","764540515":"Stopping the bot is risky","766317539":"Language","770171141":"Go to {{hostname}}","772632060":"Do not send any other currency to the following address. Otherwise, you'll lose funds.","773091074":"Stake:","773309981":"Oil/USD","773336410":"Tether is a blockchain-enabled platform designed to facilitate the use of fiat currencies in a digital manner.","775679302":"{{pending_withdrawals}} pending withdrawal(s)","775706054":"Do you sell trading bots?","776085955":"Strategies","781924436":"Call Spread/Put Spread","783974693":"Avoid recent years","784311461":"Exponential Moving Average (EMA)","784583814":"Linked to your computer","785969488":"Jump 75 Index","787727156":"Barrier","788005234":"NA","792622364":"Negative balance protection","793526589":"To file a complaint about our service, send an email to <0>complaints@deriv.com and state your complaint in detail. Please submit any relevant screenshots of your trading or system for our better understanding.","793531921":"Our company is one of the oldest and most reputable online trading companies in the world. We are committed to treat our clients fairly and provide them with excellent service.<0/><1/>Please provide us with feedback on how we can improve our services to you. Rest assured that you will be heard, valued, and treated fairly at all times.","793826881":"This is your personal start page for Deriv","794682658":"Copy the link to your phone","795859446":"Password saved","797007873":"Follow these steps to recover camera access:","797500286":"negative","800228448":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}} and {{legal_entity_name_fx}}.","800521289":"Your personal details are incomplete","801430087":"A link can contain the word \"Deriv\" and still be fake.","802436811":"View transaction details","802438383":"New proof of address is needed","802556390":"seconds","802989607":"Drag your XML file here","806165583":"Australia 200","807499069":"Financial commission complaints procedure","808323704":"You can also use \"Compare\" and \"Logic operation\" blocks to make test variables.","811876954":"You may transfer between your Deriv fiat, cryptocurrency, {{platform_name_mt5}}, and {{platform_name_dxtrade}} accounts.","816580787":"Welcome back! Your messages have been restored.","816738009":"<0/><1/>You may also raise your unresolved dispute to the <2>Office of the Arbiter for Financial Services.","818447476":"Switch account?","820877027":"Please verify your proof of identity","822915673":"Earn a range of payouts by correctly predicting market price movements with <0>options, or get the upside of CFDs without risking more than your initial stake with <1>multipliers.","823186089":"A block that can contain text.","824797920":"Is list empty?","825042307":"Let’s try again","826511719":"USD/SEK","827688195":"Disable Block","828219890":"then","828602451":"Returns the list of tick values in string format","830164967":"Last name","830993327":"No current transactions available","832217983":"40 transactions or more in the past 12 months","832398317":"Sell Error","832588873":"Order execution","832721563":"If you select \"Low Tick\", you win the payout if the selected tick is the lowest among the next five ticks.","834966953":"1551661986 seconds since Jan 01 1970 (UTC) translates to 03/04/2019 @ 1:13am (UTC).","835058671":"Total buy price","835350845":"Add another word or two. Uncommon words are better.","836097457":"I am interested in trading but have very little experience.","837066896":"Your document is being reviewed, please check back in 1-3 days.","839618971":"ADDRESS","839805709":"To smoothly verify you, we need a better photo","841434703":"Disable stack","841543189":"View transaction on Blockchain","843333337":"You can only make deposits. Please complete the <0>financial assessment to unlock withdrawals.","845213721":"Logout","845304111":"Slow EMA Period {{ input_number }}","847888634":"Please withdraw all your funds.","850582774":"Please update your personal info","851054273":"If you select \"Higher\", you win the payout if the exit spot is strictly higher than the barrier.","851264055":"Creates a list with a given item repeated for a specific number of times.","851508288":"This block constrains a given number within a set range.","852527030":"Step 2","852583045":"Tick List String","854399751":"Digit code must only contain numbers.","854630522":"Choose a cryptocurrency account","857363137":"Volatility 300 (1s) Index","857445204":"Deriv currently supports withdrawals of Tether eUSDT to Ethereum wallet. To ensure a successful transaction, enter a wallet address compatible with the tokens you wish to withdraw. <0>Learn more","857986403":"do something","860319618":"Tourism","862283602":"Phone number*","863328851":"Proof of identity","864610268":"First, enter your {{label}} and the expiry date.","864957760":"Math Number Positive","865424952":"High-to-Low","865642450":"2. Logged in from a different browser","866496238":"Make sure your license details are clear to read, with no blur or glare","868826608":"Excluded from {{brand_website_name}} until","869823595":"Function","869993298":"Minimum withdrawal","872549975":"You have {{number}} transfers remaining for today.","872661442":"Are you sure you want to update email <0>{{prev_email}} to <1>{{changed_email}}?","872721776":"2. Select your XML file and hit Select.","872817404":"Entry Spot Time","873166343":"1. 'Log' displays a regular message.","874461655":"Scan the QR code with your phone","874484887":"Take profit must be a positive number.","875532284":"Restart process on a different device","876086855":"Complete the financial assessment form","876292912":"Exit","879014472":"Reached maximum number of decimals","881000060":"{{transaction_type_display_text}} {{currency}}","885065431":"Get a Deriv account","888274063":"Town/City","888924866":"We don’t accept the following inputs for:","890299833":"Go to Reports","891337947":"Select country","892341141":"Your trading statistics since: {{date_time}}","893117915":"Variable","893963781":"Close-to-Low","893975500":"You do not have any recent bots","894191608":"<0>c.We must award the settlement within 28 days of when the decision is reached.","898457777":"You have added a Deriv Financial account.","900646972":"page.","901096150":"Earn a range of payouts by correctly predicting market price movements with <0>options, or get the\n upside of CFDs without risking more than your initial stake with <1>multipliers.","902045490":"3 minutes","903429103":"In candles list read {{ candle_property }} # from end {{ input_number }}","904696726":"API token","905134118":"Payout:","905227556":"Strong passwords contain at least 8 characters, combine uppercase and lowercase letters and numbers.","905564365":"MT5 CFDs","906049814":"We’ll review your documents and notify you of its status within 5 minutes.","907680782":"Proof of ownership verification failed","910888293":"Too many attempts","912406629":"Follow these steps:","912967164":"Import from your computer","915735109":"Back to {{platform_name}}","918447723":"Real","920125517":"Add demo account","921901739":"- your account details of the bank linked to your account","924046954":"Upload a document showing your name and bank account number or account details.","926813068":"Fixed/Variable","929608744":"You are unable to make withdrawals","930346117":"Capitalization doesn't help very much","930546422":"Touch","933126306":"Enter some text here","933193610":"Only letters, periods, hyphens, apostrophes, and spaces, please.","934835052":"Potential profit","934932936":"PERSONAL","936766426":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit.","937237342":"Strategy name cannot be empty","937682366":"Upload both of these documents to prove your identity.","937831119":"Last name*","937992258":"Table","938500877":"{{ text }}. <0>You can view the summary of this transaction in your email.","938988777":"High barrier","943535887":"Please close your positions in the following Deriv MT5 account(s):","944499219":"Max. open positions","945532698":"Contract sold","946204249":"Read","946841802":"A white (or green) candle indicates that the open price is lower than the close price. This represents an upward movement of the market price.","946944859":"Hit the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.","947046137":"Your withdrawal will be processed within 24 hours","947363256":"Create list","947758334":"City is required","947914894":"Top up  <0>","948156236":"Create {{type}} password","948545552":"150+","949859957":"Submit","952927527":"Regulated by the Malta Financial Services Authority (MFSA) (licence no. IS/70156)","955352264":"Trade on {{platform_name_dxtrade}}","956448295":"Cut-off image detected","957182756":"Trigonometric functions","957956227":"Congratulations, you have successfully created your {{category}} {{deriv_keyword}} <0>{{platform}} <1>{{type}} account.","958430760":"In/Out","959031082":"set {{ variable }} to MACD Array {{ dropdown }} {{ dummy }}","960201789":"3. Sell conditions","961178214":"You can only purchase one contract at a time","961266215":"140+","961327418":"My computer","961692401":"Bot","966457287":"set {{ variable }} to Exponential Moving Average {{ dummy }}","968576099":"Up/Down","969987233":"Win up to maximum payout if exit spot is between lower and upper barrier, in proportion to the difference between exit spot and lower barrier.","970915884":"AN","974888153":"High-Low","975668699":"I confirm and accept {{company}} 's <0>Terms and Conditions","975950139":"Country of Residence","977929335":"Go to my account settings","981138557":"Redirect","981568830":"You have chosen to exclude yourself from trading on our website until {{exclude_until}}. If you are unable to place a trade or deposit after your self-exclusion period, please contact us via <0>live chat.","981965437":"Scan the QR code below with your 2FA app. We recommend <0>Authy or <1>Google Authenticator.","982146443":"WhatsApp","982402892":"First line of address","982829181":"Barriers","983451828":"2. Select the asset and trade type.","987224688":"How many trades have you placed with other financial instruments in the past 12 months?","988361781":"You have no trading activity yet.","988934465":"When prompted, you must enable camera access to continue","989021200":"Predict the market direction and movement size, and select either “Call” or “Put” to open a position.","990739582":"170+","992294492":"Your postal code is invalid","992677950":"Logging out on other devices","993827052":"Choosing this jurisdiction will give you a Financial STP account. Your trades will go directly to the market and have tighter spreads.","995563717":"not {{ boolean }}","999008199":"text","1001160515":"Sell","1001749987":"You’ll get a warning, named margin call, if your account balance drops down close to the stop out level.","1003876411":"Should start with letter or number and may contain a hyphen, period and slash.","1004127734":"Send email","1006458411":"Errors","1006664890":"Silent","1009032439":"All time","1010198306":"This block creates a list with strings and numbers.","1010337648":"We were unable to verify your proof of ownership.","1012102263":"You will not be able to log in to your account until this date (up to 6 weeks from today).","1015201500":"Define your trade options such as duration and stake.","1016220824":"You need to switch to a real money account to use this feature.<0/>You can do this by selecting a real account from the <1>Account Switcher.","1018803177":"standard deviation","1019265663":"You have no transactions yet.","1019508841":"Barrier 1","1021679446":"Multipliers only","1022934784":"1 minute","1023237947":"1. In the example below, the instructions are repeated as long as the value of x is less than or equal to 10. Once the value of x exceeds 10, the loop is terminated.","1023643811":"This block purchases contract of a specified type.","1023795011":"Even/Odd","1024205076":"Logic operation","1025887996":"Negative Balance Protection","1026046972":"Please enter a payout amount that's lower than {{max_payout}}.","1027098103":"Leverage gives you the ability to trade a larger position using your existing capital. Leverage varies across different symbols.","1028211549":"All fields are required","1028758659":"Citizenship*","1029164365":"We presume that you possess the experience, knowledge, and expertise to make your own investment decisions and properly assess the risk involved.","1030021206":"change {{ variable }} by {{ number }}","1031602624":"We've sent a secure link to %{number}","1031731167":"Pound Sterling","1032173180":"Deriv","1032907147":"AUD/NZD","1035506236":"Choose a new password","1035893169":"Delete","1036116144":"Speculate on the price movement of an asset without actually owning it.","1036867749":"The desired duration, stake, prediction, and/or barrier(s) for the contract is defined here.","1038575777":"Change password","1039428638":"EU regulation","1039755542":"Use a few words, avoid common phrases","1040053469":"For Call","1040472990":"1. Go to Bot Builder.","1040677897":"To continue trading, you must also submit a proof of address.","1041001318":"This block performs the following operations on a given list: sum, minimum, maximum, average, median, mode, antimode, standard deviation, random item.","1041620447":"If you are unable to scan the QR code, you can manually enter this code instead:","1042659819":"You have an account that needs action","1043483281":"Click Run when you want to start trading, and click Stop when you want to stop.","1043790274":"There was an error","1044230481":"This is an Ethereum ({{token}}) only address, please do not use {{prohibited_token}}.","1044540155":"100+","1044599642":"<0> has been credited into your {{platform}} {{title}} account.","1045704971":"Jump 150 Index","1045782294":"Click the <0>Change password button to change your Deriv password.","1047389068":"Food Services","1047881477":"Unfortunately, your browser does not support the video.","1048687543":"Labuan Financial Services Authority","1048947317":"Sorry, this app is unavailable in {{clients_country}}.","1049384824":"Rise","1050128247":"I confirm that I have verified the payment agent’s transfer information.","1050844889":"Reports","1052137359":"Family name*","1052779010":"You are on your demo account","1053153674":"Jump 50 Index","1053159279":"Level of education","1053556481":"Once you submit your complaint, we will send you an acknowledgement email to confirm that we have received it.","1055313820":"No document detected","1056381071":"Return to trade","1056821534":"Are you sure?","1057216772":"text {{ input_text }} is empty","1057749183":"Two-factor authentication (2FA)","1057765448":"Stop out level","1057904606":"The concept of the D’Alembert Strategy is said to be similar to the Martingale Strategy where you will increase your contract size after a loss. With the D’Alembert Strategy, you will also decrease your contract size after a successful trade.","1060231263":"When are you required to pay an initial margin?","1061308507":"Purchase {{ contract_type }}","1062536855":"Equals","1065353420":"110+","1065498209":"Iterate (1)","1066235879":"Transferring funds will require you to create a second account.","1066459293":"4.3. Acknowledging your complaint","1069347258":"The verification link you used is invalid or expired. Please request for a new one.","1069576070":"Purchase lock","1070624871":"Check proof of address document verification status","1073261747":"Verifications","1076006913":"Profit/loss on the last {{item_count}} contracts","1077515534":"Date to","1078221772":"Leverage prevents you from opening large positions.","1080068516":"Action","1080990424":"Confirm","1082158368":"*Maximum account cash balance","1082406746":"Please enter a stake amount that's at least {{min_stake}}.","1083781009":"Tax identification number*","1083826534":"Enable Block","1086118495":"Traders Hub","1088031284":"Strike:","1088138125":"Tick {{current_tick}} - ","1089085289":"Mobile number","1089436811":"Tutorials","1089687322":"Stop your current bot?","1095295626":"<0>•The Arbiter for Financial Services will determine whether the complaint can be accepted and is in accordance with the law.","1096078516":"We’ll review your documents and notify you of its status within 3 days.","1096175323":"You’ll need a Deriv account","1098147569":"Purchase commodities or shares of a company.","1098622295":"\"i\" starts with the value of 1, and it will be increased by 2 at every iteration. The loop will repeat until \"i\" reaches the value of 12, and then the loop is terminated.","1099892929":"Save bot","1100133959":"National ID","1100870148":"To learn more about account limits and how they apply, please go to the <0>Help Centre.","1101560682":"stack","1101712085":"Buy Price","1102420931":"Next, upload the front and back of your driving licence.","1102995654":"Calculates Exponential Moving Average (EMA) list from a list of values with a period","1103309514":"Target","1103452171":"Cookies help us to give you a better experience and personalised content on our site.","1104912023":"Pending verification","1107474660":"Submit proof of address","1107555942":"To","1109217274":"Success!","1110102997":"Statement","1112582372":"Interval duration","1113119682":"This block gives you the selected candle value from a list of candles.","1113292761":"Less than 8MB","1114679006":"You have successfully created your bot using a simple strategy.","1117863275":"Security and safety","1118294625":"You have chosen to exclude yourself from trading on our website until {{exclusion_end}}. If you are unable to place a trade or deposit after your self-exclusion period, please contact us via live chat.","1119887091":"Verification","1119986999":"Your proof of address was submitted successfully","1120985361":"Terms & conditions updated","1122910860":"Please complete your <0>financial assessment.","1123927492":"You have not selected your account currency","1125090693":"Must be a number","1126075317":"Add your Deriv MT5 <0>{{account_type_name}} STP account under Deriv (FX) Ltd regulated by Labuan Financial Services Authority (Licence no. MB/18/0024).","1126934455":"Length of token name must be between 2 and 32 characters.","1127149819":"Make sure§","1127224297":"Sorry for the interruption","1128139358":"How many CFD trades have you placed in the past 12 months?","1128321947":"Clear All","1128404172":"Undo","1129124569":"If you select \"Under\", you will win the payout if the last digit of the last tick is less than your prediction.","1129842439":"Please enter a take profit amount.","1130744117":"We shall try to resolve your complaint within 10 business days. We will inform you of the outcome together with an explanation of our position and propose any remedial measures we intend to take.","1130791706":"N","1133651559":"Live chat","1134405047":"Welcome to DBot!","1134879544":"Example of a document with glare","1138126442":"Forex: standard","1139483178":"Enable stack","1143730031":"Direction is {{ direction_type }}","1144028300":"Relative Strength Index Array (RSIA)","1145927365":"Run the blocks inside after a given number of seconds","1146064568":"Go to Deposit page","1147269948":"Barrier cannot be zero.","1147625645":"Please proceed to withdraw all your funds from your account before <0>30 November 2021.","1150637063":"*Volatility 150 Index and Volatility 250 Index","1151964318":"both sides","1152294962":"Upload the front of your driving licence.","1154021400":"list","1154239195":"Title and name","1155011317":"This block converts the date and time to the number of seconds since the Unix Epoch (1970-01-01 00:00:00).","1155626418":"below","1158678321":"<0>b.The Head of the Dispute Resolution Committee (DRC) will contact both you and us within 5 business days to obtain all necessary information and see if there is a chance to settle the complaint during the investigation phase.","1160761178":"No payout if exit spot is below or equal to the lower barrier.","1161924555":"Please select an option","1163771266":"The third block is <0>optional. You may use this block if you want to sell your contract before it expires. For now, leave the block as it is. ","1163836811":"Real Estate","1164773983":"Take profit and/or stop loss are not available while deal cancellation is active.","1166128807":"Choose one of your accounts or add a new cryptocurrency account","1166377304":"Increment value","1168029733":"Win payout if exit spot is also equal to entry spot.","1169201692":"Create {{platform}} password","1170228717":"Stay on {{platform_name_trader}}","1171765024":"Step 3","1173770679":"- currentPL: Use this variable to store the cumulative profit or loss while your bot is running. Set the initial value to 0.","1174542625":"- Find the chat ID property in the response, and copy the value of the id property","1174748431":"Payment channel","1175183064":"Vanuatu","1176926166":"Experience with trading other financial instruments","1177396776":"If you select \"Asian Fall\", you will win the payout if the last tick is lower than the average of the ticks.","1177723589":"There are no transactions to display","1178582280":"The number of contracts you have lost since you last cleared your stats.","1178800778":"Take a photo of the back of your license","1178942276":"Please try again in a minute.","1179704370":"Please enter a take profit amount that's higher than the current potential profit.","1180619731":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts, up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts, and up to {{ allowed_dxtrade }} transfers between your Deriv and {{platform_name_dxtrade}} accounts.","1181396316":"This block gives you a random number from within a set range","1181770592":"Profit/loss from selling","1183007646":"- Contract type: the name of the contract type such as Rise, Fall, Touch, No Touch, etс.","1184968647":"Close your contract now or keep it running. If you decide to keep it running, you can check and close it later on the ","1188316409":"To receive your funds, contact the payment agent with the details below","1188980408":"5 minutes","1189249001":"4.1. What is considered a complaint?","1189368976":"Please complete your personal details before you verify your identity.","1191429031":"Please click on the link in the email to change your <0>{{platform_name_dxtrade}} password.","1191644656":"Predict the market direction and select either “Up” or “Down” to open a position. We will charge a commission when you open a position.","1195393249":"Notify {{ notification_type }} with sound: {{ notification_sound }} {{ input_message }}","1196683606":"Deriv MT5 CFDs demo account","1197326289":"You are no longer able to trade digital options on any of our platforms. Also, you can’t make deposits into your Options account.","1198368641":"Relative Strength Index (RSI)","1199281499":"Last Digits List","1201533528":"Contracts won","1201773643":"numeric","1203297580":"This block sends a message to a Telegram channel.","1204223111":"In this example, the open prices from a list of candles are assigned to a variable called \"candle_list\".","1206227936":"How to mask your card?","1206821331":"Armed Forces","1207152000":"Choose a template and set your trade parameters.","1208729868":"Ticks","1208903663":"Invalid token","1211912982":"Bot is starting","1214893428":"Account creation is currently unavailable for mobile. Please log in with your computer to create a new account.","1216408337":"Self-Employed","1217159705":"Bank account number","1217481729":"Tether as an ERC20 token (eUSDT) is a version of Tether that is hosted on Ethereum.","1218546232":"What is Fiat onramp?","1219844088":"do %1","1221250438":"To enable withdrawals, please submit your <0>Proof of Identity (POI) and <1>Proof of Address (POA) and also complete the <2>financial assessment in your account settings.","1222096166":"Deposit via bank wire, credit card, and e-wallet","1222521778":"Making deposits and withdrawals is difficult.","1222544232":"We’ve sent you an email","1225150022":"Number of assets","1227074958":"random fraction","1227240509":"Trim spaces","1228534821":"Some currencies may not be supported by payment agents in your country.","1229883366":"Tax identification number","1230884443":"State/Province (optional)","1231282282":"Use only the following special characters: {{permitted_characters}}","1232291311":"Maximum withdrawal remaining","1232353969":"0-5 transactions in the past 12 months","1233300532":"Payout","1234292259":"Source of wealth","1234764730":"Upload a screenshot of your name and email address from the personal details section.","1235426525":"50%","1237330017":"Pensioner","1238311538":"Admin","1239760289":"Complete your trading assessment","1239940690":"Restarts the bot when an error is encountered.","1240027773":"Please Log in","1241238585":"You may transfer between your Deriv fiat, cryptocurrency, and {{platform_name_mt5}} accounts.","1242288838":"Hit the checkbox above to choose your document.","1243064300":"Local","1246207976":"Enter the authentication code generated by your 2FA app:","1246880072":"Select issuing country","1247280835":"Our cryptocurrency cashier is temporarily down due to system maintenance. You can make cryptocurrency deposits and withdrawals in a few minutes when the maintenance is complete.","1248018350":"Source of income","1248940117":"<0>a.The decisions made by the DRC are binding on us. DRC decisions are binding on you only if you accept them.","1250495155":"Token copied!","1252669321":"Import from your Google Drive","1254565203":"set {{ variable }} to create list with","1255909792":"last","1255963623":"To date/time {{ input_timestamp }} {{ dummy }}","1258097139":"What could we do to improve?","1258198117":"positive","1259598687":"GBP/JPY","1260259925":"Phone is not in a proper format.","1263387702":"All {{count}} account types use market execution. This means you agree with the broker's price in advance and will place orders at the broker's price.","1264096613":"Search for a given string","1264842111":"You can switch between real and demo accounts.","1265704976":"","1270581106":"If you select \"No Touch\", you win the payout if the market never touches the barrier at any time during the contract period.","1272012156":"GBP/CHF","1272337240":"Days","1272681097":"Hours","1274819385":"3. Complaints and Disputes","1281045211":"Sorts the items in a given list, by their numeric or alphabetical value, in either ascending or descending order.","1281290230":"Select","1282951921":"Only Downs","1284522768":"If \"Loss\" is selected, it will return \"True\" if your last trade was unsuccessful. Otherwise, it will return an empty string.","1286094280":"Withdraw","1286507651":"Close identity verification screen","1288965214":"Passport","1289146554":"British Virgin Islands Financial Services Commission","1289646209":"Margin call","1290525720":"Example: ","1291887623":"Digital options trading frequency","1292188546":"Reset Deriv MT5 investor password","1292891860":"Notify Telegram","1293660048":"Max. total loss per day","1294756261":"This block creates a function, which is a group of instructions that can be executed at any time. Place other blocks in here to perform any kind of action that you need in your strategy. When all the instructions in a function have been carried out, your bot will continue with the remaining blocks in your strategy. Click the “do something” field to give it a name of your choice. Click the plus icon to send a value (as a named variable) to your function.","1295284664":"Please accept our <0>updated Terms and Conditions to proceed.","1296380713":"Close my contract","1297577226":"Create your bot easily using our drag-and-drop blocks to match your desired trading strategy, or choose from our pre-made Quick Strategies.","1299479533":"8 hours","1300576911":"Please resubmit your proof of address or we may restrict your account.","1302691457":"Occupation","1303016265":"Yes","1303530014":"We’re processing your withdrawal.","1304083330":"copy","1304272843":"Please submit your proof of address.","1304620236":"Enable camera","1304788377":"<0/><1/>If your complaint relates to our data processing practices, you can submit a formal complaint to the <2>Information and Data Protection Commissioner (Malta) on their website or make a complaint to any supervisory authority within the European Union.","1304807342":"Compare CFDs demo accounts","1305217290":"Upload the back of your identity card.","1308625834":"Sets the default time interval for blocks that read list of candles.","1309017029":"Enabling this allows you to save your blocks as one collection which can be easily integrated into other bots.","1309044871":"Returns the value of the latest tick in string format","1310483610":"Results for \"{{ search_term }}\"","1311680770":"payout","1311799109":"We do not support Binance Smart Chain tokens to deposit, please use only Ethereum ({{token}}).","1313167179":"Please log in","1316216284":"You can use this password for all your {{platform}} accounts.","1319217849":"Check your mobile","1320750775":"Front and back","1322804930":"Restart the process on the latest version of Google Chrome","1323327633":"Our complaints process comprises the following 4 steps:","1323476617":"Changes the capitalisation of a string of text to Upper case, Lower case, Title case.","1323996051":"Profile","1324110809":"Address information","1324922837":"2. The new variable will appear as a block under Set variable.","1327181172":"Financial Vanuatu","1327494533":"{{sell_value}} (Sell)","1329136554":"Jump 200 Index","1329325646":"The content of this block is called on every tick","1331199417":"Please enter the correct format. ","1331367811":"Client account number","1332168410":"Learn more","1332168769":"Disconnect","1333576137":"Please update your {{details}} to continue.","1333839457":"Submit identity card (front)","1334326985":"It may take a few minutes to arrive","1335967988":"Notice","1336052175":"Switch accounts","1337846406":"This block gives you the selected candle value from a list of candles within the selected time interval.","1337864666":"Photo of your document","1338496204":"Ref. ID","1339613797":"Regulator/External dispute resolution","1341840346":"View in Journal","1346204508":"Take profit","1346339408":"Managers","1347071802":"{{minutePast}}m ago","1348009461":"Please close your positions in the following Deriv X account(s):","1349133669":"Try changing your search criteria.","1349289354":"Great, that's everything we need","1349295677":"in text {{ input_text }} get substring from {{ position1 }} {{ index1 }} to {{ position2 }} {{ index2 }}","1351906264":"This feature is not available for payment agents.","1353197182":"Please select","1353958640":"You can also use these shortcuts to import or build your bot.","1354288636":"Based on your answers, it looks like you have insufficient knowledge and experience in trading CFDs. CFD trading is risky and you could potentially lose all of your capital.<0/><0/>","1355250245":"{{ calculation }} of list {{ input_list }}","1356574493":"Returns a specific portion of a given string of text.","1356607862":"Deriv password","1357129681":"{{num_day}} days {{num_hour}} hours {{num_minute}} minutes","1357213116":"Identity card","1358543466":"Not available","1358543748":"enabled","1359424217":"You have sold this contract at <0 />","1360929368":"Add a Deriv account","1362578283":"High","1363060668":"Your trading statistics since:","1363645836":"Derived FX","1363675688":"Duration is a required field.","1364958515":"Stocks","1366244749":"Limits","1367023655":"To ensure your loss does not exceed your stake, your contract will be closed automatically when your loss equals to <0/>.","1367488817":"4. Restart trading conditions","1367990698":"Volatility 10 Index","1369709538":"Our terms of use","1370647009":"Enjoy higher daily limits","1371193412":"Cancel","1371555192":"Choose your preferred payment agent and enter your withdrawal amount. If your payment agent is not listed, <0>search for them using their account number.","1371641641":"Open the link on your mobile","1371911731":"Financial products in the EU are offered by {{legal_entity_name}}, licensed as a Category 3 Investment Services provider by the Malta Financial Services Authority (<0>Licence no. IS/70156).","1374627690":"Max. account balance","1376329801":"Last 60 days","1378419333":"Ether","1383017005":"You have switched accounts.","1384127719":"You should enter {{min}}-{{max}} numbers.","1384222389":"Please submit valid identity documents to unlock the cashier.","1385418910":"Please set a currency for your existing real account before creating another account.","1387503299":"Log in","1388770399":"Proof of identity required","1389197139":"Import error","1390792283":"Trade parameters","1391174838":"Potential payout:","1392966771":"Mrs","1392985917":"This is similar to a commonly used password","1393559748":"Invalid date/time: {{ datetime_string }}","1393901361":"There’s an app for that","1393903598":"if true {{ return_value }}","1396179592":"Commission","1396417530":"Bear Market Index","1397628594":"Insufficient funds","1400341216":"We’ll review your documents and notify you of its status within 1 to 3 days.","1400637999":"(All fields are required)","1400732866":"View from camera","1400962248":"High-Close","1402208292":"Change text case","1403376207":"Update my details","1405584799":"with interval: {{ candle_interval_type }}","1407191858":"DTrader","1408844944":"Click the plus icon to extend the functionality of this block.","1410320737":"Go to Deriv MT5 dashboard","1412535872":"You can check the result of the last trade with this block. It can only be placed within the \"Restart trading conditions\" root block.","1413047745":"Assigns a given value to a variable","1413359359":"Make a new transfer","1414205271":"prime","1415006332":"get sub-list from first","1415974522":"If you select \"Differs\", you will win the payout if the last digit of the last tick is not the same as your prediction.","1417558007":"Max. total loss over 7 days","1417914636":"Login ID","1418115525":"This block repeats instructions as long as a given condition is true.","1421749665":"Simple Moving Average (SMA)","1422060302":"This block replaces a specific item in a list with another given item. It can also insert the new item in the list at a specific position.","1422129582":"All details must be clear — nothing blurry","1423082412":"Last Digit","1423296980":"Enter your SSNIT number","1424741507":"See more","1424779296":"If you've recently used bots but don't see them in this list, it may be because you:","1428657171":"You can only make deposits. Please contact us via <0>live chat for more information.","1430396558":"5. Restart buy/sell on error","1430632931":"To get trading, please confirm who you are, and where you live.","1433367863":"Sorry, an error occured while processing your request.","1433468641":"We offer our services in all countries, except for the ones mentioned in our terms and conditions.","1434382099":"Displays a dialog window with a message","1434976996":"Announcement","1435363248":"This block converts the number of seconds since the Unix Epoch to a date and time format such as 2019-08-01 00:00:00.","1435380105":"Minimum deposit","1437396005":"Add comment","1438247001":"A professional client receives a lower degree of client protection due to the following.","1438340491":"else","1439168633":"Stop loss:","1441208301":"Total<0 />profit/loss","1442747050":"Loss amount: <0>{{profit}}","1442840749":"Random integer","1443478428":"Selected proposal does not exist","1444843056":"Corporate Affairs Commission","1445592224":"You accidentally gave us another email address (Usually a work or a personal one instead of the one you meant).","1446742608":"Click here if you ever need to repeat this tour.","1449462402":"In review","1452260922":"Too many failed attempts","1452941569":"This block delays execution for a given number of seconds. You can place any blocks within this block. The execution of other blocks in your strategy will be paused until the instructions in this block are carried out.","1453317405":"This block gives you the balance of your account either as a number or a string of text.","1454406889":"Choose <0>until as the repeat option.","1454648764":"deal reference id","1454865058":"Do not enter an address linked to an ICO purchase or crowdsale. If you do, the ICO tokens will not be credited into your account.","1455741083":"Upload the back of your driving licence.","1457341530":"Your proof of identity verification has failed","1457603571":"No notifications","1458160370":"Enter your {{platform}} password to add a {{platform_name}} {{account}} {{jurisdiction_shortcode}} account.","1459761348":"Submit proof of identity","1461323093":"Display messages in the developer’s console.","1464190305":"This block will transfer the control back to the Purchase conditions block, enabling you to purchase another contract without manually stopping and restarting your bot.","1464253511":"You already have an account for each of the cryptocurrencies available on {{deriv}}.","1465084972":"How much experience do you have with other financial instruments?","1465919899":"Pick an end date","1466430429":"Should be between {{min_value}} and {{max_value}}","1466900145":"Doe","1467017903":"This market is not yet available on {{platform_name_trader}}, but it is on {{platform_name_smarttrader}}.","1467421920":"with interval: %1","1467661678":"Cryptocurrency trading","1467880277":"3. General queries","1468308734":"This block repeats instructions as long as a given condition is true","1468419186":"Deriv currently supports withdrawals of Tether USDT to Omni wallet. To ensure a successful transaction, enter a wallet address compatible with the tokens you wish to withdraw. <0>Learn more","1468937050":"Trade on {{platform_name_trader}}","1469150826":"Take Profit","1469764234":"Cashier Error","1469814942":"- Division","1470319695":"Returns either True or False","1471070549":"Can contract be sold?","1471741480":"Severe error","1473369747":"Synthetics only","1476301886":"Similar to SMA, this block gives you the entire SMA line containing a list of all values for a given period.","1478030986":"Create or delete API tokens for trading and withdrawals","1480915523":"Skip","1481977420":"Please help us verify your withdrawal request.","1483470662":"Click ‘Open’ to start trading with your account","1484336612":"This block is used to either terminate or continue a loop, and can be placed anywhere within a loop block.","1487086154":"Your documents were submitted successfully","1488126519":"Your bots","1488548367":"Upload again","1490583127":"DBot isn't quite ready for real accounts","1491392301":"<0>Sold for: {{sold_for}}","1492686447":"Your MT5 Financial STP account will be opened through Deriv (FX) Ltd. All trading in this account is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA). None of your other accounts, including your Deriv account, is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA).","1493673429":"Change email","1493866481":"Run Deriv X on your browser","1496810530":"GBP/AUD","1497773819":"Deriv MT5 accounts","1499074768":"Add a real Deriv Multipliers account","1499080621":"Tried to perform an invalid operation.","1501691227":"Add Your Deriv MT5 <0>{{account_type_name}} account under Deriv (V) Ltd, regulated by the Vanuatu Financial Services Commission.","1502039206":"Over {{barrier}}","1502325741":"Your password cannot be the same as your email address.","1503618738":"- Deal reference ID: the reference ID of the contract","1505420815":"No payment agents found for your search","1505898522":"Download stack","1505927599":"Our servers hit a bump. Let’s refresh to move on.","1509570124":"{{buy_value}} (Buy)","1509678193":"Education","1510075920":"Gold/USD","1510357015":"Tax residence is required.","1510735345":"This block gives you a list of the last digits of the last 1000 tick values.","1512469749":"In the above example it is assumed that variable candle_open_price is processed somewhere within other blocks.","1516537408":"You can no longer trade on Deriv or deposit funds into your account.","1516559721":"Please select one file only","1516676261":"Deposit","1516834467":"‘Get’ the accounts you want","1517503814":"Drop file or click here to upload","1519124277":"Derived SVG","1519891032":"Welcome to Trader's Hub","1520332426":"Net annual income","1524636363":"Authentication failed","1526483456":"2. Enter a name for your variable, and hit Create. New blocks containing your new variable will appear below.","1527251898":"Unsuccessful","1527906715":"This block adds the given number to the selected variable.","1531017969":"Creates a single text string from combining the text value of each attached item, without spaces in between. The number of items can be added accordingly.","1533177906":"Fall","1534569275":"As part of the changes in our markets, we will be closing our UK clients’ accounts.","1534796105":"Gets variable value","1537711064":"You need to make a quick identity verification before you can access the Cashier. Please go to your account settings to submit your proof of identity.","1540585098":"Decline","1541508606":"Looking for CFDs? Go to Trader's Hub","1541969455":"Both","1542742708":"Synthetics, Forex, Stocks, Stock indices, Commodities, and Cryptocurrencies","1544642951":"If you select \"Only Ups\", you win the payout if consecutive ticks rise successively after the entry spot. No payout if any tick falls or is equal to any of the previous ticks.","1547148381":"That file is too big (only up to 8MB allowed). Please upload another file.","1548765374":"Verification of document number failed","1549098835":"Total withdrawn","1551172020":"AUD Basket","1552162519":"View onboarding","1552918367":"Send only {{currency}} ({{currency_symbol}}) to this address.","1555345325":"User Guide","1557426040":"Demo Derived SVG","1557682012":"Account Settings","1558972889":"set {{ variable }} to Simple Moving Average {{ dummy }}","1559136143":"No, we don't offer cryptocurrencies on DBot.","1559220089":"Options and multipliers trading platform.","1560302445":"Copied","1562374116":"Students","1564392937":"When you set your limits or self-exclusion, they will be aggregated across all your account types in {{platform_name_trader}} and {{platform_name_dbot}}. For example, the losses made on both platforms will add up and be counted towards the loss limit you set.","1566037033":"Bought: {{longcode}} (ID: {{transaction_id}})","1567076540":"Only use an address for which you have proof of residence - ","1567586204":"Self-exclusion","1567745852":"Bot name","1569624004":"Dismiss alert","1570484627":"Ticks list","1571303610":"3. Set your trade parameters and hit Create.","1571575776":"Accepted formats: pdf, jpeg, jpg, and png. Max file size: 8MB","1572504270":"Rounding operation","1572982976":"Server","1573429525":"Call/Put","1573533094":"Your document is pending for verification.","1575556189":"Tether on the Ethereum blockchain, as an ERC20 token, is a newer transport layer, which now makes Tether available in Ethereum smart contracts. As a standard ERC20 token, it can also be sent to any Ethereum address.","1577480486":"Your mobile link will expire in one hour","1577527507":"Account opening reason is required.","1577612026":"Select a folder","1579839386":"Appstore","1580498808":"Multiple faces found","1584109614":"Ticks String List","1584936297":"XML file contains unsupported elements. Please check or modify file.","1585859194":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts, your Deriv fiat and {{platform_name_derivez}} accounts, and your Deriv fiat and {{platform_name_dxtrade}} accounts.","1587046102":"Documents from that country are not currently supported — try another document type","1589148299":"Start","1589640950":"Resale of this contract is not offered.","1589702653":"Proof of address","1590400723":"Total assets in all your accounts","1591933071":"Resubmit document","1593010588":"Login now","1594147169":"Please come back in","1594322503":"Sell is available","1596378630":"You have added a real Gaming account.<0/>Make a deposit now to start trading.","1597672660":"Deriv MT5 Password","1598009247":"<0>a.You may file a complaint with the Financial Commission up to 45 days after the incident.","1598386296":"Town/City is required.","1598443642":"Transaction hash","1602894348":"Create a password","1604171868":"Please withdraw all your funds as soon as possible.","1604916224":"Absolute","1605222432":"I have no knowledge and experience in trading at all.","1605292429":"Max. total loss","1611306795":"How is my bot doing?","1612105450":"Get substring","1612638396":"Cancel your trade at any time within a specified timeframe.","1613633732":"Interval should be between 10-60 minutes","1615897837":"Signal EMA Period {{ input_number }}","1617455864":"Shortcuts","1618809782":"Maximum withdrawal","1619070150":"You are being redirected to an external website.","1620278321":"Names and surnames by themselves are easy to guess","1620346110":"Set currency","1621024661":"Tether as a TRC20 token (tUSDT) is a version of Tether that is hosted on Tron.","1622662457":"Date from","1622944161":"Now, go to the <0>Restart trading conditions block.","1623706874":"Use this block when you want to use multipliers as your trade type.","1630372516":"Try our Fiat onramp","1630417358":"Please go to your account settings and complete your personal details to enable withdrawals.","1631281562":"GBP Basket","1634903642":"Only your face can be in the selfie","1634969163":"Change currency","1635266650":"It seems that your name in the document is not the same as your Deriv profile. Please update your name in the <0>Personal details page to solve this issue.","1636605481":"Platform settings","1636782601":"Multipliers","1638321777":"Your demo account balance is low. Reset your balance to continue trading from your demo account.","1639262461":"Pending withdrawal request:","1639304182":"Please click on the link in the email to reset your password.","1641395634":"Last digits list","1641635657":"New proof of identity document needed","1641980662":"Salutation is required.","1642645912":"All rates","1644703962":"Looking for CFD accounts? Go to Trader's Hub","1644864436":"You’ll need to authenticate your account before requesting to become a professional client. <0>Authenticate my account","1644908559":"Digit code is required.","1647186767":"The bot encountered an error while running.","1648938920":"Netherlands 25","1649239667":"2. Under the Blocks menu, you'll see a list of categories. Blocks are grouped within these categories. Choose the block you want and drag them to the workspace.","1651513020":"Display remaining time for each interval","1651951220":"Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"","1652366857":"get and remove","1652968048":"Define your trade options such as multiplier and stake.","1652976865":"In this example, this block is used with another block to get the open prices from a list of candles. The open prices are then assigned to the variable called \"cl\".","1653136377":"copied!","1653180917":"We cannot verify you without using your camera","1654365787":"Unknown","1654496508":"Our system will finish any DBot trades that are running, and DBot will not place any new trades.","1654721858":"Upload anyway","1655627840":"UPPER CASE","1656155124":"Resend in <0 /> seconds","1658954996":"Plant and Machine Operators and Assemblers","1659074761":"Reset Put","1659352235":"Add your Deriv MT5 CFDs account under Deriv Investments (Europe) Limited, regulated by the Malta Financial Services Authority (MFSA) (licence no. IS/70156).","1665272539":"Remember: You cannot log in to your account until the selected date.","1665738338":"Balance","1665756261":"Go to live chat","1668138872":"Modify account settings","1670016002":"Multiplier: {{ multiplier }}","1670426231":"End Time","1671232191":"You have set the following limits:","1674163852":"You can determine the expiry of your contract by setting the duration or end time.","1675030608":"To create this account first we need you to resubmit your proof of address.","1675289747":"Switched to real account","1677027187":"Forex","1677990284":"My apps","1679743486":"1. Go to Quick strategy and select the strategy you want.","1680666439":"Upload your bank statement showing your name, account number, and transaction history.","1682409128":"Untitled Strategy","1682636566":"Resend email in","1683522174":"Top-up","1683963454":"Your contract will be closed automatically at the next available asset price on {{date}} at {{timestamp}}.","1684419981":"What's this?","1686800117":"{{error_msg}}","1687173740":"Get more","1689103988":"Second Since Epoch","1689258195":"We were unable to verify your address with the details you provided. Please check and resubmit or choose a different document type.","1691335819":"To continue trading with us, please confirm who you are.","1691765860":"- Negation","1692912479":"Deriv MT5, Deriv X","1693614409":"Start time","1694331708":"You can switch between CFDs, digital options, and multipliers at any time.","1694517345":"Enter a new email address","1698624570":"2. Hit Ok to confirm.","1700233813":"Transfer from {{selected_value}} is not allowed, Please choose another account from dropdown","1701447705":"Please update your address","1703091957":"We collect information about your employment as part of our due diligence obligations, as required by anti-money laundering legislation.","1704656659":"How much experience do you have in CFD trading?","1708413635":"For your {{currency_name}} ({{currency}}) account","1709401095":"Trade CFDs on Deriv X with financial markets and our Derived indices.","1709859601":"Exit Spot Time","1710662619":"If you have the app, launch it to start trading.","1711013665":"Anticipated account turnover","1711676335":"square root","1711929663":"Your funds have been transferred","1712357617":"Invalid email address.","1714255392":"To enable withdrawals, please complete your financial assessment.","1715011380":"Jump 25 Index","1715630945":"Returns the total profit in string format","1717023554":"Resubmit documents","1719248689":"EUR/GBP/USD","1720451994":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv fiat and Deriv cryptocurrency accounts.","1720790758":"No, DBot will stop running when your web browser is closed.","1720968545":"Upload passport photo page from your computer","1723589564":"Represents the maximum number of outstanding contracts in your portfolio. Each line in your portfolio counts for one open position. Once the maximum is reached, you will not be able to open new positions without closing an existing position first.","1724696797":"You are limited to one fiat account only.","1725958461":"Account number","1726472773":"Function with no return value","1726565314":"Close my account","1728121741":"Transactions.csv","1728183781":"About Tether","1729145421":"Risk warning","1731747596":"The block(s) highlighted in red are missing input values. Please update them and click \"Run bot\".","1732891201":"Sell price","1733711201":"Regulators/external dispute resolution","1734185104":"Balance: %1","1734264460":"Disclaimer","1736292549":"Update postal code","1737352280":"Bot.init is not called","1738094481":"<0>Duration: Ticks 1","1738681493":"Remove your glasses, if necessary","1739086943":"Wall Street 30","1739384082":"Unemployed","1739668049":"Close your account","1740371444":"Underlying market is not selected","1742256256":"Please upload one of the following documents:","1743448290":"Payment agents","1743902050":"Complete your financial assessment","1744509610":"Just drag the XML file from your computer onto the workspace, and your bot will be loaded accordingly. Alternatively, you can hit Import in Bot Builder, and choose to import your bot from your computer or from your Google Drive.","1745523557":"- Square root","1746051371":"Download the app","1746273643":"Moving Average Convergence Divergence","1747501260":"Sell conditions","1747523625":"Go back","1747674345":"Please use `.` as a decimal separator for fractional numbers.","1747682136":"Contract was cancelled.","1748754976":"Run","1749675724":"Deriv charges no commission across all account types.","1750065391":"Login time:","1753183432":"We take all complaints seriously and aim to resolve them as quickly and fairly as possible. If you are unhappy with any aspect of our service, please let us know by submitting a complaint using the guidance below:","1753226544":"remove","1753975551":"Upload passport photo page","1756678453":"break out","1758386013":"Do not get lured to fake \"Deriv\" pages!","1761038852":"Let’s continue with providing proofs of address and identity.","1761762171":"Restart last trade on error (bot ignores the unsuccessful trade): {{ checkbox }}","1762707297":"Phone number","1762746301":"MF4581125","1763123662":"Upload your NIMC slip.","1766212789":"Server maintenance starts at 06:00 GMT every Sunday and may last up to 2 hours. You may experience service disruption during this time.","1766993323":"Only letters, numbers, and underscores are allowed.","1767429330":"Add a Derived account","1768861315":"Minute","1768918213":"Only letters, space, hyphen, period, and apostrophe are allowed.","1769068935":"Choose any of these exchanges to buy cryptocurrencies:","1771037549":"Add a Deriv real account","1771592738":"Conditional block","1777847421":"This is a very common password","1778893716":"Click here","1779144409":"Account verification required","1779519903":"Should be a valid number.","1780442963":"Scan the QR code to download {{ platform }}.","1780770384":"This block gives you a random fraction between 0.0 to 1.0.","1781393492":"We do not charge a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts, your Deriv fiat and {{platform_name_derivez}} accounts and your Deriv fiat and {{platform_name_dxtrade}} accounts.","1782308283":"Quick strategy","1782395995":"Last Digit Prediction","1782690282":"Blocks menu","1782703044":"Sign up","1783526986":"How do I build a trading bot?","1783740125":"Upload your selfie","1787135187":"Postal/ZIP code is required","1787492950":"Indicators on the chart tab are for indicative purposes only and may vary slightly from the ones on the {{platform_name_dbot}} workspace.","1788515547":"<0/>For more information on submitting a complaint with the Office of the Arbiter for Financial Services, please <1>see their guidance.","1788966083":"01-07-1999","1789273878":"Payout per point","1789497185":"Make sure your passport details are clear to read, with no blur or glare","1790770969":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies","1791017883":"Check out this <0>user guide.","1791432284":"Search for country","1791971912":"Recent","1793913365":"To deposit money, please switch to your {{currency_symbol}} account.","1794815502":"Download your transaction history.","1796787905":"Please upload the following document(s).","1798943788":"You can only make deposits.","1801093206":"Get candle list","1801270786":"Ready to automate your trading strategy without writing any code? You’ve come to the right place.","1801927731":"{{platform_name_dxtrade}} accounts","1803338729":"Choose what type of contract you want to trade. For example, for the Rise/Fall trade type you can choose one of three options: Rise, Fall, or Both. Selected option will determine available options for the Purchase block.","1804620701":"Expiration","1804789128":"{{display_value}} Ticks","1806355993":"No commission","1806503050":"Please note that some payment methods might not be available in your country.","1808058682":"Blocks are loaded successfully","1808393236":"Login","1808867555":"This block uses the variable “i” to control the iterations. With each iteration, the value of “i” is determined by the items in a given list.","1810217569":"Please refresh this page to continue.","1811109068":"Jurisdiction","1811972349":"Market","1811973475":"Returns a specific character from a given string","1812006199":"Identity verification","1812582011":"Connecting to server","1813700208":"Boom 300 Index","1813958354":"Remove comment","1815034361":"alphabetic","1815905959":"DTrader, DBot, SmartTrader, and Binary Bot","1815995250":"Buying contract","1816126006":"Trade on Deriv MT5 ({{platform_name_dmt5}}), the all-in-one FX and CFD trading platform.","1817154864":"This block gives you a random number from within a set range.","1820242322":"e.g. United States","1820332333":"Top up","1821818748":"Enter Driver License Reference number","1823177196":"Most popular","1824193700":"This block gives you the last digit of the latest tick value.","1824292864":"Call","1827607208":"File not uploaded.","1828370654":"Onboarding","1830520348":"{{platform_name_dxtrade}} Password","1831847842":"I confirm that the name and date of birth above match my chosen identity document (see below)","1833481689":"Unlock","1833499833":"Proof of identity documents upload failed","1836767074":"Search payment agent name","1837762008":"Please submit your proof of identity and proof of address to verify your account in your account settings to access the cashier.","1838639373":"Resources","1839021527":"Please enter a valid account number. Example: CR123456789","1840865068":"set {{ variable }} to Simple Moving Average Array {{ dummy }}","1841381387":"Get more wallets","1841788070":"Palladium/USD","1841996888":"Daily loss limit","1842266423":"back","1842862156":"Welcome to your Deriv X dashboard","1843658716":"If you select \"Only Downs\", you win the payout if consecutive ticks fall successively after the entry spot. No payout if any tick rises or is equal to any of the previous ticks.","1845892898":"(min: {{min_stake}} - max: {{max_payout}})","1846266243":"This feature is not available for demo accounts.","1846587187":"You have not selected your country of residence","1846664364":"{{platform_name_dxtrade}}","1849484058":"Any unsaved changes will be lost.","1850031313":"- Low: the lowest price","1850132581":"Country not found","1850659345":"- Payout: the payout of the contract","1850663784":"Submit proofs","1851052337":"Place of birth is required.","1851776924":"upper","1851951013":"Please switch to your demo account to run your DBot.","1854480511":"Cashier is locked","1854874899":"Back to list","1855566768":"List item position","1856485118":"Please <0>resubmit your proof of address to transfer funds between MT5 and Deriv accounts.","1858251701":"minute","1859308030":"Give feedback","1862182694":"Three of the most commonly used strategies in automated trading are Martingale, D'Alembert, and Oscar's Grind — you can find them all ready-made and waiting for you in DBot.","1863053247":"Please upload your identity document.","1863694618":"Trade CFDs on MT5 with forex, stocks, stock indices, commodities, and cryptocurrencies.","1863731653":"To receive your funds, contact the payment agent","1866811212":"Deposit in your local currency via an authorised, independent payment agent in your country.","1866836018":"<0/><1/>If your complaint relates to our data processing practices, you can submit a formal complaint to your local supervisory authority.","1867217564":"Index must be a positive integer","1867783237":"High-to-Close","1869315006":"See how we protect your funds to unlock the cashier.","1869787212":"Even","1870933427":"Crypto","1871196637":"True if the result of the last trade matches the selection","1871664426":"Note","1873838570":"Please verify your address","1874481756":"Use this block to purchase the specific contract you want. You may add multiple Purchase blocks together with conditional blocks to define your purchase conditions. This block can only be used within the Purchase conditions block.","1874756442":"BVI","1875702561":"Load or build your bot","1876015808":"Social Security and National Insurance Trust","1876325183":"Minutes","1877225775":"Your proof of address is verified","1877272122":"We’ve limited the maximum payout for every contract, and it differs for every asset. Your contract will be closed automatically when the maximum payout is reached.","1877410120":"What you need to do now","1877832150":"# from end","1879042430":"Appropriateness Test, WARNING:","1879412976":"Profit amount: <0>{{profit}}","1879463662":"A minimum deposit value of {{minimum_deposit}} {{currency}} is required. Otherwise, the funds will be lost and cannot be recovered.","1879651964":"<0>Pending verification","1880029566":"Australian Dollar","1880097605":"prompt for {{ string_or_number }} with message {{ input_text }}","1880875522":"Create \"get %1\"","1881018702":"hour","1881587673":"Total stake since you last cleared your stats.","1882825238":"Restart trading conditions","1883531976":"Clerks","1885708031":"#","1887852176":"Site is being updated","1889357660":"Enter a value in minutes, up to 60480 minutes (equivalent to 6 weeks).","1890171328":"By clicking Accept below and proceeding with the Account Opening you should note that you may be exposing yourself to risks (which may be significant, including the risk of loss of the entire sum invested) that you may not have the knowledge and experience to properly assess or mitigate.","1890332321":"Returns the number of characters of a given string of text, including numbers, spaces, punctuation marks, and symbols.","1894667135":"Please verify your proof of address","1898670234":"{{formatted_opening_time}} (GMT) on {{opening_day}},<0> {{opening_date}}.","1902547203":"MetaTrader 5 MacOS app","1903437648":"Blurry photo detected","1905032541":"We're now ready to verify your identity","1905589481":"If you want to change your account currency, please contact us via <0>live chat.","1906639368":"If this is the first time you try to create a password, or you have forgotten your password, please reset it.","1907884620":"Add a real Deriv Gaming account","1908239019":"Make sure all of the document is in the photo","1908686066":"Appropriateness Test Warning","1909647105":"TRX/USD","1909769048":"median","1913777654":"Switch account","1914014145":"Today","1914270645":"Default Candle Interval: {{ candle_interval_type }}","1914725623":"Upload the page that contains your photo.","1917178459":"Bank Verification Number","1917523456":"This block sends a message to a Telegram channel. You will need to create your own Telegram bot to use this block.","1917804780":"You will lose access to your Options account when it gets closed, so be sure to withdraw all your funds. (If you have a CFDs account, you can also transfer the funds from your Options account to your CFDs account.)","1918633767":"Second line of address is not in a proper format.","1918796823":"Please enter a stop loss amount.","1918832194":"No experience","1919030163":"Tips to take a good selfie","1919594496":"{{website_name}} is not affiliated with any payment agents. Customers deal with payment agents at their sole risk. Customers are advised to check the credentials of payment agents and the accuracy of any information about payment agents (on {{website_name}} or elsewhere) before using their services.","1919694313":"To start trading, transfer funds from your Deriv account into this account.","1920217537":"Compare","1920468180":"How to use the SMA block","1921634159":"A few personal details","1921914669":"Deposit with Deriv P2P","1922529883":"Boom 1000 Index","1922955556":"Use a longer keyboard pattern with more turns","1923431535":"“Stop loss” is deactivated and will only be available when “Deal cancellation” expires.","1924365090":"Maybe later","1924765698":"Place of birth*","1925090823":"Sorry, trading is unavailable in {{clients_country}}.","1928930389":"GBP/NOK","1929309951":"Employment Status","1929379978":"Switch between your demo and real accounts.","1929694162":"Compare accounts","1930899934":"Tether","1931659123":"Run on every tick","1931884033":"It seems that your date of birth in the document is not the same as your Deriv profile. Please update your date of birth in the <0>Personal details page to solve this issue.","1934450653":"For <0>Contract type, set it to Both.","1939014728":"How do I remove blocks from the workspace?","1939902659":"Signal","1940408545":"Delete this token","1941915555":"Try later","1942091675":"Cryptocurrency trading is not available for clients residing in the United Kingdom.","1943440862":"Calculates Bollinger Bands (BB) list from a list with a period","1944204227":"This block returns current account balance.","1947527527":"1. This link was sent by you","1948092185":"GBP/CAD","1949180450":"Do you offer pre-built trading bots on DBot?","1949719666":"Here are the possible reasons:","1950413928":"Submit identity documents","1952580688":"Submit passport photo page","1955219734":"Town/City*","1957759876":"Upload identity document","1958807602":"4. 'Table' takes an array of data, such as a list of candles, and displays it in a table format.","1959678342":"Highs & Lows","1960240336":"first letter","1964097111":"USD","1964165648":"Connection lost","1965916759":"Asian options settle by comparing the last tick with the average spot over the period.","1966023998":"2FA enabled","1966281100":"Console {{ message_type }} value: {{ input_message }}","1968025770":"Bitcoin Cash","1968077724":"Agriculture","1968368585":"Employment status","1970060713":"You’ve successfully deleted a bot.","1971898712":"Add or manage account","1973536221":"You have no open positions yet.","1973564194":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit or created a real {{dmt5_label}} or {{platform_name_dxtrade}} account.","1973910243":"Manage your accounts","1974273865":"This scope will allow third-party apps to view your account activity, settings, limits, balance sheets, trade purchase history, and more.","1974903951":"If you hit Yes, the info you entered will be lost.","1981940238":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}} and {{legal_entity_name_v}}.","1982912252":"Relative Strength Index (RSI) from a list with a period","1983001416":"Define your trade options such as multiplier and stake. This block can only be used with the multipliers trade type. If you select another trade type, this block will be replaced with the Trade options block.","1983358602":"This policy, which may change from time to time, applies to your account registered with {{legal_entity_name}}.","1983387308":"Preview","1983480826":"Sign in","1983544897":"P.O. Box is not accepted in address","1983676099":"Please check your email for details.","1984700244":"Request an input","1984742793":"Uploading documents","1985366224":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts and up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts.","1985637974":"Any blocks placed within this block will be executed at every tick. If the default candle interval is set to 1 minute in the Trade Parameters root block, the instructions in this block will be executed once every minute. Place this block outside of any root block.","1986094286":"- maximumLoss: Use this variable to store your maximum loss limit. You can assign any amount you want, but it must be a positive number.","1986498784":"BTC/LTC","1987080350":"Demo","1987447369":"Your cashier is locked","1988153223":"Email address","1988302483":"Take profit:","1990331072":"Proof of ownership","1990735316":"Rise Equals","1991055223":"View the market price of your favourite assets.","1991448657":"Don't know your tax identification number? Click <0>here to learn more.","1991524207":"Jump 100 Index","1994023526":"The email address you entered had a mistake or typo (happens to the best of us).","1994558521":"The platforms aren’t user-friendly.","1994600896":"This block requires a list of candles as an input parameter.","1995023783":"First line of address*","1996767628":"Please confirm your tax information.","1997138507":"If the last tick is equal to the average of the ticks, you don't win the payout.","1998199587":"You can also exclude yourself entirely for a specified duration. If, at any time, you decide to trade again, you must then contact our Customer Support to remove this self-exclusion. There will be a 24-hour-cooling-off period before you can resume trading. ","2001222130":"Check your spam or junk folder. If it's not there, try resending the email.","2004395123":"New trading tools for MT5","2004792696":"If you are a UK resident, to self-exclude from all online gambling companies licensed in Great Britain, go to <0>www.gamstop.co.uk.","2007028410":"market, trade type, contract type","2007092908":"Trade with leverage and low spreads for better returns on successful trades.","2008809853":"Please proceed to withdraw your funds before 30 November 2021.","2009620100":"DBot will not proceed with any new trades. Any ongoing trades will be completed by our system. Any unsaved changes will be lost.<0>Note: Please check your statement to view completed transactions.","2009770416":"Address:","2010759971":"Uploads successful","2010866561":"Returns the total profit/loss","2011609940":"Please input number greater than 0","2011808755":"Purchase Time","2012110280":"Synthetics, Basket indices and Derived FX","2014536501":"Card number","2014590669":"Variable '{{variable_name}}' has no value. Please set a value for variable '{{variable_name}}' to notify.","2017672013":"Please select the country of document issuance.","2020545256":"Close your account?","2021037737":"Please update your details to continue.","2023659183":"Student","2023762268":"I prefer another trading website.","2025339348":"Move away from direct light — no glare","2027625329":"Simple Moving Average Array (SMAA)","2027696535":"Tax information","2028163119":"EOS/USD","2029237955":"Labuan","2030018735":"RSI is a technical analysis tool that helps you identify the market trend. It will give you a value from 0 to 100. An RSI value of 70 and above means that the asset is overbought and the current trend may reverse, while a value of 30 and below means that the asset is oversold.","2030045667":"Message","2033648953":"This block gives you the specified candle value for a selected time interval.","2034803607":"You must be 18 years old and above.","2035258293":"Start trading with us","2035925727":"sort {{ sort_type }} {{ sort_direction }} {{ input_list }}","2036578466":"Should be {{value}}","2037481040":"Choose a way to fund your account","2037607934":"The purchase of <0>{{trade_type_name}} contract has been completed successfully for the amount of <0> {{buy_price}} {{currency}}","2037665157":"Expand All Blocks","2037906477":"get sub-list from #","2042023623":"We’re reviewing your documents. This should take about 5 minutes.","2042050260":"- Purchase price: the purchase price (stake) of the contract","2042115724":"Upload a screenshot of your account and personal details page with your name, account number, phone number, and email address.","2044086432":"The close is the latest tick at or before the end time. If you selected a specific end time, the end time is the selected time.","2046273837":"Last tick","2048110615":"Email address*","2048134463":"File size exceeded.","2049386104":"We need you to submit these in order to get this account:","2050080992":"Tron","2050170533":"Tick list","2051558666":"View transaction history","2053617863":"Please proceed to withdraw all your funds from your account.","2054889300":"Create \"%1\"","2055317803":"Copy the link to your mobile browser","2057082550":"Accept our updated <0>terms and conditions","2057419639":"Exit Spot","2059365224":"Yes, you can get started with a pre-built bot using the Quick strategy feature. You’ll find some of the most popular trading strategies here: Martingale, D'Alembert, and Oscar's Grind. Just select the strategy, enter your trade parameters, and your bot will be created for you. You can always tweak the parameters later.","2059753381":"Why did my verification fail?","2060873863":"Your order {{order_id}} is complete","2062299501":"<0>For {{title}}: Your payout will grow by this amount for every point {{trade_type}} your strike price. You will start making a profit when the payout is higher than your stake.","2062912059":"function {{ function_name }} {{ function_params }}","2063655921":"By purchasing the \"Close-to-Low\" contract, you'll win the multiplier times the difference between the close and low over the duration of the contract.","2063812316":"Text Statement","2063890788":"Cancelled","2065278286":"Spread","2067903936":"Driving licence","2070002739":"Don’t accept","2070345146":"When opening a leveraged CFD trade.","2070752475":"Regulatory Information","2071043849":"Browse","2073813664":"CFDs, Options or Multipliers","2074235904":"Last name is required.","2074497711":"The Telegram notification could not be sent","2074713563":"4.2. Submission of a complaint","2080553498":"3. Get the chat ID using the Telegram REST API (read more: https://core.telegram.org/bots/api#getupdates)","2080829530":"Sold for: {{sold_for}}","2082533832":"Yes, delete","2084693624":"Converts a string representing a date/time string into seconds since Epoch. Example: 2019-01-01 21:03:45 GMT+0800 will be converted to 1546347825. Time and time zone offset are optional.","2084925123":"Use our fiat onramp services to buy and deposit cryptocurrency into your Deriv account.","2085387371":"Must be numbers, letters, and special characters . , ' -","2085602195":"- Entry value: the value of the first tick of the contract","2086742952":"You have added a real Options account.<0/>Make a deposit now to start trading.","2086792088":"Both barriers should be relative or absolute","2088735355":"Your session and login limits","2089581483":"Expires on","2091671594":"Status","2093675079":"- Close: the closing price","2096014107":"Apply","2096456845":"Date of birth*","2097170986":"About Tether (Omni)","2097365786":"A copy of your identity document (identity card, passport)","2097381850":"Calculates Simple Moving Average line from a list with a period","2097932389":"Upload 2 separate screenshots from the personal details page and the account page via <0>https://app.astropay.com/profile","2100713124":"account","2101972779":"This is the same as the above example, using a tick list.","2102572780":"Length of digit code must be 6 characters.","2104115663":"Last login","2104397115":"Please go to your account settings and complete your personal details to enable deposits and withdrawals.","2107381257":"Scheduled cashier system maintenance","2109312805":"The spread is the difference between the buy price and sell price. A variable spread means that the spread is constantly changing, depending on market conditions. A fixed spread remains constant but is subject to alteration, at the Broker's absolute discretion.","2110365168":"Maximum number of trades reached","2111015970":"This block helps you check if your contract can be sold. If your contract can be sold, it returns “True”. Otherwise, it returns an empty string.","2111528352":"Creating a variable","2112119013":"Take a selfie showing your face","2112175277":"with delimiter","2113321581":"Add a Deriv Gaming account","2115223095":"Loss","2117073379":"Our cryptocurrency cashier is temporarily down due to system maintenance. You can access the Cashier in a few minutes when the maintenance is complete.","2117165122":"1. Create a Telegram bot and get your Telegram API token. Read more on how to create bots in Telegram here: https://core.telegram.org/bots#6-botfather","2117489390":"Auto update in {{ remaining }} seconds","2118315870":"Where do you live?","2119449126":"Example output of the below example will be:","2119710534":"FAQ","2120617758":"Set up your trade","2121227568":"NEO/USD","2122152120":"Assets","2127564856":"Withdrawals are locked","2131963005":"Please withdraw your funds from the following Deriv MT5 account(s):","2133451414":"Duration","2133470627":"This block returns the potential payout for the selected trade type. This block can be used only in the \"Purchase conditions\" root block.","2135563258":"Forex trading frequency","2136246996":"Selfie uploaded","2137901996":"This will clear all data in the summary, transactions, and journal panels. All counters will be reset to zero.","2137993569":"This block compares two values and is used to build a conditional structure.","2138861911":"Scans and photocopies are not accepted","2139171480":"Reset Up/Reset Down","2139362660":"left side","2141055709":"New {{type}} password","2141873796":"Get more info on <0>CFDs, <1>multipliers, and <2>options.","2143803283":"Purchase Error","2144609616":"If you select \"Reset-Down”, you win the payout if the exit spot is strictly lower than either the entry spot or the spot at reset time.","2145690912":"Income Earning","2145995536":"Create new account","2146336100":"in text %1 get %2","2146698770":"Pro tip: You can also click and drag out the desired block","2146892766":"Binary options trading experience","-612174191":"First line of address is required","-242734402":"Only {{max}} characters, please.","-378415317":"State is required","-1784470716":"State is not in a proper format","-1699820408":"Please enter a {{field_name}} under {{max_number}} characters.","-1575567374":"postal/ZIP code","-1497654315":"Our accounts and services are unavailable for the Jersey postal code.","-755626951":"Complete your address details","-1024240099":"Address","-584911871":"Select wallet currency","-1461267236":"Please choose your currency","-1352330125":"CURRENCY","-1027595143":"Less than $25,000","-40491332":"$25,000 - $50,000","-1139806939":"$50,001 - $100,000","-626752657":"0-1 year","-532014689":"1-2 years","-1001024004":"Over 3 years","-790513277":"6-10 transactions in the past 12 months","-580085300":"11-39 transactions in the past 12 months","-654781670":"Primary","-1717373258":"Secondary","-996132458":"Construction","-915003867":"Health","-1430012453":"Information & Communications Technology","-987824916":"Science & Engineering","-146630682":"Social & Cultural","-761306973":"Manufacturing","-739367071":"Employed","-1156937070":"$500,001 - $1,000,000","-315534569":"Over $1,000,000","-2068544539":"Salaried Employee","-531314998":"Investments & Dividends","-1235114522":"Pension","-1298056749":"State Benefits","-449943381":"Savings & Inheritance","-1631552645":"Professionals","-474864470":"Personal Care, Sales and Service Workers","-1129355784":"Agricultural, Forestry and Fishery Workers","-1242914994":"Craft, Metal, Electrical and Electronics Workers","-1317824715":"Cleaners and Helpers","-1592729751":"Mining, Construction, Manufacturing and Transport Workers","-2137323480":"Company Ownership","-1590574533":"Divorce Settlement","-1667683002":"Inheritance","-1237843731":"Investment Income","-777506574":"Sale of Property","-1232613003":"<0>Verification failed. <1>Why?","-2029508615":"<0>Need verification.<1>Verify now","-1161338910":"First name is required.","-1161818065":"Last name should be between 2 and 50 characters.","-1281693513":"Date of birth is required.","-26599672":"Citizenship is required","-912174487":"Phone is required.","-673765468":"Letters, numbers, spaces, periods, hyphens and forward slashes only.","-1356204661":"This Tax Identification Number (TIN) is invalid. You may continue with account creation, but to facilitate future payment processes, valid tax information will be required.","-1823540512":"Personal details","-1227878799":"Speculative","-1174064217":"Mr","-855506127":"Ms","-621555159":"Identity information","-204765990":"Terms of use","-231863107":"No","-870902742":"How much knowledge and experience do you have in relation to online trading?","-1929477717":"I have an academic degree, professional certification, and/or work experience related to financial services.","-1540148863":"I have attended seminars, training, and/or workshops related to trading.","-922751756":"Less than a year","-542986255":"None","-1337206552":"In your understanding, CFD trading allows you to","-456863190":"Place a position on the price movement of an asset where the outcome is a fixed return or nothing at all.","-1314683258":"Make a long-term investment for a guaranteed profit.","-1546090184":"How does leverage affect CFD trading?","-1636427115":"Leverage helps to mitigate risk.","-800221491":"Leverage guarantees profits.","-811839563":"Leverage lets you open large positions for a fraction of trade value, which may result in increased profit or loss.","-1185193552":"Close your trade automatically when the loss is equal to or more than a specified amount, as long as there is adequate market liquidity.","-1046354":"Close your trade automatically when the profit is equal to or more than a specified amount, as long as there is adequate market liquidity.","-1842858448":"Make a guaranteed profit on your trade.","-860053164":"When trading multipliers.","-1250327770":"When buying shares of a company.","-1222388581":"All of the above.","-931052769":"Submit verification","-1004605898":"Tips","-1938142055":"Documents uploaded","-448090287":"The link only works on mobile devices","-1244287721":"Something's gone wrong","-241258681":"You'll need to restart your verification on your computer","-929254273":"Get secure link","-2021867851":"Check back here to finish the submission","-1547069149":"Open the link and complete the tasks","-1767652006":"Here's how to do it:","-277611959":"You can now return to your computer to continue","-724178625":"Make sure full document is visible","-1519380038":"Glare detected","-1895280620":"Make sure your card details are clear to read, with no blur or glare","-1464447919":"Make sure your permit details are clear to read, with no blur or glare","-1436160506":"Make sure details are clear to read, with no blur or glare","-759124288":"Close","-759118956":"Redo","-753375398":"Enlarge image","-1042933881":"Driver's license","-1503134764":"Face photo page","-1335343167":"Sorry, no mobile phone bills","-699045522":"Documents you can use to verify your identity","-543666102":"It must be an official photo ID","-903877217":"These are the documents most likely to show your current home address","-1356835948":"Choose document","-1364375936":"Select a %{country} document","-401586196":"or upload photo – no scans or photocopies","-3110517":"Take a photo with your phone","-2033894027":"Submit identity card (back)","-20684738":"Submit license (back)","-1359585500":"Submit license (front)","-106779602":"Submit residence permit (back)","-1287247476":"Submit residence permit (front)","-1954762444":"Restart the process on the latest version of Safari","-261174676":"Must be under 10MB.","-685885589":"An error occurred while loading the component","-502539866":"Your face is needed in the selfie","-1377968356":"Please try again","-1226547734":"Try using a JPG or PNG file","-849068301":"Loading...","-1730346712":"Loading","-1849371752":"Check that your number is correct","-309848900":"Copy","-1424436001":"Send link","-1093833557":"How to scan a QR code","-1408210605":"Point your phone’s camera at the QR code","-1773802163":"If it doesn’t work, download a QR code scanner from Google Play or the App Store","-109026565":"Scan QR code","-1644436882":"Get link via SMS","-1667839246":"Enter mobile number","-1533172567":"Enter your mobile number:","-1352094380":"Send this one-time link to your phone","-28974899":"Get your secure link","-359315319":"Continue","-1279080293":"2. Your desktop window stays open","-102776692":"Continue with the verification","-89152891":"Take a photo of the back of your card","-1646367396":"Take a photo of the front of your card","-1350855047":"Take a photo of the front of your license","-2119367889":"Take a photo using the basic camera mode instead","-342915396":"Take a photo","-419040068":"Passport photo page","-1354983065":"Refresh","-1925063334":"Recover camera access to continue face verification","-54784207":"Camera access is denied","-1392699864":"Allow camera access","-269477401":"Provide the whole document page for best results","-864639753":"Upload back of card from your computer","-1309771027":"Upload front of license from your computer","-1722060225":"Take photo","-565732905":"Selfie","-1703181240":"Check that it is connected and functional. You can also continue verification on your phone","-2043114239":"Camera not working?","-2029238500":"It may be disconnected. Try using your phone instead.","-468928206":"Make sure your device's camera works","-466246199":"Camera not working","-698978129":"Remember to press stop when you're done. Redo video actions","-538456609":"Looks like you took too long","-781816433":"Photo of your face","-1471336265":"Make sure your selfie clearly shows your face","-1375068556":"Check selfie","-1914530170":"Face forward and make sure your eyes are clearly visible","-776541617":"We'll compare it with your document","-478752991":"Your link will expire in one hour","-1859729380":"Keep this window open while using your mobile","-1283761937":"Resend link","-629011256":"Don't refresh this page","-1005231905":"Once you've finished we'll take you to the next step","-542134805":"Upload photo","-1462975230":"Document example","-1472844935":"The photo should clearly show your document","-189310067":"Account closed","-849320995":"Assessments","-773766766":"Email and passwords","-1466827732":"Self exclusion","-1498206510":"Account limits","-241588481":"Login history","-966136867":"Connected apps","-213009361":"Two-factor authentication","-1214803297":"Dashboard-only path","-526636259":"Error 404","-1030759620":"Government Officers","-1196936955":"Upload a screenshot of your name and email address from the personal information section.","-1286823855":"Upload your mobile bill statement showing your name and phone number.","-1309548471":"Upload your bank statement showing your name and account details.","-1410396115":"Upload a photo showing your name and the first six and last four digits of your card number. If the card does not display your name, upload the bank statement showing your name and card number in the transaction history.","-3805155":"Upload a screenshot of either of the following to process the transaction:","-1523487566":"- your account profile section on the website","-613062596":"- the Account Information page on the app","-1718304498":"User ID","-609424336":"Upload a screenshot of your name, account number, and email address from the personal details section of the app or profile section of your account on the website.","-1954436643":"Upload a screenshot of your username on the General Information page at <0>https://onlinenaira.com/members/index.htm","-79853954":"Upload a screenshot of your account number and phone number on the Bank Account/Mobile wallet page at <0>https://onlinenaira.com/members/bank.htm","-1192882870":"Upload a screenshot of your name and account number from the personal details section.","-1437206131":"JPEG JPG PNG PDF GIF","-820458471":"1 - 6 months old","-155705811":"A clear colour photo or scanned image","-587941902":"Issued under your name with your current address","-438669274":"JPEG JPG PNG PDF GIF","-723198394":"File size should be 8MB or less","-1948369500":"File uploaded is not supported","-1040865880":"Drop files here..","-1120954663":"First name*","-1659980292":"First name","-1466268810":"Please remember that it is your responsibility to keep your answers accurate and up to date. You can update your personal details at any time in your <0>account settings.","-32386760":"Name","-766265812":"first name","-1857534296":"John","-1282749116":"last name","-1485480657":"Other details","-1784741577":"date of birth","-1315571766":"Place of birth","-2040322967":"Citizenship","-789291456":"Tax residence*","-1692219415":"Tax residence","-1903720068":"The country in which you meet the criteria for paying taxes. Usually the country in which you physically reside.","-651516152":"Tax Identification Number","-344715612":"Employment status*","-1543016582":"I hereby confirm that the tax information I provided is true and complete. I will also inform {{legal_entity_name}} about any changes to this information.","-1387062433":"Account opening reason","-222283483":"Account opening reason*","-190838815":"We need this for verification. If the information you provide is fake or inaccurate, you won’t be able to deposit and withdraw.","-1113902570":"Details","-71696502":"Previous","-1541554430":"Next","-705047643":"Sorry, an error occured. Please select another file.","-1664309884":"Tap here to upload","-987011273":"Your proof of ownership isn't required.","-808299796":"You are not required to submit proof of ownership at this time. We will inform you if proof of ownership is required in the future.","-179726573":"We’ve received your proof of ownership.","-813779897":"Proof of ownership verification passed.","-638756912":"Black out digits 7 to 12 of the card number that’s shown on the front of your debit/credit card.⁤","-2073934245":"The financial trading services offered on this site are only suitable for customers who accept the possibility of losing all the money they invest and who understand and have experience of the risk involved in the purchase of financial contracts. Transactions in financial contracts carry a high degree of risk. If the contracts you purchased expire as worthless, you will lose all your investment, which includes the contract premium.","-1166068675":"Your account will be opened with {{legal_entity_name}}, regulated by the UK Gaming Commission (UKGC), and will be subject to the laws of the Isle of Man.","-975118358":"Your account will be opened with {{legal_entity_name}}, regulated by the Malta Financial Services Authority (MFSA), and will be subject to the laws of Malta.","-680528873":"Your account will be opened with {{legal_entity_name}} and will be subject to the laws of Samoa.","-1125193491":"Add account","-2068229627":"I am not a PEP, and I have not been a PEP in the last 12 months.","-684271315":"OK","-740157281":"Trading Experience Assessment","-1720468017":"In providing our services to you, we are required to obtain information from you in order to assess whether a given product or service is appropriate for you.","-186841084":"Change your login email","-907403572":"To change your email address, you'll first need to unlink your email address from your {{identifier_title}} account.","-1850792730":"Unlink from {{identifier_title}}","-2139303636":"You may have followed a broken link, or the page has moved to a new address.","-1448368765":"Error code: {{error_code}} page not found","-1265833982":"Accept","-839094775":"Back","-2145244263":"This field is required","-254792921":"You can only make deposits at the moment. To enable withdrawals, please complete your financial assessment.","-1437017790":"Financial information","-70342544":"We’re legally obliged to ask for your financial information.","-1100235269":"Industry of employment","-684388823":"Estimated net worth","-39038029":"Trading experience","-601903492":"Forex trading experience","-1012699451":"CFD trading experience","-1894668798":"Other trading instruments experience","-1026468600":"Other trading instruments frequency","-179005984":"Save","-307865807":"Risk Tolerance Warning","-690100729":"Yes, I understand the risk.","-2010628430":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the high risk of losing your money. <0/><0/> To continue, you must confirm that you understand your capital is at risk.","-863770104":"Please note that by clicking ‘OK’, you may be exposing yourself to risks. You may not have the knowledge or experience to properly assess or mitigate these risks, which may be significant, including the risk of losing the entire sum you have invested.","-1292808093":"Trading Experience","-884768257":"You should enter 0-35 characters.","-2113555886":"Only letters, numbers, space, and hyphen are allowed.","-874280157":"This Tax Identification Number (TIN) is invalid. You may continue using it, but to facilitate future payment processes, valid tax information will be required.","-1037916704":"Miss","-634958629":"We use the information you give us only for verification purposes. All information is kept confidential.","-731992635":"Title*","-352888977":"Title","-136976514":"Country of residence*","-945104751":"We’re legally obliged to ask for your tax information.","-1702919018":"Second line of address (optional)","-1124948631":"Professional Client","-259515058":"By default, all {{brand_website_name}} clients are retail clients but anyone can request to be treated as a professional client.","-1463348492":"I would like to be treated as a professional client.","-1958764604":"Email preference","-2121071263":"Check this box to receive updates via email.","-2068064150":"Get updates about Deriv products, services and events.","-1558679249":"Please make sure your information is correct or it may affect your trading experience.","-1822545742":"Ether Classic","-1334641066":"Litecoin","-1214036543":"US Dollar","-1782590355":"No currency has been set for this account","-2116332353":"Please close your positions in the following Deriv account(s):","-2048005267":"{{number_of_positions}} position(s)","-1923892687":"Please withdraw your funds from the following Deriv X account(s):","-1629894615":"I have other financial priorities.","-844051272":"I want to stop myself from trading.","-1113965495":"I’m no longer interested in trading.","-1224285232":"Customer service was unsatisfactory.","-9323953":"Remaining characters: {{remaining_characters}}","-2061895474":"Closing your account will automatically log you out. We shall delete your personal information as soon as our legal obligations are met.","-203298452":"Close account","-937707753":"Go Back","-1219849101":"Please select at least one reason","-484540402":"An error occurred","-1911549768":"Inaccessible MT5 account(s)","-1869355019":"Action required","-1030102424":"You can't trade on Deriv.","-448385353":"You can't make transactions.","-1058447223":"Before closing your account:","-912764166":"Withdraw your funds.","-60139953":"We shall delete your personal information as soon as our legal obligations are met, as mentioned in the section on Data Retention in our <0>Security and privacy policy","-536187647":"Confirm revoke access?","-1357606534":"Permission","-570222048":"Revoke access","-1076138910":"Trade","-488597603":"Trading information","-1666909852":"Payments","-1725454783":"Failed","-506510414":"Date and time","-1708927037":"IP address","-80717068":"Apps you have linked to your <0>Deriv password:","-2143208677":"Click the <0>Change password button to change your Deriv MT5 password.","-9570380":"Use the {{platform_name_dxtrade}} password to log in to your {{platform_name_dxtrade}} accounts on the web and mobile apps.","-2131200819":"Disable","-200487676":"Enable","-1840392236":"That's not the right code. Please try again.","-2067796458":"Authentication code","-790444493":"Protect your account with 2FA. Each time you log in to your account, you will need to enter your password and an authentication code generated by a 2FA app on your smartphone.","-368010540":"You have enabled 2FA for your Deriv account.","-403552929":"To disable 2FA, please enter the six-digit authentication code generated by your 2FA app below:","-752939584":"How to set up 2FA for your Deriv account","-90649785":"Click here to copy key","-206376148":"Key copied!","-650175948":"A recent bank statement or government-issued letter with your name and address.","-2006895756":"1. Address","-716361389":"An accurate and complete address helps to speed up your verification process.","-1315410953":"State/Province","-890084320":"Save and submit","-1592318047":"See example","-1376950117":"That file format isn't supported. Please upload .pdf, .png, .jpg, or .jpeg files only.","-1272489896":"Please complete this field.","-397487797":"Enter your full card number","-153346659":"Upload your selfie.","-602131304":"Passport number","-1051213440":"Upload the front and back of your identity card.","-1600807543":"First, enter your identity card number and the expiry date.","-1139923664":"Next, upload the front and back of your identity card.","-783705755":"Upload the front of your identity card.","-566750665":"NIMC slip and proof of age","-1465944279":"NIMC slip number","-429612996":"Next, upload both of the following documents.","-376981174":"Upload your proof of age: birth certificate or age declaration document.","-1515286538":"Please enter your document number. ","-477761028":"Voter ID","-1466346630":"CPF","-1694758788":"Enter your document number","-1458676679":"You should enter 2-50 characters.","-1176889260":"Please select a document type.","-612752984":"These are default limits that we apply to your accounts.","-1598263601":"To learn more about trading limits and how they apply, please go to the <0>Help Centre.","-1411635770":"Learn more about account limits","-1340125291":"Done","-1101543580":"Limit","-858297154":"Represents the maximum amount of cash that you may hold in your account. If the maximum is reached, you will be asked to withdraw funds.","-976258774":"Not set","-1182362640":"Represents the maximum aggregate payouts on outstanding contracts in your portfolio. If the maximum is attained, you may not purchase additional contracts without first closing out existing positions.","-1781293089":"Maximum aggregate payouts on open positions","-1412690135":"*Any limits in your Self-exclusion settings will override these default limits.","-1598751496":"Represents the maximum volume of contracts that you may purchase in any given trading day.","-173346300":"Maximum daily turnover","-1502578110":"Your account is fully authenticated and your withdrawal limits have been lifted.","-138380129":"Total withdrawal allowed","-854023608":"To increase limit please verify your identity","-1500958859":"Verify","-1662154767":"a recent utility bill (e.g. electricity, water, gas, landline, or internet), bank statement, or government-issued letter with your name and this address.","-223216785":"Second line of address*","-594456225":"Second line of address","-1940457555":"Postal/ZIP Code*","-1964954030":"Postal/ZIP Code","-516397235":"Be careful who you share this token with. Anyone with this token can perform the following actions on your account behalf","-989216986":"Add accounts","-617480265":"Delete token","-316749685":"Are you sure you want to delete this token?","-786372363":"Learn more about API token","-55560916":"To access our mobile apps and other third-party apps, you'll first need to generate an API token.","-198329198":"API Token","-955038366":"Copy this token","-1668692965":"Hide this token","-1661284324":"Show this token","-605778668":"Never","-1628008897":"Token","-1238499897":"Last Used","-1171226355":"Length of token name must be between {{MIN_TOKEN}} and {{MAX_TOKEN}} characters.","-1803339710":"Maximum {{MAX_TOKEN}} characters.","-408613988":"Select scopes based on the access you need.","-5605257":"This scope will allow third-party apps to withdraw to payment agents and make inter-account transfers for you.","-1373485333":"This scope will allow third-party apps to view your trading history.","-758221415":"This scope will allow third-party apps to open accounts for you, manage your settings and token usage, and more. ","-1117963487":"Name your token and click on 'Create' to generate your token.","-2005211699":"Create","-2115275974":"CFDs","-1879666853":"Deriv MT5","-460645791":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit or created a real {{dmt5_label}} account.","-1146960797":"Fiat currencies","-1959484303":"Cryptocurrencies","-561724665":"You are limited to one fiat currency only","-2087317410":"Oops, something went wrong.","-509054266":"Anticipated annual turnover","-1117345066":"Choose the document type","-651192353":"Sample:","-1044962593":"Upload Document","-164448351":"Show less","-1361653502":"Show more","-337620257":"Switch to real account","-2120454054":"Add a real account","-38915613":"Unsaved changes","-2137450250":"You have unsaved changes. Are you sure you want to discard changes and leave this page?","-1067082004":"Leave Settings","-1982432743":"It appears that the address in your document doesn’t match the address\n in your Deriv profile. Please update your personal details now with the\n correct address.","-1451334536":"Continue trading","-1525879032":"Your documents for proof of address is expired. Please submit again.","-1425489838":"Proof of address verification not required","-1008641170":"Your account does not need address verification at this time. We will inform you if address verification is required in the future.","-60204971":"We could not verify your proof of address","-1944264183":"To continue trading, you must also submit a proof of identity.","-1088324715":"We’ll review your documents and notify you of its status within 1 - 3 working days.","-329713179":"Ok","-1926456107":"The ID you submitted is expired.","-555047589":"It looks like your identity document has expired. Please try again with a valid document.","-841187054":"Try Again","-2097808873":"We were unable to verify your ID with the details you provided. ","-228284848":"We were unable to verify your ID with the details you provided.","-1391934478":"Your ID is verified. You will also need to submit proof of your address.","-118547687":"ID verification passed","-200989771":"Go to personal details","-1358357943":"Please check and update your postal code before submitting proof of identity.","-1401994581":"Your personal details are missing","-2004327866":"Please select a valid country of document issuance.","-1664159494":"Country","-749870311":"Please contact us via <0>live chat.","-1084991359":"Proof of identity verification not required","-1981334109":"Your account does not need identity verification at this time. We will inform you if identity verification is required in the future.","-182918740":"Your proof of identity submission failed because:","-246893488":"JPEG, JPG, PNG, PDF, or GIF","-1454880310":"Must be valid for at least 6 months","-100534371":"Before uploading, please ensure that you’re facing forward in the selfie, your face is within the frame, and your eyes are clearly visible even if you’re wearing glasses.","-1529523673":"Confirm and upload","-856213726":"You must also submit a proof of address.","-1389323399":"You should enter {{min_number}}-{{max_number}} characters.","-1313806160":"Please request a new password and check your email for the new token.","-1598167506":"Success","-1077809489":"You have a new {{platform}} password to log in to your {{platform}} accounts on the web and mobile apps.","-2068479232":"{{platform}} password","-1332137219":"Strong passwords contain at least 8 characters that include uppercase and lowercase letters, numbers, and symbols.","-1597186502":"Reset {{platform}} password","-848721396":"These trading limits are optional, and you can strengthen them at any time. If you don’t wish to set a specific limit, leave the field blank. If you live in the United Kingdom, Customer Support can only remove or weaken your trading limits after 24 hours of receiving the request. If you live in the Isle of Man, Customer Support can only remove or weaken your trading limits after your trading limit period has expired.","-469096390":"These trading limits are optional, and you can strengthen them at any time. If you don’t wish to set a specific limit, leave the field blank. Customer Support can only remove or weaken your trading limits after 24 hours of receiving the request.","-42808954":"You can also exclude yourself entirely for a specified duration. This can only be removed once your self-exclusion has expired. If you wish to continue trading once your self-exclusion period expires, you must contact Customer Support by calling <0>+447723580049 to lift this self-exclusion. Requests by chat or email shall not be entertained. There will be a 24-hour cooling-off period before you can resume trading.","-1088698009":"These self-exclusion limits help you control the amount of money and time you spend trading on {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} and {{platform_name_bbot}} on Deriv. The limits you set here will help you exercise <0>responsible trading.","-1702324712":"These limits are optional, and you can adjust them at any time. You decide how much and how long you’d like to trade. If you don’t wish to set a specific limit, leave the field blank.","-1819875658":"You can also exclude yourself entirely for a specified duration. Once the self-exclusion period has ended, you can either extend it further or resume trading immediately. If you wish to reduce or remove the self-exclusion period, contact our <0>Customer Support.","-1031814119":"About trading limits and self-exclusion","-183468698":"Trading limits and self-exclusion","-933963283":"No, review my limits","-1759860126":"Yes, log me out immediately","-572347855":"{{value}} mins","-313333548":"You’ll be able to adjust these limits at any time. You can reduce your limits from the <0>self-exclusion page. To increase or remove your limits, please contact our <1>Customer Support team.","-2123139671":"Your stake and loss limits","-1250802290":"24 hours","-2070080356":"Max. total stake","-1545823544":"7 days","-180147209":"You will be automatically logged out from each session after this time limit.","-374553538":"Your account will be excluded from the website until this date (at least 6 months, up to 5 years).","-2121421686":"To self-exclude from all online gambling companies licensed in Great Britain, go to <0>www.gamstop.co.uk.","-2105708790":"Your maximum account balance and open positions","-1960600163":"Once your account balance reaches this amount, you will not be able to deposit funds into your account.","-1073845224":"No. of open position(s)","-288196326":"Your maximum deposit limit","-568749373":"Max. deposit limit","-1884902844":"Max. deposit limit per day","-545085253":"Max. deposit limit over 7 days","-1031006762":"Max. deposit limit over 30 days","-1116871438":"Max. total loss over 30 days","-2134714205":"Time limit per session","-1884271702":"Time out until","-1265825026":"Timeout time must be greater than current time.","-1332882202":"Timeout time cannot be more than 6 weeks.","-1635977118":"Exclude time cannot be less than 6 months.","-1617352279":"The email is in your spam folder (Sometimes things get lost there).","-547557964":"We can’t deliver the email to this address (Usually because of firewalls or filtering).","-142444667":"Please click on the link in the email to change your Deriv MT5 password.","-742748008":"Check your email and click the link in the email to proceed.","-84068414":"Still didn't get the email? Please contact us via <0>live chat.","-428335668":"You will need to set a password to complete the process.","-1743024217":"Select Language","-30772747":"Your personal details have been saved successfully.","-1107320163":"Automate your trading, no coding needed.","-829643221":"Multipliers trading platform.","-1585707873":"Financial Commission","-199154602":"Vanuatu Financial Services Commission","-191165775":"Malta Financial Services Authority","-194969520":"Counterparty company","-1089385344":"Deriv (SVG) LLC","-2019617323":"Deriv (BVI) Ltd","-112814932":"Deriv (FX) Ltd","-1131400885":"Deriv Investments (Europe) Limited","-1471207907":"All assets","-781132577":"Leverage","-1591882610":"Synthetics","-543177967":"Stock indices","-362324454":"Commodities","-1071336803":"Platform","-820028470":"Options & Multipliers","-1018945969":"TradersHub","-1856204727":"Reset","-213142918":"Deposits and withdrawals temporarily unavailable ","-224804428":"Transactions","-1186807402":"Transfer","-1308346982":"Derived","-1145604233":"Trade CFDs on MT5 with Derived indices that simulate real-world market movements.","-328128497":"Financial","-1484404784":"Trade CFDs on MT5 with forex, stock indices, commodities, and cryptocurrencies.","-659955365":"Swap-Free","-133406819":"Trade swap-free CFDs on MT5 with synthetics, forex, stocks, stock indices, cryptocurrencies and ETFs.","-1210359945":"Transfer funds to your accounts","-81256466":"You need a Deriv account to create a CFD account.","-699372497":"Trade with leverage and tight spreads for better returns on successful trades. <0>Learn more","-1884966862":"Get more Deriv MT5 account with different type and jurisdiction.","-596618970":"Other CFDs","-982095728":"Get","-1277942366":"Total assets","-1255879419":"Trader's Hub","-493788773":"Non-EU","-673837884":"EU","-230566990":"The following documents you submitted did not pass our checks:","-846812148":"Proof of address.","-2055865877":"Non-EU regulation","-643108528":"Non-EU and EU regulation","-172898036":"CR5236585","-1665192032":"Multipliers account","-744999940":"Deriv account","-1638358352":"Get the upside of CFDs without risking more than your initial stake with <0>Multipliers.","-749129977":"Get a real Deriv account, start trading and manage your funds.","-1814994113":"CFDs <0>{{compare_accounts_title}}","-318106501":"Trade CFDs on MT5 with synthetics, baskets, and derived FX.","-1328701106":"Trade CFDs on MT5 with forex, stocks, stock indices, synthetics, cryptocurrencies, and commodities.","-2146691203":"Choice of regulation","-249184528":"You can create real accounts under EU or non-EU regulation. Click the <0><0/> icon to learn more about these accounts.","-1505234170":"Trader's Hub tour","-181080141":"Trading hub tour","-1042025112":"Need help moving around?<0>We have a short tutorial that might help. Hit Repeat tour to begin.","-1536335438":"These are the trading accounts available to you. You can click on an account’s icon or description to find out more","-1034232248":"CFDs or Multipliers","-1320214549":"You can choose between CFD trading accounts and Multipliers accounts","-2069414013":"Click the ‘Get’ button to create an account","-951876657":"Top-up your account","-1945421757":"Once you have an account click on ‘Deposit’ or ‘Transfer’ to add funds to an account","-1965920446":"Start trading","-514389291":"<0>EU statutory disclaimer: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>71% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money.","-1975494965":"Cashier","-1787304306":"Deriv P2P","-2021135479":"This field is required.","-1870909526":"Our server cannot retrieve an address.","-582721696":"The current allowed withdraw amount is {{format_min_withdraw_amount}} to {{format_max_withdraw_amount}} {{currency}}","-42592103":"Deposit cryptocurrencies","-60779216":"Withdrawals are temporarily unavailable due to system maintenance. You can make your withdrawals when the maintenance is complete.","-215186732":"You’ve not set your country of residence. To access Cashier, please update your country of residence in the Personal details section in your account settings.","-1392897508":"The identification documents you submitted have expired. Please submit valid identity documents to unlock Cashier. ","-954082208":"Your cashier is currently locked. Please contact us via <0>live chat to find out how to unlock it.","-929148387":"Please set your account currency to enable deposits and withdrawals.","-541392118":"Your account has not been authenticated. Please submit your <0>proof of identity and <1>proof of address to authenticate your account and access your cashier.","-247122507":"Your cashier is locked. Please complete the <0>financial assessment to unlock it.","-1443721737":"Your cashier is locked. See <0>how we protect your funds before you proceed.","-901712457":"Your access to Cashier has been temporarily disabled as you have not set your 30-day turnover limit. Please go to <0>Self-exclusion and set your 30-day turnover limit.","-166472881":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable deposits and withdrawals.","-666905139":"Deposits are locked","-378858101":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable deposits.","-1318742415":"Your account has not been authenticated. Please submit your <0>proof of identity and <1>proof of address to authenticate your account and request for withdrawals.","-1923809087":"Unfortunately, you can only make deposits. Please contact us via <0>live chat to enable withdrawals.","-172277021":"Cashier is locked for withdrawals","-1624999813":"It seems that you've no commissions to withdraw at the moment. You can make withdrawals once you receive your commissions.","-1077304626":"Amount ({{currency}})","-1559994981":"Approximate value","-190084602":"Transaction","-1995606668":"Amount","-811190405":"Time","-1984478597":"The details of this transaction is available on CoinsPaid.","-1272778997":"We've sent you an email.","-89973258":"Resend email in {{seconds}}s","-1332236294":"Please verify your identity","-1675848843":"Error","-283017497":"Retry","-1196049878":"First line of home address","-1326406485":"Postal Code/ZIP","-939625805":"Telephone","-442575534":"Email verification failed","-1459042184":"Update your personal details","-1603543465":"We can't validate your personal details because there is some information missing.","-614516651":"Need help? <0>Contact us.","-203002433":"Deposit now","-720315013":"You have no funds in your {{currency}} account","-2052373215":"Please make a deposit to use this feature.","-379487596":"{{selected_percentage}}% of available balance ({{format_amount}} {{currency__display_code}})","-1957498244":"more","-299033842":"Recent transactions","-704362715":"{{amount}} {{currency}} on {{submit_date_moment}}","-1534990259":"Transaction hash:","-1612346919":"View all","-1059419768":"Notes","-316545835":"Please ensure <0>all details are <0>correct before making your transfer.","-949073402":"I confirm that I have verified the client’s transfer information.","-1752211105":"Transfer now","-598073640":"About Tether (Ethereum)","-275902914":"Tether on Ethereum (eUSDT)","-1188009792":"Tether on Omni Layer (USDT)","-1239329687":"Tether was originally created to use the bitcoin network as its transport protocol ‒ specifically, the Omni Layer ‒ to allow transactions of tokenised traditional currency.","-1705887186":"Your deposit is successful.","-142361708":"In process","-1582681840":"We’ve received your request and are waiting for more blockchain confirmations.","-1626218538":"You’ve cancelled your withdrawal request.","-1062841150":"Your withdrawal is unsuccessful due to an error on the blockchain. Please <0>contact us via live chat for more info.","-630780094":"We’re awaiting confirmation from the blockchain.","-1525882769":"Your withdrawal is unsuccessful. We've sent you an email with more information.","-298601922":"Your withdrawal is successful.","-1463156905":"Learn more about payment methods","-2013448791":"Want to exchange between e-wallet currencies? Try <0>Ewallet.Exchange","-1547606079":"We accept the following cryptocurrencies:","-1517325716":"Deposit via the following payment methods:","-639677539":"Buy cryptocurrencies","-1560098002":"Buy cryptocurrencies via fiat onramp","-541870313":"Deposit via payment agents","-474666134":"This is your {{currency_code}} account {{loginid}}","-197251450":"Don't want to trade in {{currency_code}}? You can open another cryptocurrency account.","-781389987":"This is your {{regulation_text}} {{currency_code}} account {{loginid}}","-1068036170":"We do not charge a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts and between your Deriv fiat and {{platform_name_dxtrade}} accounts.","-2056016338":"You’ll not be charged a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts.","-599632330":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts and between your Deriv fiat and {{platform_name_dxtrade}} accounts.","-1196994774":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency accounts.","-1361372445":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts, your Deriv cryptocurrency and {{platform_name_derivez}} accounts, and your Deriv cryptocurrency and {{platform_name_dxtrade}} accounts.","-993556039":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts and between your Deriv cryptocurrency and {{platform_name_dxtrade}} accounts.","-1382702462":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts.","-1995859618":"You may transfer between your Deriv fiat, cryptocurrency, {{platform_name_mt5}}, {{platform_name_derivez}} and {{platform_name_dxtrade}} accounts.","-545616470":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts, up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts, up to {{ allowed_derivez }} transfers between your Deriv and {{platform_name_derivez}} accounts, and up to {{ allowed_dxtrade }} transfers between your Deriv and {{platform_name_dxtrade}} accounts.","-1151983985":"Transfer limits may vary depending on the exchange rates.","-1747571263":"Please bear in mind that some transfers may not be possible.","-757062699":"Transfers may be unavailable due to high volatility or technical issues and when the exchange markets are closed.","-1344870129":"Deriv accounts","-1156059326":"You have {{number}} transfer remaining for today.","-1109729546":"You will be able to transfer funds between MT5 accounts and other accounts once your address is verified.","-1593609508":"Transfer between your accounts in Deriv","-464965808":"Transfer limits: <0 /> - <1 />","-553249337":"Transfers are locked","-1638172550":"To enable this feature you must complete the following:","-1949883551":"You only have one account","-1149845849":"Back to Trader's Hub","-1232852916":"We’re switching over to your {{currency}} account to view the transaction.","-993393818":"Binance Smart Chain","-561858764":"Polygon (Matic)","-410890127":"Ethereum (ERC20)","-1059526741":"Ethereum (ETH)","-1615615253":"We do not support Tron, to deposit please use only Ethereum ({{token}}).","-1831000957":"Please select the network from where your deposit will come from.","-314177745":"Unfortunately, we couldn't get the address since our server was down. Please click Refresh to reload the address or try again later.","-1345040662":"Looking for a way to buy cryptocurrency?","-759000391":"We were unable to verify your information automatically. To enable this function, you must complete the following:","-1632668764":"I accept","-544232635":"Please go to the Deposit page to generate an address. Then come back here to continue with your transaction.","-1161069724":"Please copy the crypto address you see below. You'll need it to deposit your cryptocurrency.","-1388977563":"Copied!","-1962894999":"This address can only be used ONCE. Please copy a new one for your next transaction.","-451858550":"By clicking 'Continue' you will be redirected to {{ service }}, a third-party payment service provider. Please note that {{ website_name }} is not responsible for the content or services provided by {{ service }}. If you encounter any issues related to {{ service }} services, you must contact {{ service }} directly.","-2005265642":"Fiat onramp is a cashier service that allows you to convert fiat currencies to crypto to top up your Deriv crypto accounts. Listed here are third-party crypto exchanges. You’ll need to create an account with them to use their services.","-1593063457":"Select payment channel","-1309258714":"From account number","-1247676678":"To account number","-816476007":"Account holder name","-344403983":"Description","-922432739":"Please enter a valid client login ID.","-1024241603":"Insufficient balance.","-1979554765":"Please enter a valid description.","-1254233806":"You've transferred","-953082600":"Some payment methods may not be listed here but payment agents may still offer them. If you can’t find your favourite method, contact the payment agents directly to check further.","-1491457729":"All payment methods","-142563298":"Contact your preferred payment agent for payment instructions and make your deposit.","-1023961762":"Commission on deposits","-552873274":"Commission on withdrawal","-880645086":"Withdrawal amount","-118683067":"Withdrawal limits: <0 />-<1 />","-1125090734":"Important notice to receive your funds","-1924707324":"View transaction","-1474202916":"Make a new withdrawal","-511423158":"Enter the payment agent account number","-2059278156":"Note: {{website_name}} does not charge any transfer fees.","-1201279468":"To withdraw your funds, please choose the same payment method you used to make your deposits.","-2004264970":"Your wallet address should have 25 to 64 characters.","-1707299138":"Your {{currency_symbol}} wallet address","-38063175":"{{account_text}} wallet","-705272444":"Upload a proof of identity to verify your identity","-2024958619":"This is to protect your account from unauthorised withdrawals.","-130833284":"Please note that your maximum and minimum withdrawal limits aren’t fixed. They change due to the high volatility of cryptocurrency.","-1531269493":"We'll send you an email once your transaction has been processed.","-113940416":"Current stake:","-1999539705":"Deal cancel. fee:","-447037544":"Buy price:","-1342699195":"Total profit/loss:","-1511825574":"Profit/Loss:","-726626679":"Potential profit/loss:","-338379841":"Indicative price:","-1525144993":"Payout limit:","-1167474366":"Tick ","-555886064":"Won","-529060972":"Lost","-571642000":"Day","-155989831":"Decrement value","-1192773792":"Don't show this again","-1769852749":"N/A","-1572746946":"Asian Up","-686840306":"Asian Down","-2141198770":"Higher","-816098265":"Lower","-1646655742":"Spread Up","-668987427":"Spread Down","-912577498":"Matches","-1862940531":"Differs","-808904691":"Odd","-556230215":"Ends Outside","-1268220904":"Ends Between","-703542574":"Up","-1127399675":"Down","-768425113":"No Touch","-1163058241":"Stays Between","-1354485738":"Reset Call","-376148198":"Only Ups","-1337379177":"High Tick","-328036042":"Please enter a stop loss amount that's higher than the current potential loss.","-2127699317":"Invalid stop loss. Stop loss cannot be more than stake.","-1150099396":"We’re working to have this available for you soon. If you have another account, switch to that account to continue trading. You may add a Deriv MT5 Financial.","-1940333322":"DBot is not available for this account","-1223145005":"Loss amount: {{profit}}","-1062922595":"Reference ID (buy)","-2068574600":"Reference ID (sell)","-994038153":"Start Time","-1979852400":"Entry Spot","-427802309":"Profit/Loss","-668558002":"Journal.csv","-746652890":"Notifications","-824109891":"System","-749186458":"Account switching is disabled while your bot is running. Please stop your bot before switching accounts.","-662836330":"Would you like to keep your current contract or close it? If you decide to keep it running, you can check and close it later on the <0>Reports page.","-597939268":"Keep my contract","-1322453991":"You need to log in to run the bot.","-1483938124":"This strategy is currently not compatible with DBot.","-236548954":"Contract Update Error","-1428017300":"THE","-1450728048":"OF","-255051108":"YOU","-1845434627":"IS","-931434605":"THIS","-740712821":"A","-187634388":"This block is mandatory. Here is where you can decide if your bot should continue trading. Only one copy of this block is allowed.","-2105473795":"The only input parameter determines how block output is going to be formatted. In case if the input parameter is \"string\" then the account currency will be added.","-1800436138":"2. for \"number\": 1325.68","-2046396241":"This block is mandatory. Only one copy of this block is allowed. It is added to the canvas by default when you open DBot.","-530632460":"This block is used to determine if the market price moves in the selected direction or not. It gives you a value of \"True\" or \"False\".","-1875717842":"Examples:","-890079872":"1. If the selected direction is \"Rise\", and the previous tick value is less than the current tick value, the output will be \"True\". Otherwise, the output will be an empty string.","-489739641":"2. If the selected direction is \"Fall\", and the previous tick value is more than the current tick value, the output will be \"True\". Otherwise, the output will be an empty string.","-2116076360":"There are 4 message types:","-1421941045":"2. 'Warn' displays a message in yellow to highlight something that needs attention.","-277850921":"If \"Win\" is selected, it will return \"True\" if your last trade was successful. Otherwise, it will return an empty string.","-1918487001":"Example:","-2139916657":"1. In the below example the loop is terminated in case \"x\" is \"False\" even though only one iteration is complete","-1238900333":"2. In the below example the loop jumps to the next iteration without executing below block in case if \"x\" is \"False\"","-1729479576":"You can use \"i\" inside the loop, for example to access list items","-1474636594":"In this example, the loop will repeat three times, as that is the number of items in the given list. During each iteration, the variable \"i\" will be assigned a value from the list. ","-908772734":"This block evaluates a statement and will perform an action only when the statement is true.","-334040831":"2. In this example, the instructions are repeated as long as the value of x is greater than or equal to 10. Once the value of x drops below 10, the loop is terminated.","-444267958":"\"Seconds Since Epoch\" block returns the number of seconds since January 1st, 1970.","-447522129":"You might need it when you want to repeat an actions after certain amount of time.","-1488259879":"The term \"candle\" refers to each bar on the candlestick chart. Each candle represents four market prices for the selected time interval:","-2020693608":"Each candlestick on the chart represents 4 market prices for the selected time interval:","-62728852":"- Open price: the opening price","-1247744334":"- Low price: the lowest price","-1386365697":"- Close price: the closing price","-1498732382":"A black (or red) candle indicates that the open price is higher than the close price. This represents a downward movement of the market price.","-1871864755":"This block gives you the last digit of the latest tick value of the selected market. If the latest tick value is 1410.90, this block will return 0. It’s useful for digit-based contracts such as Even/Odd, Matches/Differs, or Higher/Lower.","-1029671512":"In case if the \"OR\" operation is selected, the block returns \"True\" in case if one or both given values are \"True\"","-210295176":"Available operations:","-1385862125":"- Addition","-983721613":"- Subtraction","-854750243":"- Multiplication","-1394815185":"In case if the given number is less than the lower boundary of the range, the block returns the lower boundary value. Similarly, if the given number is greater than the higher boundary, the block will return the higher boundary value. In case if the given value is between boundaries, the block will return the given value unchanged.","-1034564248":"In the below example the block returns the value of 10 as the given value (5) is less than the lower boundary (10)","-2009817572":"This block performs the following operations to a given number","-671300479":"Available operations are:","-514610724":"- Absolute","-1923861818":"- Euler’s number (2.71) to the power of a given number","-1556344549":"Here’s how:","-1061127827":"- Visit the following URL, make sure to replace with the Telegram API token you created in Step 1: https://api.telegram.org/bot/getUpdates","-70949308":"4. Come back to DBot and add the Notify Telegram block to the workspace. Paste the Telegram API token and chat ID into the block fields accordingly.","-311389920":"In this example, the open prices from a list of candles are assigned to a variable called \"cl\".","-1460794449":"This block gives you a list of candles within a selected time interval.","-1634242212":"Used within a function block, this block returns a value when a specific condition is true.","-2012970860":"This block gives you information about your last contract.","-1504783522":"You can choose to see one of the following:","-10612039":"- Profit: the profit you’ve earned","-555996976":"- Entry time: the starting time of the contract","-1391071125":"- Exit time: the contract expiration time","-1961642424":"- Exit value: the value of the last tick of the contract","-111312913":"- Barrier: the barrier value of the contract (applicable to barrier-based trade types such as stays in/out, touch/no touch, etc.)","-674283099":"- Result: the result of the last contract: \"win\" or \"loss\"","-704543890":"This block gives you the selected candle value such as open price, close price, high price, low price, and open time. It requires a candle as an input parameter.","-482281200":"In the example below, the open price is assigned to the variable \"op\".","-364621012":"This block gives you the specified candle value for a selected time interval. You can choose which value you want:","-232477769":"- Open: the opening price","-610736310":"Use this block to sell your contract at the market price. Selling your contract is optional. You may choose to sell if the market trend is unfavourable.","-1307657508":"This block gives you the potential profit or loss if you decide to sell your contract. It can only be used within the \"Sell conditions\" root block.","-1921072225":"In the example below, the contract will only be sold if the potential profit or loss is more than the stake.","-955397705":"SMA adds the market price in a list of ticks or candles for a number of time periods, and divides the sum by that number of time periods.","-1424923010":"where n is the number of periods.","-1835384051":"What SMA tells you","-749487251":"SMA serves as an indicator of the trend. If the SMA points up then the market price is increasing and vice versa. The larger the period number, the smoother SMA line is.","-1996062088":"In this example, each point of the SMA line is an arithmetic average of close prices for the last 10 days.","-1866751721":"Input list accepts a list of ticks or candles, while period is the specified time period.","-1097076512":"You may compare SMA values calculated on every bot run to identify the market trend direction. Alternatively, you may also use a variation of the SMA block, the Simple Moving Average Array block. ","-1254849504":"If a period of 10 is entered, the Simple Moving Average Array block will return a list of SMA values calculated based on period of 10.","-1190046167":"This block displays a dialog box with a customised message. When the dialog box is displayed, your strategy is paused and will only resume after you click \"OK\".","-859028989":"In this example, the date and time will be displayed in a green notification box.","-1452086215":"In this example, a Rise contract will be purchased at midnight on 1 August 2019.","-1765276625":"Click the multiplier drop-down menu and choose the multiplier value you want to trade with.","-1872233077":"Your potential profit will be multiplied by the multiplier value you’ve chosen.","-614454953":"To learn more about multipliers, please go to the <0>Multipliers page.","-2078588404":"Select your desired market and asset type. For example, Forex > Major pairs > AUD/JPY","-2037446013":"2. Trade Type","-533927844":"Select your desired trade type. For example, Up/Down > Rise/Fall","-1192411640":"4. Default Candle Interval","-485434772":"8. Trade Options","-1827646586":"This block assigns a given value to a variable, creating the variable if it doesn't already exist.","-254421190":"List: ({{message_length}})","-1616649196":"results","-90107030":"No results found","-984140537":"Add","-783058284":"Total stake","-2077494994":"Total payout","-1073955629":"No. of runs","-1729519074":"Contracts lost","-42436171":"Total profit/loss","-1137823888":"Total payout since you last cleared your stats.","-992662695":"The number of times your bot has run since you last cleared your stats. Each run includes the execution of all the root blocks.","-1382491190":"Your total profit/loss since you last cleared your stats. It is the difference between your total payout and your total stake.","-767342552":"Enter your bot name, choose to save on your computer or Google Drive, and hit ","-1372891985":"Save.","-462715374":"Untitled Bot","-1150107517":"Connect","-1373954791":"Should be a valid number","-1278608332":"Please enter a number between 0 and {{api_max_losses}}.","-287597204":"Enter limits to stop your bot from trading when any of these conditions are met.","-1445989611":"Limits your potential losses for the day across all Deriv platforms.","-152878438":"Maximum number of trades your bot will execute for this run.","-1490942825":"Apply and run","-1058262694":"Stopping the bot will prevent further trades. Any ongoing trades will be completed by our system.","-1473283434":"Please be aware that some completed transactions may not be displayed in the transaction table if the bot is stopped while placing trades.","-397015538":"You may refer to the statement page for details of all completed transactions.","-1442034178":"Contract bought","-2020280751":"Bot is stopping","-1436403979":"Contract closed","-1711732508":"Reference IDs","-386141434":"(Buy)","-482272687":"(Sell)","-1983189496":"ticks","-694277729":"(High)","-2028564707":"(Low)","-627895223":"Exit spot","-596238067":"Entry/Exit spot","-558594655":"The bot is not running","-478946875":"The stats are cleared","-1391310674":"Check out these guides and FAQs to learn more about building your bot:","-1706059570":"DBot - your automated trading partner","-2066779239":"FAQs","-1904049127":"What is DBot?","-507620484":"Unsaved","-764102808":"Google Drive","-9461328":"Security and privacy","-1200116647":"Click here to start building your DBot.","-1696412885":"Import","-250192612":"Sort","-1566369363":"Zoom out","-1285759343":"Search","-1040972299":"Purchase contract","-600546154":"Sell contract (optional)","-985351204":"Trade again","-112876186":"Analysis","-1769584466":"Stats","-1133736197":"Utility","-1682372359":"Text","-907562847":"Lists","-1646497683":"Loops","-251326965":"Miscellaneous","-1778025545":"You’ve successfully imported a bot.","-934909826":"Load strategy","-1692205739":"Import a bot from your computer or Google Drive, build it from scratch, or start with a quick strategy.","-1545070554":"Delete bot","-1972599670":"Your bot will be permanently deleted when you hit ","-1692956623":"Yes, delete.","-573479616":"Are you sure you want to delete it?","-786915692":"You are connected to Google Drive","-1256971627":"To import your bot from your Google Drive, you'll need to sign in to your Google account.","-1233084347":"To know how Google Drive handles your data, please review Deriv’s <0>Privacy policy.","-305283152":"Strategy name","-1003476709":"Save as collection","-636521735":"Save strategy","-1953880747":"Stop my bot","-1899230001":"Stopping the current bot will load the Quick Strategy you just created to the workspace.","-2131847097":"Any open contracts can be viewed on the ","-563774117":"Dashboard","-939764287":"Charts","-1793577405":"Build from scratch","-1805712946":"We also provide a tutorial on this tab to show you how you can build and execute a simple strategy.","-1212601535":"Monitor the market","-101854331":"Guides and FAQs to help you","-495736035":"Start with a video guide and the FAQs.","-1584847169":"See your bot's performance in real-time.","-1918369898":"Run or stop your bot","-782992165":"Step 1 :","-1656388044":"First, set <0>Market to Derived > Continuous Indices > Volatility 100 (1s) Index.","-1706298865":"Then, set <0>Trade type to Up/Down > Rise/Fall.","-1834358537":"For <0>Default candle interval, set it to 1 minute","-1940971254":"For <0>Trade options, set it as below:","-512839354":"<0>Stake: USD 10 (min: 0.35 - max: 50000)","-753745278":"Step 2 :","-1056713679":"Then, set the <0>Purchase conditions block.","-245497823":"<0>2. Purchase conditions:","-916770284":"<0>Purchase: Rise","-758077259":"Step 3 :","-677396944":"Step 4 :","-295975118":"Next, go to <0>Utility tab under the Blocks menu. Tap the drop-down arrow and hit <0>Loops.","-698493945":"Step 5 :","-1992994687":"Now, tap the <0>Analysis drop-down arrow and hit <0>Contract.","-1844492873":"Go to the <0>Last trade result block and click + icon to add the <0>Result is Win block to the workspace.","-1547091772":"Then, drag the <0>Result is win into the empty slot next to <0>repeat until block.","-736400802":"Step 6 :","-732067680":"Finally, drag and add the whole <0>Repeat block to the <0>Restart trading conditions block.","-1411787252":"Step 1","-65900463":"Get started on DBot","-1447398448":"Import a bot from your mobile device or from Google drive, see a preview in the bot builder, and start trading by running the bot, or choose from our pre-made Quick Strategies. ","-1109191651":"Must be a number higher than 0","-689786738":"Minimum duration: {{ min }}","-184183432":"Maximum duration: {{ max }}","-1494924808":"The value must be equal to or greater than 2.","-1823621139":"Quick Strategy","-1455277971":"Exit Tour","-1999747212":"Want to retake the tour?","-358288026":"Note: You can also find this tutorial in the <0>Tutorials tab.","-683790172":"Now, <0>run the bot to test out the strategy.","-129587613":"Got it, thanks!","-1519425996":"No results found \"{{ faq_search_value }}\"","-155173714":"Let’s build a bot!","-468571681":"DBot is a web-based strategy builder for trading digital options. It’s a platform where you can build your own automated trading bot using drag-and-drop 'blocks'.","-1919212468":"3. You can also search for the blocks you want using the search bar above the categories.","-1520558271":"For more info, check out this blog post on the basics of building a trading bot.","-980360663":"3. Choose the block you want and drag it to the workspace.","-1493168314":"What is a quick strategy?","-364223277":"A quick strategy is a ready-made strategy that you can use in DBot. There are 3 quick strategies you can choose from: Martingale, D'Alembert, and Oscar's Grind.","-1680391945":"Using a quick strategy","-1177914473":"How do I save my strategy?","-271986909":"In Bot Builder, hit Save on the toolbar at the top to download your bot. Give your bot a name, and choose to download your bot to your device or Google Drive. Your bot will be downloaded as an XML file.","-1778742142":"How do I import my own trading bot into DBot?","-1149045595":"1. After hitting Import, select Local and click Continue.","-288041546":"2. Select your XML file and hit Open.","-2127548288":"3. Your bot will be loaded accordingly.","-1311297611":"1. After hitting Import, select Google Drive and click Continue.","-1549564044":"How do I reset the workspace?","-1127331928":"In Bot Builder, hit Reset on the toolbar at the top. This will clear the workspace. Please note that any unsaved changes will be lost.","-1366572293":"How do I control my losses with DBot?","-1394160761":"There are several ways to control your losses with DBot. Here’s a simple example of how you can implement loss control in your strategy:","-986689483":"1. Create the following variables:","-79649010":"- currentStake: Use this variable to store the stake amount used in the last contract. You can assign any amount you want, but it must be a positive number.","-1931732247":"- tradeAgain: Use this variable to stop trading when your loss limit is reached. Set the initial value to true.","-1574002530":"2. Use a logic block to check if currentPL exceeds maximumLoss. If it does, set tradeAgain to false to prevent the bot from running another cycle.","-1672069217":"3. Update currentPL with the profit from the last contract. If the last contract was lost, the value of currentPL will be negative.","-241469384":"Can I run DBot on multiple tabs in my web browser?","-90192474":"Yes, you can. However, there are limits on your account, such as maximum number of open positions and maximum aggregate payouts on open positions. So, just keep these limits in mind when opening multiple positions. You can find more info about these limits at Settings > Account limits.","-1353036415":"No, we don't. However, you'll find quick strategies on DBot that'll help you build your own trading bot for free.","-1084736225":"In which countries is DBot available?","-210651060":"If I close my web browser, will DBot continue to run?","-352345777":"What are the most popular strategies for automated trading?","-597923989":"Watch this video to learn how to build a trading bot on DBot. Also, check out this blog post on building a trading bot.","-418247251":"Download your journal.","-870004399":"<0>Bought: {{longcode}} (ID: {{transaction_id}})","-1211474415":"Filters","-186972150":"There are no messages to display","-999254545":"All messages are filtered out","-1121028020":"or, if you prefer...","-254025477":"Select an XML file from your device","-1131095838":"Please upload an XML file","-523928088":"Create one or upload one from your local drive or Google Drive.","-1684205190":"Why can't I see my recent bots?","-2050879370":"1. Logged in from a different device","-811857220":"3. Cleared your browser cache","-625024929":"Leaving already?","-584289785":"No, I'll stay","-1435060006":"If you leave, your current contract will be completed, but your bot will stop running immediately.","-24780060":"When you’re ready to trade, hit ","-2147110353":". You’ll be able to track your bot’s performance here.","-1717650468":"Online","-1825471709":"A whole new trading experience on a powerful yet easy to use platform.","-981017278":"Automated trading at your fingertips. No coding needed.","-1309011360":"Open positions","-1597214874":"Trade table","-883103549":"Account deactivated","-821418875":"Trader","-679102561":"Contract Details","-430118939":"Complaints policy","-568280383":"Deriv Gaming","-895331276":"Complete your proof of address","-782679300":"Complete your proof of identity","-579984289":"Derived Demo","-1596515467":"Derived BVI","-222394569":"Derived Vanuatu","-533935232":"Financial BVI","-565431857":"Financial Labuan","-1290112064":"Deriv EZ","-291535132":"Swap-Free Demo","-1472945832":"Swap-Free SVG","-1669418686":"AUD/CAD","-1548588249":"AUD/CHF","-1552890620":"AUD/JPY","-681231560":"AUD/PLN","-64938413":"AUD/USD","-1430522808":"EUR/AUD","-2020477069":"EUR/CAD","-1201853162":"EUR/CHF","-1318070255":"EUR/GBP","-1197505739":"EUR/JPY","-405907358":"EUR/USD","-1536293064":"NZD/JPY","-79700881":"NZD/USD","-642323838":"USD/CAD","-428199705":"USD/CHF","-424108348":"USD/JPY","-548255282":"USD/NOK","-1834131208":"USD/PLN","-524302516":"Silver/USD","-764731776":"Platinum/USD","-853582174":"France 40","-1096386695":"UK 100","-617646862":"Germany 40","-2077690248":"Japan 225","-512194910":"US Tech 100","-381746202":"US 500","-1935463381":"Swiss 20","-1941767726":"Euro 50","-1925264914":"Volatility 25 Index","-708579504":"Volatility 50 Index","-975255670":"Volatility 75 Index","-1736314513":"Crash 300 Index","-342128411":"Crash 500 Index","-9704319":"Crash 1000 Index","-465860988":"Bull Market Index","-390528194":"Step Index","-280323742":"EUR Basket","-563812039":"Volatility 10 (1s) Index","-764111252":"Volatility 100 (1s) Index","-816110209":"Volatility 150 (1s) Index","-1374309449":"Volatility 200 (1s) Index","-1288044380":"Volatility 250 (1s) Index","-1164978320":"Jump 10 Index","-575272887":"BCH/USD","-295406873":"BTC/ETH","-1713556301":"ZMR/USD","-2046638412":"XRP/USD","-1263203461":"BTC/USD","-1112522776":"DSH/USD","-460689370":"LTC/USD","-841561409":"Put Spread","-137444201":"Buy","-1500514644":"Accumulator","-144803045":"Only numbers and these special characters are allowed: {{permitted_characters}}","-1450516268":"Only letters, numbers, space, hyphen, period, and apostrophe are allowed.","-1966032552":"The length of token should be 8.","-2128137611":"Should start with letter or number, and may contain hyphen and underscore.","-1590869353":"Up to {{decimal_count}} decimal places are allowed.","-2061307421":"Should be more than {{min_value}}","-1099941162":"Should be less than {{max_value}}","-1528188268":"Straight rows of keys are easy to guess","-1339903234":"Short keyboard patterns are easy to guess","-23980798":"Repeats like \"aaa\" are easy to guess","-235760680":"Avoid repeated words and characters","-1568933154":"Sequences like abc or 6543 are easy to guess","-725663701":"Avoid sequences","-1450768475":"Recent years are easy to guess","-1804838610":"Avoid years that are associated with you","-64849469":"Dates are often easy to guess","-2006915194":"Avoid dates and years that are associated with you","-2124205211":"A word by itself is easy to guess","-1095202689":"All-uppercase is almost as easy to guess as all-lowercase","-2137856661":"Reversed words aren't much harder to guess","-1885413063":"Predictable substitutions like '@' instead of 'a' don't help very much","-369258265":"This password is on the blacklist","-681468758":"Your web browser is out of date and may affect your trading experience. Please <0>update your browser.","-577777971":"You have reached the rate limit of requests per second. Please try later.","-206321775":"Fiat","-522767852":"DEMO","-433761292":"Switching to default account.","-405439829":"Sorry, you can't view this contract because it doesn't belong to this account.","-1590712279":"Gaming","-16448469":"Virtual","-540474806":"Your Options account is scheduled to be closed","-618539786":"Your account is scheduled to be closed","-945275490":"Withdraw all funds from your Options account.","-2093768906":"{{name}} has released your funds.
Would you like to give your feedback?","-705744796":"Your demo account balance has reached the maximum limit, and you will not be able to place new trades. Reset your balance to continue trading from your demo account.","-2063700253":"disabled","-800774345":"Power up your Financial trades with intuitive tools from Acuity.","-279582236":"Learn More","-1211460378":"Power up your trades with Acuity","-703292251":"Download intuitive trading tools to keep track of market events. The Acuity suite is only available for Windows, and is most recommended for financial assets.","-1585069798":"Please click the following link to complete your Appropriateness Test.","-1287141934":"Find out more","-367759751":"Your account has not been verified","-596690079":"Enjoy using Deriv?","-265932467":"We’d love to hear your thoughts","-1815573792":"Drop your review on Trustpilot.","-823349637":"Go to Trustpilot","-1204063440":"Set my account currency","-1601813176":"Would you like to increase your daily limits to {{max_daily_buy}} {{currency}} (buy) and {{max_daily_sell}} {{currency}} (sell)?","-1751632759":"Get a faster mobile trading experience with the <0>{{platform_name_go}} app!","-1164554246":"You submitted expired identification documents","-219846634":"Let’s verify your ID","-529038107":"Install","-1738575826":"Please switch to your real account or create one to access the cashier.","-1329329028":"You’ve not set your 30-day turnover limit","-132893998":"Your access to the cashier has been temporarily disabled as you have not set your 30-day turnover limit. Please go to Self-exclusion and set the limit.","-1852207910":"MT5 withdrawal disabled","-764323310":"MT5 withdrawals have been disabled on your account. Please check your email for more details.","-1902997828":"Refresh now","-753791937":"A new version of Deriv is available","-1775108444":"This page will automatically refresh in 5 minutes to load the latest version.","-1175685940":"Please contact us via live chat to enable withdrawals.","-1125797291":"Password updated.","-157145612":"Please log in with your updated password.","-1728185398":"Resubmit proof of address","-612396514":"Please resubmit your proof of address.","-1519764694":"Your proof of address is verified.","-1961967032":"Resubmit proof of identity","-117048458":"Please submit your proof of identity.","-1196422502":"Your proof of identity is verified.","-136292383":"Your proof of address verification is pending","-386909054":"Your proof of address verification has failed","-430041639":"Your proof of address did not pass our verification checks, and we’ve placed some restrictions on your account. Please resubmit your proof of address.","-87177461":"Please go to your account settings and complete your personal details to enable deposits.","-904632610":"Reset your balance","-470018967":"Reset balance","-156611181":"Please complete the financial assessment in your account settings to unlock it.","-1925176811":"Unable to process withdrawals in the moment","-980696193":"Withdrawals are temporarily unavailable due to system maintenance. You can make withdrawals when the maintenance is complete.","-1647226944":"Unable to process deposit in the moment","-488032975":"Deposits are temporarily unavailable due to system maintenance. You can make deposits when the maintenance is complete.","-67021419":"Our cashier is temporarily down due to system maintenance. You can access the cashier in a few minutes when the maintenance is complete.","-849587074":"You have not provided your tax identification number","-47462430":"This information is necessary for legal and regulatory requirements. Please go to your account settings, and fill in your latest tax identification number.","-2067423661":"Stronger security for your Deriv account","-1719731099":"With two-factor authentication, you’ll protect your account with both your password and your phone - so only you can access your account, even if someone knows your password.","-949074612":"Please contact us via live chat.","-2087822170":"You are offline","-1669693571":"Check your connection.","-1706642239":"<0>Proof of ownership <1>required","-553262593":"<0><1>Your account is currently locked <2><3>Please upload your proof of <4>ownership to unlock your account. <5>","-1834929362":"Upload my document","-1043638404":"<0>Proof of ownership <1>verification failed","-1766760306":"<0><1>Please upload your document <2>with the correct details. <3>","-8892474":"Start assessment","-1330929685":"Please submit your proof of identity and proof of address to verify your account and continue trading.","-99461057":"Please submit your proof of address to verify your account and continue trading.","-577279362":"Please submit your proof of identity to verify your account and continue trading.","-197134911":"Your proof of identity is expired","-152823394":"Your proof of identity has expired. Please submit a new proof of identity to verify your account and continue trading.","-2142540205":"It appears that the address in your document doesn’t match the address in your Deriv profile. Please update your personal details now with the correct address.","-482715448":"Go to Personal details","-2072411961":"Your proof of address has been verified","-384887227":"Update the address in your profile.","-448961363":"non-EU","-1998049070":"If you agree to our use of cookies, click on Accept. For more information, <0>see our policy.","-2061807537":"Something’s not right","-402093392":"Add Deriv Account","-277547429":"A Deriv account will allow you to fund (and withdraw from) your MT5 account(s).","-1721181859":"You’ll need a {{deriv_account}} account","-1989074395":"Please add a {{deriv_account}} account first before adding a {{dmt5_account}} account. Deposits and withdrawals for your {{dmt5_label}} account are done by transferring funds to and from your {{deriv_label}} account.","-689237734":"Proceed","-1642457320":"Help centre","-1966944392":"Network status: {{status}}","-594209315":"Synthetic indices in the EU are offered by {{legal_entity_name}}, W Business Centre, Level 3, Triq Dun Karm, Birkirkara BKR 9033, Malta, licensed and regulated by the Malta Gaming Authority (<0>licence no. MGA/B2C/102/2000) and by the Revenue Commissioners for clients in Ireland (<2>licence no. 1010285).","-181484419":"Responsible trading","-650505513":"Full screen","-1823504435":"View notifications","-1954045170":"No currency assigned","-583559763":"Menu","-1591792668":"Account Limits","-34495732":"Regulatory information","-1496158755":"Go to Deriv.com","-1396326507":"Unfortunately, {{website_name}} is not available in your country.","-1019903756":"Synthetic","-288996254":"Unavailable","-735306327":"Manage accounts","-1310654342":"As part of the changes in our product line-up, we will be closing Gaming accounts belonging to our UK clients.","-626152766":"As part of the changes in our product line-up, we are closing Options accounts belonging to our clients in Europe.","-490100162":"As part of the changes in our product line-up, we will be closing accounts belonging to our Isle of Man clients.","-1208958060":"You can no longer trade digital options on any of our platforms. You also can’t deposit funds into your account.<0/><1/>Any open positions on digital options have been closed with full payout.","-2050417883":"You’ll lose access to your Gaming account when it gets closed, so make sure to withdraw your funds as soon as possible.","-1950045402":"Withdraw all your funds","-168971942":"What this means for you","-905560792":"OK, I understand","-1308593541":"You will lose access to your account when it gets closed, so be sure to withdraw all your funds.","-2024365882":"Explore","-1197864059":"Create free demo account","-1813972756":"Account creation paused for 24 hours","-366030582":"Sorry, you're unable to create an account at this time. As you declined our previous risk warnings, we need you to wait for 24 hours after your first account creation attempt before you can proceed.<0/><0/>","-534047566":"Thank you for your understanding. You can create your account on {{real_account_unblock_date}} or later.","-399816343":"Trading Experience Assessment<0/>","-1822498621":"As per our regulatory obligations, we are required to assess your trading knowledge and experience.<0/><0/>Please click ‘OK’ to continue","-71049153":"Keep your account secure with a password","-1861974537":"Strong passwords contain at least 8 characters, combine uppercase and lowercase letters, numbers, and symbols.","-1485242688":"Step {{step}}: {{step_title}} ({{step}} of {{steps}})","-1829842622":"You can open an account for each cryptocurrency.","-987221110":"Choose a currency you would like to trade with.","-1066574182":"Choose a currency","-1914534236":"Choose your currency","-200560194":"Please switch to your {{fiat_currency}} account to change currencies.","-1829493739":"Choose the currency you would like to trade with.","-1814647553":"Add a new","-1269362917":"Add new","-650480777":"crypto account","-175638343":"Choose an account or add a new one","-1768223277":"Your account is ready","-1215717784":"<0>You have successfully changed your currency to {{currency}}.<0>Make a deposit now to start trading.","-786091297":"Trade on demo","-228099749":"Please verify your identity and address","-1041852744":"We're processing your personal information","-1775006840":"Make a deposit now to start trading.","-983734304":"We need proof of your identity and address before you can start trading.","-917733293":"To get trading, please confirm where you live.","-1282628163":"You'll be able to get trading as soon as verification is complete.","-952649119":"Log In","-3815578":"Sign Up","-1456176427":"Set a currency for your real account","-1557011219":"Add a real Deriv Options account","-241733171":"Add a Deriv Financial account","-1329687645":"Create a cryptocurrency account","-1429178373":"Create a new account","-1740162250":"Manage account","-1016775979":"Choose an account","-1362081438":"Adding more real accounts has been restricted for your country.","-1602122812":"24-hour Cool Down Warning","-1519791480":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the risk of losing your money. <0/><0/>\n As you have declined our previous warning, you would need to wait 24 hours before you can proceed further.","-1010875436":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the high risk of losing your money. <0/><0/> To continue, kindly note that you would need to wait 24 hours before you can proceed further.","-1725418054":"By clicking ‘Accept’ and proceeding with the account opening, you should note that you may be exposing yourself to risks. These risks, which may be significant, include the risk of losing the entire sum invested, and you may not have the knowledge and experience to properly assess or mitigate them.","-1369294608":"Already signed up?","-730377053":"You can’t add another real account","-2100785339":"Invalid inputs","-617844567":"An account with your details already exists.","-292363402":"Trading statistics report","-1656860130":"Options trading can become a real addiction, as can any other activity pushed to its limits. To avoid the danger of such an addiction, we provide a reality-check that gives you a summary of your trades and accounts on a regular basis.","-28080461":"Would like to check your statement first? <0>Check Statement","-611059051":"Please specify your preferred interval reality check in minutes:","-1876891031":"Currency","-11615110":"Turnover","-1370419052":"Profit / Loss","-437320982":"Session duration:","-3959715":"Current time:","-1534648620":"Your password has been changed","-596199727":"We will now redirect you to the login page.","-310434518":"The email input should not be empty.","-437918412":"No currency assigned to your account","-1193651304":"Country of residence","-707550055":"We need this to make sure our service complies with laws and regulations in your country.","-280139767":"Set residence","-601615681":"Select theme","-1152511291":"Dark","-1428458509":"Light","-1976089791":"Your Deriv account has been unlinked from your {{social_identity_provider}} account. You can now log in to Deriv using your new email address and password.","-505449293":"Enter a new password for your Deriv account.","-1728963310":"Stop creating an account?","-703818088":"Only log in to your account at this secure link, never elsewhere.","-1235799308":"Fake links often contain the word that looks like \"Deriv\" but look out for these differences.","-2102997229":"Examples","-82488190":"I've read the above carefully.","-97775019":"Do not trust and give away your credentials on fake websites, ads or emails.","-2142491494":"OK, got it","-611136817":"Beware of fake links.","-1787820992":"Platforms","-1793883644":"Trade FX and CFDs on a customisable, easy-to-use trading platform.","-184713104":"Earn fixed payouts with options, or trade multipliers to amplify your gains with limited risk.","-1571775875":"Our flagship options and multipliers trading platform.","-895091803":"If you're looking for CFDs","-1447215751":"Not sure? Try this","-2338797":"<0>Maximise returns by <0>risking more than you put in.","-1682067341":"Earn <0>fixed returns by <0>risking only what you put in.","-1744351732":"Not sure where to start?","-943710774":"This complaints policy, which may change from time to time, applies to your account registered with {{legal_entity_name}}, having its registered office address at First Floor, Millennium House, Victoria Road, Douglas, Isle of Man, IM2 4RW, licensed and regulated respectively by (1) the Gambling Supervision Commission in the Isle of Man (current <0>licence issued on 31 August 2017) and (2) the Gambling Commission in the UK (<1>licence no. 39172).","-255056078":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name}}, having its registered office address at W Business Centre, Level 3, Triq Dun Karm, Birkirkara, BKR 9033, Malta, licensed and regulated by the Malta Gaming Authority in Malta for gambling products only, <0>licence no. MGA/B2C/102/2000, and for clients residing in the UK by the UK Gambling Commission (account number 39495).","-1941013000":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}}, {{legal_entity_name_fx}}, and {{legal_entity_name_v}}.","-594812204":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}}.","-813256361":"We are committed to treating our clients fairly and providing them with excellent service.<0/><1/>We would love to hear from you on how we can improve our services to you. Any information you provide will be treated in the strictest confidence. Rest assured that you will be heard, valued, and always treated fairly.","-1622847732":"If you have an inquiry regarding your trading account with {{legal_entity_name}}, you can contact us through our <0>Help centre or by chatting with a representative via <1>Live Chat.<2/><3/>We are committed to resolving your query in the quickest time possible and appreciate your patience in allowing us time to resolve the matter.<4/><5/>We strive to provide the best possible service and support to our customers. However, in the event that we are unable to resolve your query or if you feel that our response is unsatisfactory, we want to hear from you. We welcome and encourage you to submit an official complaint to us so that we can review your concerns and work towards a resolution.","-1639808836":"If you are not satisfied with the outcome, you can escalate your complaint to the <0>Independent Betting Adjudication Service (IBAS) by filling the IBAS adjudication form. Please note that IBAS only deals with disputes that result from transactions.","-1505742956":"<0/><1/>You can also refer your dispute to the Malta Gaming Authority via the <2>Player Support Unit.","-1406192787":"If you are not satisfied with the outcome, you can escalate your complaint to the <0>Financial Commission.","-1776547326":"<0/><1/>If you reside in the UK and you are unhappy with our response you may escalate your complaint to the <2>Financial Ombudsman Service.","-2115348800":"1. Introduction","-744009523":"2. Fair treatment","-866831420":"3.1. Submission of a complaint","-1102904026":"3.2. Handling your complaint","-603378979":"3.3. Resolving your complaint","-697569974":"3.4. Your decision","-1280998762":"4. Complaints","-1886635232":"A complaint is any expression of dissatisfaction by a client regarding our products or services that requires a formal response.<0/><1/>If what you submit does not fall within the scope of a complaint, we may reclassify it as a query and forward it to the relevant department for handling. However, if you believe that your query should be classified as a complaint due to its relevance to the investment services provided by {{legal_entity_name}}, you may request that we reclassify it accordingly.","-1771496016":"To submit a complaint, please send an email to <0>complaints@deriv.com, providing as much detail as possible. To help us investigate and resolve your complaint more efficiently, please include the following information:","-1197243525":"<0>•A clear and detailed description of your complaint, including any relevant dates, times, and transactions","-1795134892":"<0>•Any relevant screenshots or supporting documentation that will assist us in understanding the issue","-2053887036":"4.4. Handling your complaint","-717170429":"Once we have received the details of your complaint, we shall review it carefully and keep you updated on the handling process. We might request further information or clarifications to facilitate the resolution of the complaint.","-1841922393":"4.5. Resolving your complaint","-1327119795":"4.6. Your decision","-2019654103":"If we are unable to resolve your complaint or you are not satisfied with the outcome, you can escalate your complaint to the Office of the Arbiter for Financial Services.<0/><1/><2>Filing complaints with the Office of the Arbiter for Financial Services","-687172857":"<0>•You may file a complaint with the Arbiter for Financial Services only if you are not satisfied with our decision or the decision wasn’t made within 15 business days.","-262934706":"<0>•If the complaint is accepted by the Arbiter, you will receive another email with further details relating to the payment of the €25 complaint fee and the processes that follow.","-993572476":"<0>b.The Financial Commission has 5 days to acknowledge that your complaint was received and 14 days to answer the complaint through our Internal Dispute Resolution (IDR) procedure.","-1769159081":"<0>c.You will be able to file a complaint with the Financial Commission only if you are not satisfied with our decision or the decision wasn’t made within 14 days.","-58307244":"3. Determination phase","-356618087":"<0>b.The DRC may request additional information from you or us, who must then provide the requested information within 7 days.","-945718602":"<0>b.If you agree with a DRC decision, you will need to accept it within 14 days. If you do not respond to the DRC decision within 14 days, the complaint is considered closed.","-1500907666":"<0>d.If the decision is made in our favour, you must provide a release for us within 7 days of when the decision is made, and the complaint will be considered closed.","-429248139":"5. Disclaimer","-818926350":"The Financial Commission accepts appeals for 45 days following the date of the incident and only after the trader has tried to resolve the issue with the company directly.","-358055541":"Power up your trades with cool new tools","-29496115":"We've partnered with Acuity to give you a suite of intuitive trading tools for MT5 so you can keep track of market events and trends, free of charge!<0/><0/>","-648669944":"Download the Acuity suite and take advantage of the <1>Macroeconomic Calendar, Market Alerts, Research Terminal, and <1>Signal Centre Trade Ideas without leaving your MT5 terminal.<0/><0/>","-794294380":"This suite is only available for Windows, and is most recommended for financial assets.","-922510206":"Need help using Acuity?","-815070480":"Disclaimer: The trading services and information provided by Acuity should not be construed as a solicitation to invest and/or trade. Deriv does not offer investment advice. The past is not a guide to future performance, and strategies that have worked in the past may not work in the future.","-2111521813":"Download Acuity","-941870889":"The cashier is for real accounts only","-352838513":"It looks like you don’t have a real {{regulation}} account. To use the cashier, switch to your {{active_real_regulation}} real account, or get an {{regulation}} real account.","-1858915164":"Ready to deposit and trade for real?","-162753510":"Add real account","-1208519001":"You need a real Deriv account to access the cashier.","-175369516":"Welcome to Deriv X","-939154994":"Welcome to Deriv MT5 dashboard","-1667427537":"Run Deriv X on your browser or download the mobile app","-305915794":"Run MT5 from your browser or download the MT5 app for your devices","-404375367":"Trade forex, basket indices, commodities, and cryptocurrencies with high leverage.","-243985555":"Trade CFDs on forex, stocks, stock indices, synthetic indices, cryptocurrencies, and commodities with leverage.","-2030107144":"Trade CFDs on forex, stocks & stock indices, commodities, and crypto.","-705682181":"Malta","-409563066":"Regulator","-1302404116":"Maximum leverage","-2098459063":"British Virgin Islands","-1510474851":"British Virgin Islands Financial Services Commission (licence no. SIBA/L/18/1114)","-761250329":"Labuan Financial Services Authority (Licence no. MB/18/0024)","-1264604378":"Up to 1:1000","-1686150678":"Up to 1:100","-637908996":"100%","-1420548257":"20+","-1344709651":"40+","-1373949478":"50+","-1382029900":"70+","-1493055298":"90+","-1835174654":"1:30","-1647612934":"Spreads from","-1587894214":"about verifications needed.","-466784048":"Regulator/EDR","-1326848138":"British Virgin Islands Financial Services Commission (License no. SIBA/L/18/1114)","-777580328":"Forex, Stocks, Stock indices, Commodities, and Cryptocurrencies","-1372141447":"Straight-through processing","-1969608084":"Forex and Cryptocurrencies","-800771713":"Labuan Financial Services Authority (licence no. MB/18/0024)","-1497128311":"80+","-1501230046":"0.6 pips","-1689815930":"You will need to submit proof of identity and address once you reach certain thresholds.","-1175785439":"Deriv (SVG) LLC (company no. 273 LLC 2020)","-235833244":"Synthetics, Forex, Stocks, Stock Indices, Cryptocurrencies, and ETFs","-139026353":"A selfie of yourself.","-70314394":"A recent utility bill (electricity, water or gas) or recent bank statement or government-issued letter with your name and address.","-435524000":"Verification failed. Resubmit during account creation.","-1385099152":"Your document is verified.","-1434036215":"Demo Financial","-1416247163":"Financial STP","-1637969571":"Demo Swap-Free","-1882063886":"Demo CFDs","-1347908717":"Demo Financial SVG","-1780324582":"SVG","-785625598":"Use these credentials to log in to your {{platform}} account on the website and mobile apps.","-997127433":"Change Password","-1300381594":"Get Acuity trading tools","-860609405":"Password","-742647506":"Fund transfer","-1972393174":"Trade CFDs on our synthetics, baskets, and derived FX.","-1357917360":"Web terminal","-1454896285":"The MT5 desktop app is not supported by Windows XP, Windows 2003, and Windows Vista.","-810388996":"Download the Deriv X mobile app","-1727991510":"Scan the QR code to download the Deriv X Mobile App","-511301450":"Indicates the availability of cryptocurrency trading on a particular account.","-1647569139":"Synthetics, Baskets, Derived FX, Forex: standard/micro, Stocks, Stock indices, Commodities, Cryptocurrencies","-2102641225":"At bank rollover, liquidity in the forex markets is reduced and may increase the spread and processing time for client orders. This happens around 21:00 GMT during daylight saving time, and 22:00 GMT non-daylight saving time.","-495364248":"Margin call and stop out level will change from time to time based on market condition.","-536189739":"To protect your portfolio from adverse market movements due to the market opening gap, we reserve the right to decrease leverage on all offered symbols for financial accounts before market close and increase it again after market open. Please make sure that you have enough funds available in your {{platform}} account to support your positions at all times.","-712681566":"Peer-to-peer exchange","-1267880283":"{{field_name}} is required","-2084509650":"{{field_name}} is not properly formatted.","-1779241732":"First line of address is not in a proper format.","-188222339":"This should not exceed {{max_number}} characters.","-1673422138":"State/Province is not in a proper format.","-1580554423":"Trade CFDs on our synthetic indices that simulate real-world market movements.","-1385484963":"Confirm to change your {{platform}} password","-1990902270":"This will change the password to all of your {{platform}} accounts.","-673424733":"Demo account","-1986258847":"Server maintenance starts at 01:00 GMT every Sunday, and this process may take up to 2 hours to complete. Service may be disrupted during this time.","-1199152768":"Please explore our other platforms.","-205020823":"Explore {{platform_name_trader}}","-1982499699":"Explore {{platform_name_dbot}}","-1567989247":"Submit your proof of identity and address","-184453418":"Enter your {{platform}} password","-393388362":"We’re reviewing your documents. This should take about 1 to 3 days.","-790488576":"Forgot password?","-535365199":"Enter your {{platform}} password to add a {{platform_name}} {{account}} account.","-2057918502":"Hint: You may have entered your Deriv password, which is different from your {{platform}} password.","-1769158315":"real","-700260448":"demo","-1936102840":"Congratulations, you have successfully created your {{category}} <0>{{platform}} <1>{{type}} {{jurisdiction_selected_shortcode}} account. ","-1928229820":"Reset Deriv X investor password","-1087845020":"main","-1950683866":"investor","-1874242353":"Fund top up","-89838213":"You can top up your demo account with an additional <0> if your balance is <1> or less.","-1211122723":"{{ platform }} {{ account_title }} account","-78895143":"Current balance","-149993085":"New current balance","-490244964":"Forex, stocks, stock indices, cryptocurrencies","-1368041210":", synthetic indices","-877064208":"EUR","-1284221303":"You’ll get a warning, known as margin call, if your account balance drops down close to the stop out level.","-1848799829":"To understand stop out, first you need to learn about margin level, which is the ratio of your equity (the total balance you would have if you close all your positions at that point) to the margin you're using at the moment. If your margin level drops below our stop out level, your positions may be closed automatically to protect you from further losses.","-224051432":"24/7","-70716111":"FX-majors (standard/micro lots), FX-minors, basket indices, commodities, cryptocurrencies, and stocks and stock indices","-1041629137":"FX-majors, FX-minors, FX-exotics, and cryptocurrencies","-287097947":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies (except UK)","-2016975615":"Deriv MT5 CFDs real account","-1207265427":"Compare CFDs real accounts","-1225160479":"Compare available accounts","-266701451":"derivX wordmark","-2145356061":"Download Deriv X on your phone to trade with the Deriv X account","-251202291":"Broker","-81650212":"MetaTrader 5 web","-2123571162":"Download","-941636117":"MetaTrader 5 Linux app","-637537305":"Download {{ platform }} on your phone to trade with the {{ platform }} {{ account }} account","-2042845290":"Your investor password has been changed.","-1882295407":"Your password has been changed.","-254497873":"Use this password to grant viewing access to another user. While they may view your trading account, they will not be able to trade or take any other actions.","-161656683":"Current investor password","-374736923":"New investor password","-1793894323":"Create or reset investor password","-2026018074":"Add your Deriv MT5 <0>{{account_type_name}} account under Deriv (SVG) LLC (company no. 273 LLC 2020).","-162320753":"Add your Deriv MT5 <0>{{account_type_name}} account under Deriv (BVI) Ltd, regulated by the British Virgin Islands Financial Services Commission (License no. SIBA/L/18/1114).","-2125860351":"Choose a jurisdiction for your Deriv MT5 CFDs account","-479119833":"Choose a jurisdiction for your Deriv MT5 {{account_type}} account","-450424792":"You need a real account (fiat currency or cryptocurrency) in Deriv to create a real Deriv MT5 account.","-1760596315":"Create a Deriv account","-648956272":"Use this password to log in to your Deriv X accounts on the web and mobile apps.","-1814308691":"Please click on the link in the email to change your {{platform}} password.","-1282933308":"Not {{barrier}}","-968190634":"Equals {{barrier}}","-1747377543":"Under {{barrier}}","-1694314813":"Contract value:","-442488432":"day","-337314714":"days","-1763848396":"Put","-1572548510":"Ups & Downs","-71301554":"Ins & Outs","-952298801":"Look Backs","-763273340":"Digits","-993480898":"Accumulators","-1790089996":"NEW!","-1386326276":"Barrier is a required field.","-1418742026":"Higher barrier must be higher than lower barrier.","-92007689":"Lower barrier must be lower than higher barrier.","-1095538960":"Please enter the start time in the format \"HH:MM\".","-1975910372":"Minute must be between 0 and 59.","-866277689":"Expiry time cannot be in the past.","-1455298001":"Now","-256210543":"Trading is unavailable at this time.","-28115241":"{{platform_name_trader}} is not available for this account","-453920758":"Go to {{platform_name_mt5}} dashboard","-402175529":"History","-902712434":"Deal cancellation","-988484646":"Deal cancellation (executed)","-444882676":"Deal cancellation (active)","-13423018":"Reference ID","-1551639437":"No history","-1214703885":"You have yet to update either take profit or stop loss","-880722426":"Market is closed","-504849554":"It will reopen at","-59803288":"In the meantime, try our synthetic indices. They simulate real-market volatility and are open 24/7.","-1278109940":"See open markets","-694105443":"This market is closed","-439389714":"We’re working on it","-770929448":"Go to {{platform_name_smarttrader}}","-138538812":"Log in or create a free account to place a trade.","-2036388794":"Create free account","-1813736037":"No further trading is allowed on this contract type for the current trading session. For more info, refer to our <0>terms and conditions.","-590131162":"Stay on {{website_domain}}","-1444663817":"Go to Binary.com","-1526466612":"You’ve selected a trade type that is currently unsupported, but we’re working on it.","-1043795232":"Recent positions","-1572796316":"Purchase price:","-153220091":"{{display_value}} Tick","-802374032":"Hour","-2039780875":"Purchase confirmation","-1672470173":"Require confirmation before purchasing a contract","-1342661765":"Lock contract purchase buttons","-1738427539":"Purchase","-504410042":"When you open a position, barriers will be created around the asset price. For each new tick, the upper and lower barriers are automatically calculated based on the asset and accumulator value you choose. You will earn a profit if you close your position before the asset price hits either of the barriers.","-1907770956":"As long as the price change for each tick is within the barrier, your payout will grow at every tick, based on the accumulator value you’ve selected.","-997670083":"Maximum ticks","-1392065699":"If you select \"Rise\", you win the payout if the exit spot is strictly higher than the entry spot.","-1762566006":"If you select \"Fall\", you win the payout if the exit spot is strictly lower than the entry spot.","-1435306976":"If you select \"Allow equals\", you win the payout if exit spot is higher than or equal to entry spot for \"Rise\". Similarly, you win the payout if exit spot is lower than or equal to entry spot for \"Fall\".","-1959473569":"If you select \"Lower\", you win the payout if the exit spot is strictly lower than the barrier.","-1350745673":"If the exit spot is equal to the barrier, you don't win the payout.","-2089488446":"If you select \"Ends Between\", you win the payout if the exit spot is strictly higher than the Low barrier AND strictly lower than the High barrier.","-1876950330":"If you select \"Ends Outside\", you win the payout if the exit spot is EITHER strictly higher than the High barrier, OR strictly lower than the Low barrier.","-546460677":"If the exit spot is equal to either the Low barrier or the High barrier, you don't win the payout.","-1812957362":"If you select \"Stays Between\", you win the payout if the market stays between (does not touch) either the High barrier or the Low barrier at any time during the contract period","-220379757":"If you select \"Goes Outside\", you win the payout if the market touches either the High barrier or the Low barrier at any time during the contract period.","-1281286610":"If you select \"Matches\", you will win the payout if the last digit of the last tick is the same as your prediction.","-1929209278":"If you select \"Even\", you will win the payout if the last digit of the last tick is an even number (i.e., 2, 4, 6, 8, or 0).","-2038865615":"If you select \"Odd\", you will win the payout if the last digit of the last tick is an odd number (i.e., 1, 3, 5, 7, or 9).","-1416078023":"If you select \"Touch\", you win the payout if the market touches the barrier at any time during the contract period.","-1272255095":"If the exit spot is equal to the barrier or the new barrier (if a reset occurs), you don't win the payout.","-231957809":"Win maximum payout if the exit spot is higher than or equal to the upper barrier.","-464144986":"Win maximum payout if the exit spot is lower than or equal to the lower barrier.","-1031456093":"Win up to maximum payout if exit spot is between lower and upper barrier, in proportion to the difference between upper barrier and exit spot.","-968162707":"No payout if exit spot is above or equal to the upper barrier.","-299450697":"If you select \"High Tick\", you win the payout if the selected tick is the highest among the next five ticks.","-705681870":"By purchasing the \"High-to-Low\" contract, you'll win the multiplier times the difference between the high and low over the duration of the contract.","-420387848":"The high is the highest point ever reached by the market during the contract period.","-1666375348":"By purchasing the \"High-to-Close\" contract, you'll win the multiplier times the difference between the high and close over the duration of the contract.","-2024955268":"If you select “Up”, you will earn a profit by closing your position when the market price is higher than the entry spot.","-1598433845":"If you select “Down”, you will earn a profit by closing your position when the market price is lower than the entry spot.","-1092777202":"The Stop-out level on the chart indicates the price at which your potential loss equals your entire stake. When the market price reaches this level, your position will be closed automatically. This ensures that your loss does not exceed the amount you paid to purchase the contract.","-885323297":"These are optional parameters for each position that you open:","-584696680":"If you select “Take profit” and specify an amount that you’d like to earn, your position will be closed automatically when your profit is more than or equals to this amount. Your profit may be more than the amount you entered depending on the market price at closing.","-178096090":"“Take profit” cannot be updated. You may update it only when “Deal cancellation” expires.","-206909651":"The entry spot is the market price when your contract is processed by our servers.","-1139774694":"<0>For Put:<1/>You will get a payout if the market price is lower than the strike price at the expiry time. Your payout will grow proportionally to the distance between the market and strike prices. You will start making a profit when the payout is higher than your stake. If the market price is equal to or above the strike price at the expiry time, there won’t be a payout.","-351875097":"Number of ticks","-138599872":"<0>For {{contract_type}}: Get a payout if {{index_name}} is {{strike_status}} than the strike price at the expiry time. Your payout is zero if the market is {{market_status}} or equal to the strike price at the expiry time. You will start making a profit when the payout is higher than your stake.","-2014059656":"higher","-149836494":"Your transaction reference number is {{transaction_id}}","-1382749084":"Go back to trading","-1231210510":"Tick","-1239477911":"second","-1585766960":"min","-1652791614":"mins","-1977959027":"hours","-8998663":"Digit: {{last_digit}} ","-1435392215":"About deal cancellation","-2017825013":"Got it","-1280319153":"Cancel your trade anytime within a chosen time-frame. Triggered automatically if your trade reaches the stop out level within the chosen time-frame.","-471757681":"Risk management","-843831637":"Stop loss","-771725194":"Deal Cancellation","-621128676":"Trade type","-45873457":"NEW","-127118348":"Choose {{contract_type}}","-543478618":"Try checking your spelling or use a different term","-338707425":"Minimum duration is 1 day","-1003473648":"Duration: {{duration}} day","-700280380":"Deal cancel. fee","-194424366":"above","-1527492178":"Purchase Locked","-725375562":"You can lock/unlock the purchase button from the Settings menu","-601992465":"Accumulate","-30171993":"Your stake will grow by {{growth_rate}}% at every tick starting from the second tick, as long as the price remains within a range of ±{{tick_size_barrier}} from the previous tick price.","-1358367903":"Stake","-1918235233":"Min. stake","-1935239381":"Max. stake","-1930565757":"Your stake is a non-refundable one-time premium to purchase this contract. Your total profit/loss equals the contract value minus your stake.","-434270664":"Current Price","-1956787775":"Barrier Price:","-1513281069":"Barrier 2","-390994177":"Should be between {{min}} and {{max}}","-2055106024":"Toggle between advanced and simple duration settings","-1012793015":"End time","-2037881712":"Your contract will be closed automatically at the next available asset price on <0>.","-629549519":"Commission <0/>","-2131859340":"Stop out <0/>","-1686280757":"<0>{{commission_percentage}}% of (<1/> * {{multiplier}})","-1043117679":"When your current loss equals or exceeds {{stop_out_percentage}}% of your stake, your contract will be closed at the nearest available asset price.","-477998532":"Your contract is closed automatically when your loss is more than or equals to this amount.","-2008947191":"Your contract is closed automatically when your profit is more than or equal to this amount.","-339236213":"Multiplier","-857660728":"Strike Prices","-119134980":"<0>{{trade_type}}: You will get a payout if the market price is {{payout_status}} this price <0>at the expiry time. Otherwise, your payout will be zero.","-243332856":"Last digit stats for latest 1000 ticks for {{ underlying_name }}","-1900883796":"<0>{{trade_type}}: You will get a payout if the market is {{payout_status}} this price <0>at the expiry time. Otherwise, your payout will be zero.","-347156282":"Submit Proof","-461955353":"purchase price","-172348735":"profit","-1624674721":"contract type","-1644154369":"entry spot time","-510792478":"entry spot price","-1974651308":"exit spot time","-1600267387":"exit spot price","-514917720":"barrier","-2004386410":"Win","-1072292603":"No Change","-1631669591":"string","-1768939692":"number","-795152863":"green","-1640576332":"blue","-804983649":"yellow","-94281841":"red","-1242470654":"Earned money","-1429914047":"Low","-1893628957":"Open Time","-1896106455":"10 minutes","-999492762":"15 minutes","-1978767852":"30 minutes","-293628675":"1 hour","-385604445":"2 hours","-1965813351":"4 hours","-525321833":"1 day","-1691868913":"Touch/No Touch","-151151292":"Asians","-1048378719":"Reset Call/Reset Put","-1282312809":"High/Low Ticks","-1237186896":"Only Ups/Only Downs","-529846150":"Seconds","-2035315547":"Low barrier","-1635771697":"middle","-1529389221":"Histogram","-1819860668":"MACD","-1750896349":"D'Alembert","-102980621":"The Oscar's Grind Strategy is a low-risk positive progression strategy that first appeared in 1965. By using this strategy, the size of your contract will increase after successful trades, but remains unchanged after unsuccessful trades.","-2002533437":"Custom function","-215053350":"with:","-1257232389":"Specify a parameter name:","-1885742588":"with: ","-188442606":"function {{ function_name }} {{ function_params }} {{ dummy }}","-313112159":"This block is similar to the one above, except that this returns a value. The returned value can be assigned to a variable of your choice.","-1783320173":"Prematurely returns a value within a function","-1485521724":"Conditional return","-1482801393":"return","-46453136":"get","-1838027177":"first","-1182568049":"Get list item","-1675454867":"This block gives you the value of a specific item in a list, given the position of the item. It can also remove the item from the list.","-381501912":"This block creates a list of items from an existing list, using specific item positions.","-426766796":"Get sub-list","-1679267387":"in list {{ input_list }} find {{ first_or_last }} occurence of item {{ input_value }}","-2087996855":"This block gives you the position of an item in a given list.","-422008824":"Checks if a given list is empty","-1343887675":"This block checks if a given list is empty. It returns “True” if the list is empty, “False” if otherwise.","-1548407578":"length of {{ input_list }}","-1786976254":"This block gives you the total number of items in a given list.","-2113424060":"create list with item {{ input_item }} repeated {{ number }} times","-1955149944":"Repeat an item","-434887204":"set","-197957473":"as","-851591741":"Set list item","-1874774866":"ascending","-1457178757":"Sorts the items in a given list","-350986785":"Sort list","-324118987":"make text from list","-155065324":"This block creates a list from a given string of text, splitting it with the given delimiter. It can also join items in a list into a string of text.","-459051222":"Create list from text","-977241741":"List Statement","-451425933":"{{ break_or_continue }} of loop","-323735484":"continue with next iteration","-1592513697":"Break out/continue","-713658317":"for each item {{ variable }} in list {{ input_list }}","-1825658540":"Iterates through a given list","-952264826":"repeat {{ number }} times","-887757135":"Repeat (2)","-1608672233":"This block is similar to the block above, except that the number of times it repeats is determined by a given variable.","-533154446":"Repeat (1)","-1059826179":"while","-1893063293":"until","-279445533":"Repeat While/Until","-1003706492":"User-defined variable","-359097473":"set {{ variable }} to {{ value }}","-1588521055":"Sets variable value","-980448436":"Set variable","-1538570345":"Get the last trade information and result, then trade again.","-222725327":"Here is where you can decide if your bot should continue trading.","-1638446329":"Result is {{ win_or_loss }}","-1968029988":"Last trade result","-1588406981":"You can check the result of the last trade with this block.","-1459154781":"Contract Details: {{ contract_detail }}","-1652241017":"Reads a selected property from contract details list","-2082345383":"These blocks transfer control to the Purchase conditions block.","-172574065":"This block will transfer the control back to the Purchase conditions block, enabling you to purchase another contract.","-403103225":"restart","-837044282":"Ask Price {{ contract_type }}","-1033917049":"This block returns the purchase price for the selected trade type.","-1863737684":"2. Purchase conditions","-228133740":"Specify contract type and purchase conditions.","-1291088318":"Purchase conditions","-1098726473":"This block is mandatory. Only one copy of this block is allowed. You can place the Purchase block (see below) here as well as conditional blocks to define your purchase conditions.","-1777988407":"Payout {{ contract_type }}","-511116341":"This block returns the potential payout for the selected trade type","-1943211857":"Potential payout","-813464969":"buy","-53668380":"True if active contract can be sold before expiration at current market price","-43337012":"Sell profit/loss","-2112866691":"Returns the profit/loss from selling at market price","-2132417588":"This block gives you the potential profit or loss if you decide to sell your contract.","-1360483055":"set {{ variable }} to Bollinger Bands {{ band_type }} {{ dummy }}","-20542296":"Calculates Bollinger Bands (BB) from a list with a period","-1951109427":"Bollinger Bands (BB)","-857226052":"BB is a technical analysis indicator that’s commonly used by traders. The idea behind BB is that the market price stays within the upper and lower bands for 95% of the time. The bands are the standard deviations of the market price, while the line in the middle is a simple moving average line. If the price reaches either the upper or lower band, there’s a possibility of a trend reversal.","-325196350":"set {{ variable }} to Bollinger Bands Array {{ band_type }} {{ dummy }}","-199689794":"Similar to BB. This block gives you a choice of returning the values of either the lower band, higher band, or the SMA line in the middle.","-920690791":"Calculates Exponential Moving Average (EMA) from a list with a period","-960641587":"EMA is a type of moving average that places more significance on the most recent data points. It’s also known as the exponentially weighted moving average. EMA is different from SMA in that it reacts more significantly to recent price changes.","-1557584784":"set {{ variable }} to Exponential Moving Average Array {{ dummy }}","-32333344":"Calculates Moving Average Convergence Divergence (MACD) from a list","-628573413":"MACD is calculated by subtracting the long-term EMA (26 periods) from the short-term EMA (12 periods). If the short-term EMA is greater or lower than the long-term EMA than there’s a possibility of a trend reversal.","-1133676960":"Fast EMA Period {{ input_number }}","-883166598":"Period {{ input_period }}","-450311772":"set {{ variable }} to Relative Strength Index {{ dummy }}","-1861493523":"Calculates Relative Strength Index (RSI) list from a list of values with a period","-880048629":"Calculates Simple Moving Average (SMA) from a list with a period","-1150972084":"Market direction","-276935417":"This block is used to determine if the market price moves in the selected direction or not. It gives you a value of “True” or “False”.","-764931948":"in candle list get # from end {{ input_number }}","-924607337":"Returns the last digit of the latest tick","-560033550":"Returns the list of last digits of 1000 recent tick values","-74062476":"Make a List of {{ candle_property }} values in candles list with interval: {{ candle_interval_type }}","-1556495906":"Returns a list of specific values from a candle list according to selected time interval","-166816850":"Create a list of candle values (1)","-1261436901":"Candles List","-1174859923":"Read the selected candle value","-1972165119":"Read candle value (1)","-1956100732":"You can use this block to analyze the ticks, regardless of your trades","-443243232":"The content of this block is called on every tick. Place this block outside of any root block.","-641399277":"Last Tick","-1628954567":"Returns the value of the last tick","-1332756793":"This block gives you the value of the last tick.","-2134440920":"Last Tick String","-1466340125":"Tick value","-467913286":"Tick value Description","-785831237":"This block gives you a list of the last 1000 tick values.","-1546430304":"Tick List String Description","-1788626968":"Returns \"True\" if the given candle is black","-436010611":"Make a list of {{ candle_property }} values from candles list {{ candle_list }}","-1384340453":"Returns a list of specific values from a given candle list","-584859539":"Create a list of candle values (2)","-2010558323":"Read {{ candle_property }} value in candle {{ input_candle }}","-2846417":"This block gives you the selected candle value.","-1587644990":"Read candle value (2)","-1202212732":"This block returns account balance","-1737837036":"Account balance","-1963883840":"Put your blocks in here to prevent them from being removed","-1284013334":"Use this block if you want some instructions to be ignored when your bot runs. Instructions within this block won’t be executed.","-1217253851":"Log","-1987568069":"Warn","-104925654":"Console","-1956819233":"This block displays messages in the developer's console with an input that can be either a string of text, a number, boolean, or an array of data.","-1450461842":"Load block from URL: {{ input_url }}","-1088614441":"Loads blocks from URL","-1747943728":"Loads from URL","-2105753391":"Notify Telegram {{ dummy }} Access Token: {{ input_access_token }} Chat ID: {{ input_chat_id }} Message: {{ input_message }}","-1008209188":"Sends a message to Telegram","-1218671372":"Displays a notification and optionally play selected sound","-2099284639":"This block gives you the total profit/loss of your trading strategy since your bot started running. You can reset this by clicking “Clear stats” on the Transaction Stats window, or by refreshing this page in your browser.","-683825404":"Total Profit String","-718220730":"Total Profit String Description","-1861858493":"Number of runs","-264195345":"Returns the number of runs","-303451917":"This block gives you the total number of times your bot has run. You can reset this by clicking “Clear stats” on the Transaction Stats window, or by refreshing this page in your browser.","-2132861129":"Conversion Helper Block","-74095551":"Seconds Since Epoch","-15528039":"Returns the number of seconds since January 1st, 1970","-729807788":"This block returns the number of seconds since January 1st, 1970.","-1370107306":"{{ dummy }} {{ stack_input }} Run after {{ number }} second(s)","-558838192":"Delayed run","-1975250999":"This block converts the number of seconds since the Unix Epoch (1 January 1970) into a string of text representing the date and time.","-702370957":"Convert to date/time","-982729677":"Convert to timestamp","-311268215":"This block converts a string of text that represents the date and time into seconds since the Unix Epoch (1 January 1970). The time and time zone offset are optional. Example: 2019-01-01 21:03:45 GMT+0800 will be converted to 1546347825.","-1797602591":"Stop Loss: {{ currency }} {{ stop_loss }}","-1214929127":"Stop loss must be a positive number.","-780745489":"If the contract type is “Both”, then the Purchase Conditions should include both Rise and Fall using the “Conditional Block\"","-2142851225":"Multiplier trade options","-625636913":"Amount must be a positive number.","-1466383897":"Duration: {{ duration_unit }} {{ duration_value }}","-440702280":"Trade options","-1193894978":"Define your trade options such as duration and stake. Some options are only applicable for certain trade types.","-46523443":"Duration value is not allowed. To run the bot, please enter a value between {{min}} to {{max}}.","-1483427522":"Trade Type: {{ trade_type_category }} > {{ trade_type }}","-323348124":"1. Trade parameters","-1671903503":"Run once at start:","-783173909":"Trade options:","-376956832":"Here is where you define the parameters of your contract.","-1244007240":"if {{ condition }} then","-1577206704":"else if","-33796979":"true","-1434883449":"This is a single block that returns a boolean value, either true or false.","-1946404450":"Compares two values","-979918560":"This block converts the boolean value (true or false) to its opposite.","-2047257743":"Null","-1274387519":"Performs selected logic operation","-766386234":"This block performs the \"AND\" or the \"OR\" logic operation.","-790995537":"test {{ condition }}","-1860211657":"if false {{ return_value }}","-1643760249":"This block tests if a given value is true or false and returns “True” or “False” accordingly.","-1551875333":"Test value","-52486882":"Arithmetical operations","-1010436425":"This block adds the given number to the selected variable","-999773703":"Change variable","-1272091683":"Mathematical constants","-1396629894":"constrain {{ number }} low {{ low_number }} high {{ high_number }}","-425224412":"This block constrains a given number so that it is within a set range.","-2072551067":"Constrain within a range","-43523220":"remainder of {{ number1 }} ÷ {{ number2 }}","-1291857083":"Returns the remainder after a division","-592154850":"Remainder after division","-736665095":"Returns the remainder after the division of the given numbers.","-1266992960":"Math Number Description","-77191651":"{{ number }} is {{ type }}","-817881230":"even","-142319891":"odd","-1000789681":"whole","-1735674752":"Test a number","-1017805068":"This block tests a given number according to the selection and it returns a value of “True” or “False”. Available options: Even, Odd, Prime, Whole, Positive, Negative, Divisible","-1858332062":"Number","-1053492479":"Enter an integer or fractional number into this block. Please use `.` as a decimal separator for fractional numbers.","-927097011":"sum","-1653202295":"max","-1555878023":"average","-1748351061":"mode","-992067330":"Aggregate operations","-1691561447":"This block gives you a random fraction between 0.0 to 1.0","-523625686":"Random fraction number","-933024508":"Rounds a given number to an integer","-1656927862":"This block rounds a given number according to the selection: round, round up, round down.","-1495304618":"absolute","-61210477":"Operations on a given number","-181644914":"This block performs the selected operations to a given number.","-840732999":"to {{ variable }} append text {{ input_text }}","-1469497908":"Appends a given text to a variable","-1851366276":"Text Append","-1666316828":"Appends a given text to a variable.","-1902332770":"Transform {{ input_text }} to {{ transform_type }}","-1489004405":"Title Case","-904432685":"Changes text case accordingly","-882381096":"letter #","-1027605069":"letter # from end","-2066990284":"random letter","-337089610":"in text {{ input_text1 }} find {{ first_or_last }} occurence of text {{ input_text2 }}","-1966694141":"Searches through a string of text for a specific occurrence of a given character or word, and returns the position.","-697543841":"Text join","-141160667":"length of {{ input_text }}","-1133072029":"Text String Length","-1109723338":"print {{ input_text }}","-736668830":"Print","-1821552998":"trim spaces from {{ side }} of {{ input_text }}","-801766026":"right side","-474779821":"Trims spaces","-1219239717":"One or more mandatory blocks are missing from your workspace. Please add the required block(s) and then try again.","-250761331":"One or more mandatory blocks are disabled in your workspace. Please enable the required block(s) and then try again.","-1687036846":"Download block","-1266781295":"Expand","-894560707":"function","-1867119688":"Duplicate","-610728049":"Rearrange Vertically","-2033146714":"Collapse All Blocks","-958601558":"Delete Block","-1193267384":"Detach Block","-1750478127":"New variable name","-1061878051":"Y","-2047029150":"Unable to load the block file.","-1410769167":"Target must be an XML file","-609157479":"This URL is already loaded","-241945454":"Proposals are not ready","-1087890592":"Maximum loss amount reached","-1030545878":"You are rate limited for: {{ message_type }}, retrying in {{ delay }}s (ID: {{ request }})","-490766438":"You are disconnected, retrying in {{ delay }}s","-1389975609":"unknown","-1900515692":"Duration must be a positive integer","-245297595":"Please login","-1445046468":"Given candle is not valid","-1891622945":"{{hourPast}}h ago","-538215347":"Net deposits","-280147477":"All transactions","-130601012":"Please select duration","-232254547":"Custom","-1577570698":"Start date","-1251526905":"Last 7 days","-1904030160":"Transaction performed by (App ID: {{app_id}})","-513103225":"Transaction time","-2066666313":"Credit/Debit","-2140412463":"Buy price","-1981004241":"Sell time","-600828210":"Indicative profit/loss","-706219815":"Indicative price","-3423966":"Take profit<0 />Stop loss","-2082644096":"Current stake","-1131753095":"The {{trade_type_name}} contract details aren't currently available. We're working on making them available soon.","-360975483":"You've made no transactions of this type during this period.","-740395276":"I don’t have any of these","-2092611555":"Sorry, this app is unavailable in your current location.","-1488537825":"If you have an account, log in to continue.","-555592125":"Unfortunately, trading options isn't possible in your country","-1571816573":"Sorry, trading is unavailable in your current location.","-1603581277":"minutes","-922253974":"Rise/Fall","-1361254291":"Higher/Lower","-335816381":"Ends In/Ends Out","-1789807039":"Asian Up/Asian Down","-330437517":"Matches/Differs","-657360193":"Over/Under","-558031309":"High Tick/Low Tick","-123659792":"Vanillas","-1714959941":"This chart display is not ideal for tick contracts","-1254554534":"Please change the chart duration to tick for a better trading experience.","-1658230823":"Contract was sold for <0 />.","-1905867404":"Contract cancelled"} \ No newline at end of file +{"0":"","1014140":"You may also call <0>+447723580049 to place your complaint.","1485191":"1:1000","3125515":"Your Deriv MT5 password is for logging in to your Deriv MT5 accounts on the desktop, web, and mobile apps.","3215342":"Last 30 days","3420069":"To avoid delays, enter your <0>name and <0>date of birth exactly as they appear on your identity document.","7100308":"Hour must be between 0 and 23.","11539750":"set {{ variable }} to Relative Strength Index Array {{ dummy }}","11872052":"Yes, I'll come back later","14365404":"Request failed for: {{ message_type }}, retrying in {{ delay }}s","15377251":"Profit amount: {{profit}}","17843034":"Check proof of identity document verification status","19424289":"Username","19552684":"USD Basket","21035405":"Please tell us why you’re leaving. (Select up to {{ allowed_reasons }} reasons.)","24900606":"Gold Basket","25854018":"This block displays messages in the developer’s console with an input that can be either a string of text, a number, boolean, or an array of data.","26566655":"Summary","26596220":"Finance","27582767":"{{amount}} {{currency}}","27731356":"Your account is temporarily disabled. Please contact us via <0>live chat to enable deposits and withdrawals again.","27830635":"Deriv (V) Ltd","28581045":"Add a real MT5 account","30801950":"Your account will be opened with {{legal_entity_name}}, regulated by the Malta Gaming Authority, and will be subject to the laws of Malta.","33433576":"Please use an e-wallet to withdraw your funds.","35089987":"Upload the front and back of your driving licence.","41737927":"Thank you","44877997":"Residence permit","45453595":"Binary Coin","45941470":"Where would you like to start?","46523711":"Your proof of identity is verified","49963458":"Choose an option","50200731":"FX majors (standard/micro lots), FX minors, basket indices, commodities, and cryptocurrencies","53801223":"Hong Kong 50","53964766":"5. Hit Save to download your bot. You can choose to download your bot to your device or your Google Drive.","54185751":"Less than $100,000","55340304":"Keep your current contract?","55916349":"All","58254854":"Scopes","59169515":"If you select \"Asian Rise\", you will win the payout if the last tick is higher than the average of the ticks.","59341501":"Unrecognized file format","59662816":"Stated limits are subject to change without prior notice.","62748351":"List Length","63869411":"This block tests a given number according to the selection","64402604":"Check transfer information","65185694":"Fiat onramp","65982042":"Total","66519591":"Investor password","68885999":"Repeats the previous trade when an error is encountered.","69005593":"The example below restarts trading after 30 or more seconds after 1 minute candle was started.","71016232":"OMG/USD","71445658":"Open","71563326":"A fast and secure fiat-to-crypto payment service. Deposit cryptocurrencies from anywhere in the world using your credit/debit cards and bank transfers.","71853457":"$100,001 - $500,000","72500774":"Please fill in Tax residence.","73086872":"You have self-excluded from trading","73326375":"The low is the lowest point ever reached by the market during the contract period.","74963864":"Under","76916358":"You have reached the withdrawal limit.<0/>Please upload your proof of identity and address to lift the limit to continue your withdrawal.","77945356":"Trade on the go with our mobile app.","81450871":"We couldn’t find that page","82839270":"Upload the page of your passport that contains your photo.","83202647":"Collapse Block","84402478":"Where do I find the blocks I need?","85343079":"Financial assessment","85359122":"40 or more","85389154":"Steps required to continue verification on your mobile","89062902":"Trade on MT5","90266322":"2. Start a chat with your newly created Telegram bot and make sure to send it some messages before proceeding to the next step. (e.g. Hello Bot!)","91993812":"The Martingale Strategy is a classic trading technique that has been used for more than a hundred years, popularised by the French mathematician Paul Pierre Levy in the 18th century.","93154671":"1. Hit Reset at the bottom of stats panel.","96381225":"ID verification failed","98473502":"We’re not obliged to conduct an appropriateness test, nor provide you with any risk warnings.","98972777":"random item","100239694":"Upload front of card from your computer","102226908":"Field cannot be empty","108916570":"Duration: {{duration}} days","109073671":"Please use an e-wallet that you have used for deposits previously. Ensure the e-wallet supports withdrawal. See the list of e-wallets that support withdrawals <0>here.","111215238":"Move away from direct light","111718006":"End date","111931529":"Max. total stake over 7 days","113378532":"ETH/USD","115032488":"Buy price and P/L","116005488":"Indicators","117318539":"Password should have lower and uppercase English letters with numbers.","118586231":"Document number (identity card, passport)","119261701":"Prediction:","119446122":"Contract type is not selected","120340777":"Complete your personal details","123454801":"{{withdraw_amount}} {{currency_symbol}}","124723298":"Upload a proof of address to verify your address","125443840":"6. Restart last trade on error","127307725":"A politically exposed person (PEP) is someone appointed with a prominent public position. Close associates and family members of a PEP are also considered to be PEPs.","129729742":"Tax Identification Number*","130567238":"THEN","132596476":"In providing our services to you, we are required to ask you for some information to assess if a given product or service is appropriate for you and whether you have the experience and knowledge to understand the risks involved.<0/><0/>","132689841":"Trade on web terminal","133523018":"Please go to the Deposit page to get an address.","133536621":"and","133655768":"Note: If you wish to learn more about the Bot Builder, you can proceed to the <0>Tutorials tab.","139454343":"Confirm my limits","141265840":"Funds transfer information","141626595":"Make sure your device has a working camera","142050447":"set {{ variable }} to create text with","142390699":"Connected to your mobile","143970826":"Payment problems?","145146541":"Our accounts and services are unavailable for the Jersey postal code","145736466":"Take a selfie","150486954":"Token name","151344063":"The exit spot is the market price when the contract is closed.","151646545":"Unable to read file {{name}}","152415091":"Math","152524253":"Trade the world’s markets with our popular user-friendly platform.","154545319":"Country of residence is where you currently live.","157593038":"random integer from {{ start_number }} to {{ end_number }}","158373715":"Exit tour","160746023":"Tether as an Omni token (USDT) is a version of Tether that is hosted on the Omni layer on the Bitcoin blockchain.","160863687":"Camera not detected","162080773":"For Put","164112826":"This block allows you to load blocks from a URL if you have them stored on a remote server, and they will be loaded only when your bot runs.","164564432":"Deposits are temporarily unavailable due to system maintenance. You can make your deposits when the maintenance is complete.","165294347":"Please set your country of residence in your account settings to access the cashier.","165312615":"Continue on phone","165682516":"If you don’t mind sharing, which other trading platforms do you use?","170185684":"Ignore","170244199":"I’m closing my account for other reasons.","171307423":"Recovery","171579918":"Go to Self-exclusion","171638706":"Variables","173991459":"We’re sending your request to the blockchain.","174793462":"Strike","176078831":"Added","176319758":"Max. total stake over 30 days","176654019":"$100,000 - $250,000","177099483":"Your address verification is pending, and we’ve placed some restrictions on your account. The restrictions will be lifted once your address is verified.","178413314":"First name should be between 2 and 50 characters.","179083332":"Date","179737767":"Our legacy options trading platform.","181346014":"Notes ","181881956":"Contract Type: {{ contract_type }}","184024288":"lower case","189705706":"This block uses the variable \"i\" to control the iterations. With each iteration, the value of \"i\" is determined by the items in a given list.","189759358":"Creates a list by repeating a given item","190834737":"Guide","191372501":"Accumulation of Income/Savings","192436105":"No need for symbols, digits, or uppercase letters","192573933":"Verification complete","195972178":"Get character","196998347":"We hold customer funds in bank accounts separate from our operational accounts which would not, in the event of insolvency, form part of the company's assets. This meets the <0>Gambling Commission's requirements for the segregation of customer funds at the level: <1>medium protection.","197190401":"Expiry date","201091938":"30 days","203179929":"<0>You can open this account once your submitted documents have been verified.","203271702":"Try again","203297887":"The Quick Strategy you just created will be loaded to the workspace.","204797764":"Transfer to client","204863103":"Exit time","206010672":"Delete {{ delete_count }} Blocks","207824122":"Please withdraw your funds from the following Deriv account(s):","209533725":"You’ve transferred {{amount}} {{currency}}","210385770":"If you have an active account, please log in to continue. Otherwise, please sign up.","211224838":"Investment","211461880":"Common names and surnames are easy to guess","211847965":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable withdrawals.","216650710":"You are using a demo account","217403651":"St. Vincent & Grenadines","217504255":"Financial assessment submitted successfully","218441288":"Identity card number","220014242":"Upload a selfie from your computer","220186645":"Text Is empty","220232017":"demo CFDs","223120514":"In this example, each point of the SMA line is an arithmetic average of close prices for the last 50 days.","223607908":"Last digit stats for latest 1000 ticks for {{underlying_name}}","224650827":"IOT/USD","224929714":"Virtual events based bets in the UK and the Isle of Man are offered by {{legal_entity_name}}, Millennium House, Level 1, Victoria Road, Douglas IM2 4RW, Isle of Man, licensed and regulated in Great Britain by the Gambling Commission under <0>account no. 39172 and by the Gambling Supervision Commission in the Isle of Man (<1>view licence).","225887649":"This block is mandatory. It's added to your strategy by default when you create new strategy. You can not add more than one copy of this block to the canvas.","227591929":"To timestamp {{ input_datetime }} {{ dummy }}","227903202":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts.","228079844":"Click here to upload","228521812":"Tests whether a string of text is empty. Returns a boolean value (true or false).","229355215":"Trade on {{platform_name_dbot}}","233500222":"- High: the highest price","235583807":"SMA is a frequently used indicator in technical analysis. It calculates the average market price over a specified period, and is usually used to identify market trend direction: up or down. For example, if the SMA is moving upwards, it means the market trend is up. ","236642001":"Journal","238496287":"Leverage trading is high-risk, so it's a good idea to use risk management features such as stop loss. Stop loss allows you to","243537306":"1. Under the Blocks menu, go to Utility > Variables.","243614144":"This is only available for existing clients.","245005091":"lower","245187862":"The DRC will make a <0>decision on the complaint (please note that the DRC mentions no timeframe for announcing its decision).","245812353":"if {{ condition }} return {{ value }}","247418415":"Gaming trading can become a real addiction, as can any other activity pushed to its limits. To avoid the danger of such an addiction, we provide a reality-check that gives you a summary of your trades and accounts on a regular basis.","248565468":"Check your {{ identifier_title }} account email and click the link in the email to proceed.","248909149":"Send a secure link to your phone","251134918":"Account Information","251322536":"Deriv EZ accounts","251445658":"Dark theme","251882697":"Thank you! Your response has been recorded into our system.<0/><0/>Please click ‘OK’ to continue.","254912581":"This block is similar to EMA, except that it gives you the entire EMA line based on the input list and the given period.","256031314":"Cash Business","256602726":"If you close your account:","258448370":"MT5","258912192":"Trading assessment","260069181":"An error occured while trying to load the URL","260086036":"Place blocks here to perform tasks once when your bot starts running.","260361841":"Tax Identification Number can't be longer than 25 characters.","261074187":"4. Once the blocks are loaded onto the workspace, tweak the parameters if you want, or hit Run to start trading.","261250441":"Drag the <0>Trade again block and add it into the <0>do part of the <0>Repeat until block.","264976398":"3. 'Error' displays a message in red to highlight something that needs to be resolved immediately.","265644304":"Trade types","267992618":"The platforms lack key features or functionality.","268940240":"Your balance ({{format_balance}} {{currency}}) is less than the current minimum withdrawal allowed ({{format_min_withdraw_amount}} {{currency}}). Please top up your account to continue with your withdrawal.","269322978":"Deposit with your local currency via peer-to-peer exchange with fellow traders in your country.","269607721":"Upload","270339490":"If you select \"Over\", you will win the payout if the last digit of the last tick is greater than your prediction.","270610771":"In this example, the open price of a candle is assigned to the variable \"candle_open_price\".","270712176":"descending","270780527":"You've reached the limit for uploading your documents.","272042258":"When you set your limits, they will be aggregated across all your account types in {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} and {{platform_name_bbot}} on Deriv. For example, the losses made on all four platforms will add up and be counted towards the loss limit you set.","272179372":"This block is commonly used to adjust the parameters of your next trade and to implement stop loss/take profit logic.","273350342":"Copy and paste the token into the app.","273728315":"Should not be 0 or empty","274268819":"Volatility 100 Index","275116637":"Deriv X","277469417":"Exclude time cannot be for more than five years.","278684544":"get sub-list from # from end","282319001":"Check your image","282564053":"Next, we'll need your proof of address.","283830551":"Your address doesn’t match your profile","283986166":"Self-exclusion on the website only applies to your {{brand_website_name}} account and does not include other companies or websites.","284527272":"antimode","284772879":"Contract","284809500":"Financial Demo","287934290":"Are you sure you want to cancel this transaction?","289898640":"TERMS OF USE","291744889":"<0>1. Trade parameters:<0>","291817757":"Go to our Deriv community and learn about APIs, API tokens, ways to use Deriv APIs, and more.","292491635":"If you select “Stop loss” and specify an amount to limit your loss, your position will be closed automatically when your loss is more than or equals to this amount. Your loss may be more than the amount you entered depending on the market price at closing.","292526130":"Tick and candle analysis","292589175":"This will display the SMA for the specified period, using a candle list.","292887559":"Transfer to {{selected_value}} is not allowed, Please choose another account from dropdown","294305803":"Manage account settings","294335229":"Sell at market price","301441673":"Select your citizenship/nationality as it appears on your passport or other government-issued ID.","301472132":"Hi! Hit <0>Start for a quick tour to help you get started.","303959005":"Sell Price:","304309961":"We're reviewing your withdrawal request. You may still cancel this transaction if you wish. Once we start processing, you won't be able to cancel.","307971599":"<0>For Call:<1/>You will get a payout if the market price is higher than the strike price at the expiry time. Your payout will grow proportionally to the distance between the market and strike prices. You will start making a profit when the payout is higher than your stake. If the market price is equal to or below the strike price at the expiry time, there won’t be a payout.","308070472":"Can I trade cryptocurrencies on DBot?","310234308":"Close all your positions.","312142140":"Save new limits?","312300092":"Trims the spaces within a given string or text.","313298169":"Our cashier is temporarily down due to system maintenance. You can access the Cashier in a few minutes when the maintenance is complete.","313741895":"This block returns “True” if the last candle is black. It can be placed anywhere on the canvas except within the Trade parameters root block.","315306603":"You have an account that do not have currency assigned. Please choose a currency to trade with this account.","316694303":"Is candle black?","318865860":"close","318984807":"This block repeats the instructions contained within for a specific number of times.","323179846":"The time interval for each candle can be set from one minute to one day.","323209316":"Select a Deriv Bot Strategy","323360883":"Baskets","325662004":"Expand Block","325763347":"result","326770937":"Withdraw {{currency}} ({{currency_symbol}}) to your wallet","327534692":"Duration value is not allowed. To run the bot, please enter {{min}}.","328539132":"Repeats inside instructions specified number of times","329353047":"Malta Financial Services Authority (MFSA) (licence no. IS/70156)","329404045":"<0>Switch to your real account<1> to create a {{platform}} {{account_title}} account.","333121115":"Select Deriv MT5's account type","333456603":"Withdrawal limits","333807745":"Click on the block you want to remove and press Delete on your keyboard.","334680754":"Switch to your real account to create a Deriv MT5 account","334942497":"Buy time","335040248":"About us","337023006":"Start time cannot be in the past.","339449279":"Remaining time","339610914":"Spread Up/Spread Down","339879944":"GBP/USD","340807218":"Description not found.","342181776":"Cancel transaction","343873723":"This block displays a message. You can specify the color of the message and choose from 6 different sound options.","344418897":"These trading limits and self-exclusion help you control the amount of money and time you spend on {{brand_website_name}} and exercise <0>responsible trading.","345320063":"Invalid timestamp","345818851":"Sorry, an internal error occurred. Hit the above checkbox to try again.","347029309":"Forex: standard/micro","347039138":"Iterate (2)","348951052":"Your cashier is currently locked","349047911":"Over","349110642":"<0>{{payment_agent}}<1>'s contact details","350602311":"Stats show the history of consecutive tick counts, i.e. the number of ticks the price remained within range continuously.","351744408":"Tests if a given text string is empty","352363702":"You may see links to websites with a fake Deriv login page where you’ll get scammed for your money.","353731490":"Job done","354945172":"Submit document","357477280":"No face found","359053005":"Please enter a token name.","359649435":"Given candle list is not valid","359809970":"This block gives you the selected candle value from a list of candles within the selected time interval. You can choose from open price, close price, high price, low price, and open time.","360224937":"Logic","360773403":"Bot Builder","362772494":"This should not exceed {{max}} characters.","362946954":"Our legacy automated trading platform.","363576009":"- High price: the highest price","363738790":"Browser","363990763":"Sell price:","367801124":"Total assets in your Deriv accounts.","368160866":"in list","369035361":"<0>•Your account number","371151609":"Last used","371710104":"This scope will allow third-party apps to buy and sell contracts for you, renew your expired purchases, and top up your demo accounts.","372291654":"Exclude time must be after today.","372645383":"True if the market direction matches the selection","373021397":"random","373306660":"{{label}} is required.","373495360":"This block returns the entire SMA line, containing a list of all values for a given period.","374537470":"No results for \"{{text}}\"","375714803":"Deal Cancellation Error","379523479":"To avoid loss of funds, do not share tokens with the Admin scope with unauthorised parties.","380606668":"tick","380694312":"Maximum consecutive trades","384303768":"This block returns \"True\" if the last candle is black. It can be placed anywhere on the canvas except within the Trade parameters root block.","386191140":"You can choose between CFD trading accounts or Options and Multipliers accounts","386278304":"Install the {{platform_name_trader}} web app","386502387":"Bot is not running","389923099":"Zoom in","390647540":"Real account","390890891":"Last quarter","391915203":"Hedging","392582370":"Fall Equals","393789743":"Letters, spaces, periods, hyphens, apostrophes only.","396418990":"Offline","396801529":"To start trading, top-up funds from your Deriv account into this account.","396961806":"We do not support Polygon (Matic), to deposit please use only Ethereum ({{token}}).","398816980":"Launch {{platform_name_trader}} in seconds the next time you want to trade.","401339495":"Verify address","402343402":"Due to an issue on our server, some of your {{platform}} accounts are unavailable at the moment. Please bear with us and thank you for your patience.","403456289":"The formula for SMA is:","404743411":"Total deposits","406359555":"Contract details","406497323":"Sell your active contract if needed (optional)","408477401":"We’ve also limited the maximum duration for every contract, and it differs according to the accumulator value that you choose. Your contract will be closed automatically when the maximum duration is reached.","411482865":"Add {{deriv_account}} account","412433839":"I agree to the <0>terms and conditions.","413594348":"Only letters, numbers, space, hyphen, period, and forward slash are allowed.","416296716":"Maximum payout","417714706":"If your margin level drops below our stop out level, your positions may be closed automatically to protect you from further losses.","417864079":"You’ll not be able to change currency once you have made a deposit.","418265501":"Demo Derived","419485005":"Spot","419736603":"If yes, go to <0>Tutorials.","420072489":"CFD trading frequency","422055502":"From","424272085":"We take your financial well-being seriously and want to ensure you are fully aware of the risks before trading.<0/><0/>","424897068":"Do you understand that you could potentially lose 100% of the money you use to trade?","426031496":"Stop","427134581":"Try using another file type.","427617266":"Bitcoin","428709688":"Your preferred time interval between each report:","430975601":"Town/City is not in a proper format.","432273174":"1:100","432508385":"Take Profit: {{ currency }} {{ take_profit }}","432519573":"Document uploaded","433348384":"Real accounts are not available to politically exposed persons (PEPs).","433616983":"2. Investigation phase","434548438":"Highlight function definition","434896834":"Custom functions","436364528":"Your account will be opened with {{legal_entity_name}}, and will be subject to the laws of Saint Vincent and the Grenadines.","437138731":"Create a new {{platform}} password","437453244":"Choose your preferred cryptocurrency","437485293":"File type not supported","437904704":"Maximum open positions","438067535":"Over $500,000","442520703":"$250,001 - $500,000","443203714":"Your contract will be closed automatically if your loss reaches this amount.","443559872":"Financial SVG","444484637":"Logic negation","445419365":"1 - 2 years","450983288":"Your deposit is unsuccessful due to an error on the blockchain. Please contact your crypto wallet service provider for more info.","451852761":"Continue on your phone","452054360":"Similar to RSI, this block gives you a list of values for each entry in the input list.","453175851":"Your MT5 Financial STP account will be opened through {{legal_entity_name}}. All trading in this account is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA). None of your other accounts, including your Deriv account, is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA).","453409608":"Your profit is the percentage change in market price times your stake and the multiplier of your choice.","454196938":"Regulation:","454593402":"2. Please upload one of the following:","456746157":"Grant access to your camera from your browser settings","457020083":"It’ll take longer to verify you if we can’t read it","457494524":"1. From the block library, enter a name for the new variable and click Create.","459612953":"Select account","459817765":"Pending","460070238":"Congratulations","460975214":"Complete your Appropriateness Test","461795838":"Please contact us via live chat to unlock it.","462079779":"Resale not offered","463361726":"Select an item","465993338":"Oscar's Grind","466369320":"Your gross profit is the percentage change in market price times your stake and the multiplier chosen here.","466837068":"Yes, increase my limits","467839232":"I trade forex CFDs and other complex financial instruments regularly on other platforms.","473154195":"Settings","474306498":"We’re sorry to see you leave. Your account is now closed.","475492878":"Try Synthetic Indices","476023405":"Didn't receive the email?","477557241":"Remote blocks to load must be a collection.","478280278":"This block displays a dialog box that uses a customised message to prompt for an input. The input can be either a string of text or a number and can be assigned to a variable. When the dialog box is displayed, your strategy is paused and will only resume after you enter a response and click \"OK\".","479420576":"Tertiary","480356486":"*Boom 300 and Crash 300 Index","481276888":"Goes Outside","483279638":"Assessment Completed<0/><0/>","483591040":"Delete all {{ delete_count }} blocks?","485379166":"View transactions","487239607":"Converts a given True or False to the opposite value","488150742":"Resend email","489768502":"Change investor password","491603904":"Unsupported browser","492198410":"Make sure everything is clear","492566838":"Taxpayer identification number","497518317":"Function that returns a value","498144457":"A recent utility bill (e.g. electricity, water or gas)","498562439":"or","499522484":"1. for \"string\": 1325.68 USD","500855527":"Chief Executives, Senior Officials and Legislators","500920471":"This block performs arithmetic operations between two numbers.","501401157":"You are only allowed to make deposits","501537611":"*Maximum number of open positions","502007051":"Demo Swap-Free SVG","502041595":"This block gives you a specific candle from within the selected time interval.","503137339":"Payout limit","505793554":"last letter","508390614":"Demo Financial STP","510815408":"Letters, numbers, spaces, hyphens only","514031715":"list {{ input_list }} is empty","514776243":"Your {{account_type}} password has been changed.","514948272":"Copy link","518955798":"7. Run Once at Start","520136698":"Boom 500 Index","521872670":"item","522283618":"Digital options trading experience","522703281":"divisible by","523123321":"- 10 to the power of a given number","524459540":"How do I create variables?","527329988":"This is a top-100 common password","529056539":"Options","529597350":"If you had any open positions, we have closed them and refunded you.","530953413":"Authorised applications","531114081":"3. Contract Type","531675669":"Euro","535041346":"Max. total stake per day","538017420":"0.5 pips","538228086":"Close-Low","541650045":"Manage {{platform}} password","541700024":"First, enter your driving licence number and the expiry date.","542038694":"Only letters, numbers, space, underscore, and hyphen are allowed for {{label}}.","542305026":"You must also submit a proof of identity.","543413346":"You have no open positions for this asset. To view other open positions, click Go to Reports","543915570":"Forex, stocks, stock indices, cryptocurrencies, synthetic indices","545476424":"Total withdrawals","546534357":"If you select “Deal cancellation”, you’ll be able to cancel your trade within a chosen time frame should the market move against your favour. We’ll charge a small fee for this, but we’ll return your stake amount without profit or loss. If the stop-out amount is reached before the deal cancellation expires, your position will be cancelled automatically and we’ll return your stake amount without profit or loss. While “Deal cancellation” is active:","549479175":"Deriv Multipliers","550589723":"Your stake will grow at {{growth_rate}}% per tick as long as the current spot price remains within ±{{tick_size_barrier}} from the previous spot price.","551569133":"Learn more about trading limits","554135844":"Edit","554410233":"This is a top-10 common password","555351771":"After defining trade parameters and trade options, you may want to instruct your bot to purchase contracts when specific conditions are met. To do that you can use conditional blocks and indicators blocks to help your bot to make decisions.","555881991":"National Identity Number Slip","556264438":"Time interval","559224320":"Our classic “drag-and-drop” tool for creating trading bots, featuring pop-up trading charts, for advanced users.","561982839":"Change your currency","562599414":"This block returns the purchase price for the selected trade type. This block can be used only in the \"Purchase conditions\" root block.","563034502":"We shall try to resolve your complaint within 15 business days. We will inform you of the outcome together with an explanation of our position and propose any remedial measures we intend to take.","563166122":"We shall acknowledge receiving your complaint, review it carefully, and keep you updated on the handling process. We might request further information or clarifications to facilitate the resolution of the complaint.","563652273":"Go to block","565410797":"The below image illustrates how Simple Moving Average Array block works:","566274201":"1. Market","567019968":"A variable is among the most important and powerful components in creating a bot. It is a way to store information, either as text or numbers. The information stored as a variable can be used and changed according to the given instructions. Variables can be given any name, but usually they are given useful, symbolic names so that it is easier to call them during the execution of instructions.","567163880":"Create a {{platform}} password","567755787":"Tax Identification Number is required.","569057236":"In which country was your document issued?","571921777":"Funds protection level","572576218":"Languages","573173477":"Is candle {{ input_candle }} black?","576355707":"Select your country and citizenship:","577215477":"count with {{ variable }} from {{ start_number }} to {{ end_number }} by {{ step_size }}","577779861":"Withdrawal","577883523":"4. Awards and orders","578640761":"Call Spread","579529868":"Show all details — including the bottom 2 lines","580431127":"Restart buy/sell on error (disable for better performance): {{ checkbox }}","580665362":"Stays In/Goes Out","580774080":"insert at","581168980":"Legal","582945649":"2 minutes","584028307":"Allow equals","587577425":"Secure my account","587856857":"Want to know more about APIs?","588609216":"Repeat tour","590508080":"If you select “Take profit” and specify an amount that you’d like to earn, your position will be closed automatically when your profit is more than or equal to this amount. Your profit may be more than the amount you entered depending on the market price (and accumulator value) at closing.","592087722":"Employment status is required.","593459109":"Try a different currency","595080994":"Example: CR123456789","595136687":"Save Strategy","597089493":"Here is where you can decide to sell your contract before it expires. Only one copy of this block is allowed.","597481571":"DISCLAIMER","597707115":"Tell us about your trading experience.","599469202":"{{secondPast}}s ago","602278674":"Verify identity","603849445":"Strike price","603849863":"Look for the <0>Repeat While/Until, and click the + icon to add the block to the workspace area.","606240547":"- Natural log","606877840":"Back to today","607807243":"Get candle","609519227":"This is the email address associated with your Deriv account.","609650241":"Infinite loop detected","610537973":"Any information you provide is confidential and will be used for verification purposes only.","611020126":"View address on Blockchain","611786123":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies, Stocks, and Stock Indices","617345387":"If you select \"Reset-Up”, you win the payout if the exit spot is strictly higher than either the entry spot or the spot at reset time.","618520466":"Example of a cut-off document","619268911":"<0>a.The Financial Commission will investigate the validity of the complaint within 5 business days.","619407328":"Are you sure you want to unlink from {{identifier_title}}?","623192233":"Please complete the <0>Appropriateness Test to access your cashier.","623542160":"Exponential Moving Average Array (EMAA)","625571750":"Entry spot:","626175020":"Standard Deviation Up Multiplier {{ input_number }}","626809456":"Resubmit","627292452":"<0>Your Proof of Identity or Proof of Address did not meet our requirements. Please check your email for further instructions.","627814558":"This block returns a value when a condition is true. Use this block within either of the function blocks above.","628193133":"Account ID","629145209":"In case if the \"AND\" operation is selected, the block returns \"True\" only if both given values are \"True\"","629395043":"All growth rates","632398049":"This block assigns a null value to an item or statement.","634219491":"You have not provided your tax identification number. This information is necessary for legal and regulatory requirements. Please go to <0>Personal details in your account settings, and fill in your latest tax identification number.","636219628":"<0>c.If no settlement opportunity can be found, the complaint will proceed to the determination phase to be handled by the DRC.","639382772":"Please upload supported file type.","640596349":"You have yet to receive any notifications","640730141":"Refresh this page to restart the identity verification process","641420532":"We've sent you an email","642210189":"Please check your email for the verification link to complete the process.","642393128":"Enter amount","642546661":"Upload back of license from your computer","642995056":"Email","644150241":"The number of contracts you have won since you last cleared your stats.","645016681":"Trading frequency in other financial instruments","645902266":"EUR/NZD","647039329":"Proof of address required","647192851":"Contract will be sold at the prevailing market price when the request is received by our servers. This price may differ from the indicated price.","647745382":"Input List {{ input_list }}","649317411":"On the basis of the information provided in relation to your knowledge and experience, we consider that the investments available via this website are not appropriate for you.<0/><1/>","649923867":"Adds a sign to a number to create a barrier offset. (deprecated)","651284052":"Low Tick","651684094":"Notify","652041791":"To create a Deriv X real account, create a Deriv real account first.","652298946":"Date of birth","654264404":"Up to 1:30","654507872":"True-False","654924603":"Martingale","655937299":"We’ll update your limits. Click <0>Accept to acknowledge that you are fully responsible for your actions, and we are not liable for any addiction or loss.","657325150":"This block is used to define trade options within the Trade parameters root block. Some options are only applicable for certain trade types. Parameters such as duration and stake are common among most trade types. Prediction is used for trade types such as Digits, while barrier offsets are for trade types that involve barriers such as Touch/No Touch, Ends In/Out, etc.","659482342":"Please remember that it is your responsibility to keep your answers accurate and up to date. You can update your personal details at any time in your account settings.","660481941":"To access your mobile apps and other third-party apps, you'll first need to generate an API token.","660991534":"Finish","661759508":"On the basis of the information provided in relation to your knowledge and experience, we consider that the investments available via this website are not appropriate for you.<0/><0/>","662548260":"Forex, Stock indices, Commodities and Cryptocurrencies","662578726":"Available","662609119":"Download the MT5 app","665089217":"Please submit your <0>proof of identity to authenticate your account and access your Cashier.","665777772":"XLM/USD","665872465":"In the example below, the opening price is selected, which is then assigned to a variable called \"op\".","666724936":"Please enter a valid ID number.","672008428":"ZEC/USD","673915530":"Jurisdiction and choice of law","674973192":"Use this password to log in to your Deriv MT5 accounts on the desktop, web, and mobile apps.","676159329":"Could not switch to default account.","677918431":"Market: {{ input_market }} > {{ input_submarket }} > {{ input_symbol }}","680334348":"This block was required to correctly convert your old strategy.","680478881":"Total withdrawal limit","681926004":"Example of a blurry document","682056402":"Standard Deviation Down Multiplier {{ input_number }}","684282133":"Trading instruments","685391401":"If you're having trouble signing in, let us know via <0>chat","686312916":"Trading accounts","686387939":"How do I clear my transaction log?","687212287":"Amount is a required field.","688510664":"You've {{two_fa_status}} 2FA on this device. You'll be logged out of your account on other devices (if any). Use your password and a 2FA code to log back in.","689137215":"Purchase price","691956534":"<0>You have added a {{currency}} account.<0> Make a deposit now to start trading.","693396140":"Deal cancellation (expired)","696870196":"- Open time: the opening time stamp","697630556":"This market is presently closed.","698037001":"National Identity Number","699159918":"1. Filing complaints","700259824":"Account currency","701034660":"We are still processing your withdrawal request.<0 />Please wait for the transaction to be completed before deactivating your account.","701462190":"Entry spot","701647434":"Search for string","702451070":"National ID (No Photo)","705299518":"Next, upload the page of your passport that contains your photo.","706413212":"To access the cashier, you are now in your {{regulation}} {{currency}} ({{loginid}}) account.","706727320":"Binary options trading frequency","706755289":"This block performs trigonometric functions.","707662672":"{{unblock_date}} at {{unblock_time}}","708055868":"Driving licence number","710123510":"repeat {{ while_or_until }} {{ boolean }}","711999057":"Successful","712101776":"Take a photo of your passport photo page","712635681":"This block gives you the selected candle value from a list of candles. You can choose from open price, close price, high price, low price, and open time.","713054648":"Sending","714080194":"Submit proof","714746816":"MetaTrader 5 Windows app","715841616":"Please enter a valid phone number (e.g. +15417541234).","716428965":"(Closed)","718504300":"Postal/ZIP code","720293140":"Log out","720519019":"Reset my password","721011817":"- Raise the first number to the power of the second number","723045653":"You'll log in to your Deriv account with this email address.","723961296":"Manage password","724203548":"You can send your complaint to the <0>European Commission's Online Dispute Resolution (ODR) platform. This is not applicable to UK clients.","728042840":"To continue trading with us, please confirm where you live.","728824018":"Spanish Index","729651741":"Choose a photo","730473724":"This block performs the \"AND\" or the \"OR\" logic operation with the given values.","731382582":"BNB/USD","734390964":"Insufficient balance","734881840":"false","742469109":"Reset Balance","742676532":"Trade CFDs on forex, derived indices, cryptocurrencies, and commodities with high leverage.","744110277":"Bollinger Bands Array (BBA)","745656178":"Use this block to sell your contract at the market price.","745674059":"Returns the specific character from a given string of text according to the selected option. ","746112978":"Your computer may take a few seconds to update","750886728":"Switch to your real account to submit your documents","751692023":"We <0>do not guarantee a refund if you make a wrong transfer.","752024971":"Reached maximum number of digits","752992217":"This block gives you the selected constant values.","753088835":"Default","753184969":"In providing our services to you, we are required to obtain information from you in order to assess whether a given product or service is appropriate for you (that is, whether you possess the experience and knowledge to understand the risks involved).<0/><1/>","753727511":"Type","755867072":"{{platform_name_mt5}} is not available in {{country}}","756152377":"SMA places equal weight to the entire distribution of values.","758003269":"make list from text","759783233":"For more information and assistance to counselling and support services, please visit <0>begambleaware.org.","760528514":"Please note that changing the value of \"i\" won't change the value of the original item in the list","761576760":"Fund your account to start trading.","762185380":"<0>Multiply returns by <0>risking only what you put in.","762871622":"{{remaining_time}}s","763019867":"Your Gaming account is scheduled to be closed","764366329":"Trading limits","764540515":"Stopping the bot is risky","766317539":"Language","770171141":"Go to {{hostname}}","772632060":"Do not send any other currency to the following address. Otherwise, you'll lose funds.","773091074":"Stake:","773309981":"Oil/USD","773336410":"Tether is a blockchain-enabled platform designed to facilitate the use of fiat currencies in a digital manner.","775679302":"{{pending_withdrawals}} pending withdrawal(s)","775706054":"Do you sell trading bots?","776085955":"Strategies","781924436":"Call Spread/Put Spread","783974693":"Avoid recent years","784311461":"Exponential Moving Average (EMA)","784583814":"Linked to your computer","785969488":"Jump 75 Index","787727156":"Barrier","788005234":"NA","792622364":"Negative balance protection","793526589":"To file a complaint about our service, send an email to <0>complaints@deriv.com and state your complaint in detail. Please submit any relevant screenshots of your trading or system for our better understanding.","793531921":"Our company is one of the oldest and most reputable online trading companies in the world. We are committed to treat our clients fairly and provide them with excellent service.<0/><1/>Please provide us with feedback on how we can improve our services to you. Rest assured that you will be heard, valued, and treated fairly at all times.","793826881":"This is your personal start page for Deriv","794682658":"Copy the link to your phone","795859446":"Password saved","797007873":"Follow these steps to recover camera access:","797500286":"negative","800228448":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}} and {{legal_entity_name_fx}}.","800521289":"Your personal details are incomplete","801430087":"A link can contain the word \"Deriv\" and still be fake.","802436811":"View transaction details","802438383":"New proof of address is needed","802556390":"seconds","802989607":"Drag your XML file here","803500173":"Initial stake","806165583":"Australia 200","807499069":"Financial commission complaints procedure","808323704":"You can also use \"Compare\" and \"Logic operation\" blocks to make test variables.","811876954":"You may transfer between your Deriv fiat, cryptocurrency, {{platform_name_mt5}}, and {{platform_name_dxtrade}} accounts.","816580787":"Welcome back! Your messages have been restored.","816738009":"<0/><1/>You may also raise your unresolved dispute to the <2>Office of the Arbiter for Financial Services.","818447476":"Switch account?","820877027":"Please verify your proof of identity","822915673":"Earn a range of payouts by correctly predicting market price movements with <0>options, or get the upside of CFDs without risking more than your initial stake with <1>multipliers.","823186089":"A block that can contain text.","824797920":"Is list empty?","825042307":"Let’s try again","826511719":"USD/SEK","827688195":"Disable Block","828219890":"then","828602451":"Returns the list of tick values in string format","830164967":"Last name","830993327":"No current transactions available","832217983":"40 transactions or more in the past 12 months","832398317":"Sell Error","832588873":"Order execution","832721563":"If you select \"Low Tick\", you win the payout if the selected tick is the lowest among the next five ticks.","834966953":"1551661986 seconds since Jan 01 1970 (UTC) translates to 03/04/2019 @ 1:13am (UTC).","835058671":"Total buy price","835350845":"Add another word or two. Uncommon words are better.","836097457":"I am interested in trading but have very little experience.","837066896":"Your document is being reviewed, please check back in 1-3 days.","839618971":"ADDRESS","839805709":"To smoothly verify you, we need a better photo","841434703":"Disable stack","841543189":"View transaction on Blockchain","843333337":"You can only make deposits. Please complete the <0>financial assessment to unlock withdrawals.","845213721":"Logout","845304111":"Slow EMA Period {{ input_number }}","847888634":"Please withdraw all your funds.","850582774":"Please update your personal info","851054273":"If you select \"Higher\", you win the payout if the exit spot is strictly higher than the barrier.","851264055":"Creates a list with a given item repeated for a specific number of times.","851508288":"This block constrains a given number within a set range.","852527030":"Step 2","852583045":"Tick List String","854399751":"Digit code must only contain numbers.","854630522":"Choose a cryptocurrency account","857363137":"Volatility 300 (1s) Index","857445204":"Deriv currently supports withdrawals of Tether eUSDT to Ethereum wallet. To ensure a successful transaction, enter a wallet address compatible with the tokens you wish to withdraw. <0>Learn more","857986403":"do something","860319618":"Tourism","862283602":"Phone number*","863328851":"Proof of identity","864610268":"First, enter your {{label}} and the expiry date.","864957760":"Math Number Positive","865424952":"High-to-Low","865642450":"2. Logged in from a different browser","866496238":"Make sure your license details are clear to read, with no blur or glare","868826608":"Excluded from {{brand_website_name}} until","869823595":"Function","869993298":"Minimum withdrawal","872549975":"You have {{number}} transfers remaining for today.","872661442":"Are you sure you want to update email <0>{{prev_email}} to <1>{{changed_email}}?","872721776":"2. Select your XML file and hit Select.","872817404":"Entry Spot Time","873166343":"1. 'Log' displays a regular message.","874461655":"Scan the QR code with your phone","874484887":"Take profit must be a positive number.","875532284":"Restart process on a different device","876086855":"Complete the financial assessment form","876292912":"Exit","879014472":"Reached maximum number of decimals","881000060":"{{transaction_type_display_text}} {{currency}}","885065431":"Get a Deriv account","888274063":"Town/City","888924866":"We don’t accept the following inputs for:","890299833":"Go to Reports","891337947":"Select country","892341141":"Your trading statistics since: {{date_time}}","893117915":"Variable","893963781":"Close-to-Low","893975500":"You do not have any recent bots","894191608":"<0>c.We must award the settlement within 28 days of when the decision is reached.","898457777":"You have added a Deriv Financial account.","900646972":"page.","901096150":"Earn a range of payouts by correctly predicting market price movements with <0>options, or get the\n upside of CFDs without risking more than your initial stake with <1>multipliers.","902045490":"3 minutes","903429103":"In candles list read {{ candle_property }} # from end {{ input_number }}","904696726":"API token","905134118":"Payout:","905227556":"Strong passwords contain at least 8 characters, combine uppercase and lowercase letters and numbers.","905564365":"MT5 CFDs","906049814":"We’ll review your documents and notify you of its status within 5 minutes.","907680782":"Proof of ownership verification failed","910888293":"Too many attempts","912406629":"Follow these steps:","912967164":"Import from your computer","915735109":"Back to {{platform_name}}","918447723":"Real","920125517":"Add demo account","921901739":"- your account details of the bank linked to your account","924046954":"Upload a document showing your name and bank account number or account details.","926813068":"Fixed/Variable","929608744":"You are unable to make withdrawals","930346117":"Capitalization doesn't help very much","930546422":"Touch","933126306":"Enter some text here","933193610":"Only letters, periods, hyphens, apostrophes, and spaces, please.","934835052":"Potential profit","934932936":"PERSONAL","936766426":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit.","937237342":"Strategy name cannot be empty","937682366":"Upload both of these documents to prove your identity.","937831119":"Last name*","937992258":"Table","938500877":"{{ text }}. <0>You can view the summary of this transaction in your email.","938988777":"High barrier","943535887":"Please close your positions in the following Deriv MT5 account(s):","944499219":"Max. open positions","945532698":"Contract sold","946204249":"Read","946841802":"A white (or green) candle indicates that the open price is lower than the close price. This represents an upward movement of the market price.","946944859":"Hit the button below and we'll send you an email with a link. Click that link to verify your withdrawal request.","947046137":"Your withdrawal will be processed within 24 hours","947363256":"Create list","947758334":"City is required","947914894":"Top up  <0>","948156236":"Create {{type}} password","948545552":"150+","949859957":"Submit","952927527":"Regulated by the Malta Financial Services Authority (MFSA) (licence no. IS/70156)","955352264":"Trade on {{platform_name_dxtrade}}","956448295":"Cut-off image detected","957182756":"Trigonometric functions","957956227":"Congratulations, you have successfully created your {{category}} {{deriv_keyword}} <0>{{platform}} <1>{{type}} account.","958430760":"In/Out","959031082":"set {{ variable }} to MACD Array {{ dropdown }} {{ dummy }}","960201789":"3. Sell conditions","961178214":"You can only purchase one contract at a time","961266215":"140+","961327418":"My computer","961692401":"Bot","966457287":"set {{ variable }} to Exponential Moving Average {{ dummy }}","968576099":"Up/Down","969987233":"Win up to maximum payout if exit spot is between lower and upper barrier, in proportion to the difference between exit spot and lower barrier.","970915884":"AN","974888153":"High-Low","975668699":"I confirm and accept {{company}} 's <0>Terms and Conditions","975950139":"Country of Residence","977929335":"Go to my account settings","981138557":"Redirect","981568830":"You have chosen to exclude yourself from trading on our website until {{exclude_until}}. If you are unable to place a trade or deposit after your self-exclusion period, please contact us via <0>live chat.","981965437":"Scan the QR code below with your 2FA app. We recommend <0>Authy or <1>Google Authenticator.","982146443":"WhatsApp","982402892":"First line of address","982829181":"Barriers","983451828":"2. Select the asset and trade type.","987224688":"How many trades have you placed with other financial instruments in the past 12 months?","988361781":"You have no trading activity yet.","988934465":"When prompted, you must enable camera access to continue","989021200":"Predict the market direction and movement size, and select either “Call” or “Put” to open a position.","990739582":"170+","992294492":"Your postal code is invalid","992677950":"Logging out on other devices","993827052":"Choosing this jurisdiction will give you a Financial STP account. Your trades will go directly to the market and have tighter spreads.","995563717":"not {{ boolean }}","999008199":"text","1001160515":"Sell","1001749987":"You’ll get a warning, named margin call, if your account balance drops down close to the stop out level.","1003876411":"Should start with letter or number and may contain a hyphen, period and slash.","1004127734":"Send email","1006458411":"Errors","1006664890":"Silent","1009032439":"All time","1010198306":"This block creates a list with strings and numbers.","1010337648":"We were unable to verify your proof of ownership.","1012102263":"You will not be able to log in to your account until this date (up to 6 weeks from today).","1015201500":"Define your trade options such as duration and stake.","1016220824":"You need to switch to a real money account to use this feature.<0/>You can do this by selecting a real account from the <1>Account Switcher.","1018803177":"standard deviation","1019265663":"You have no transactions yet.","1019508841":"Barrier 1","1021679446":"Multipliers only","1022934784":"1 minute","1023237947":"1. In the example below, the instructions are repeated as long as the value of x is less than or equal to 10. Once the value of x exceeds 10, the loop is terminated.","1023643811":"This block purchases contract of a specified type.","1023795011":"Even/Odd","1024205076":"Logic operation","1025887996":"Negative Balance Protection","1026046972":"Please enter a payout amount that's lower than {{max_payout}}.","1027098103":"Leverage gives you the ability to trade a larger position using your existing capital. Leverage varies across different symbols.","1028211549":"All fields are required","1028758659":"Citizenship*","1029164365":"We presume that you possess the experience, knowledge, and expertise to make your own investment decisions and properly assess the risk involved.","1030021206":"change {{ variable }} by {{ number }}","1031602624":"We've sent a secure link to %{number}","1031731167":"Pound Sterling","1032173180":"Deriv","1032907147":"AUD/NZD","1035506236":"Choose a new password","1035893169":"Delete","1036116144":"Speculate on the price movement of an asset without actually owning it.","1036867749":"The desired duration, stake, prediction, and/or barrier(s) for the contract is defined here.","1038575777":"Change password","1039428638":"EU regulation","1039755542":"Use a few words, avoid common phrases","1040053469":"For Call","1040472990":"1. Go to Bot Builder.","1040677897":"To continue trading, you must also submit a proof of address.","1041001318":"This block performs the following operations on a given list: sum, minimum, maximum, average, median, mode, antimode, standard deviation, random item.","1041620447":"If you are unable to scan the QR code, you can manually enter this code instead:","1042659819":"You have an account that needs action","1043483281":"Click Run when you want to start trading, and click Stop when you want to stop.","1043790274":"There was an error","1044230481":"This is an Ethereum ({{token}}) only address, please do not use {{prohibited_token}}.","1044540155":"100+","1044599642":"<0> has been credited into your {{platform}} {{title}} account.","1045704971":"Jump 150 Index","1045782294":"Click the <0>Change password button to change your Deriv password.","1047389068":"Food Services","1047881477":"Unfortunately, your browser does not support the video.","1048687543":"Labuan Financial Services Authority","1048947317":"Sorry, this app is unavailable in {{clients_country}}.","1049384824":"Rise","1050128247":"I confirm that I have verified the payment agent’s transfer information.","1050844889":"Reports","1052137359":"Family name*","1052779010":"You are on your demo account","1053153674":"Jump 50 Index","1053159279":"Level of education","1053556481":"Once you submit your complaint, we will send you an acknowledgement email to confirm that we have received it.","1055313820":"No document detected","1056381071":"Return to trade","1056821534":"Are you sure?","1057216772":"text {{ input_text }} is empty","1057749183":"Two-factor authentication (2FA)","1057765448":"Stop out level","1057904606":"The concept of the D’Alembert Strategy is said to be similar to the Martingale Strategy where you will increase your contract size after a loss. With the D’Alembert Strategy, you will also decrease your contract size after a successful trade.","1060231263":"When are you required to pay an initial margin?","1061308507":"Purchase {{ contract_type }}","1062536855":"Equals","1065353420":"110+","1065498209":"Iterate (1)","1066235879":"Transferring funds will require you to create a second account.","1066459293":"4.3. Acknowledging your complaint","1069347258":"The verification link you used is invalid or expired. Please request for a new one.","1069576070":"Purchase lock","1070624871":"Check proof of address document verification status","1073261747":"Verifications","1076006913":"Profit/loss on the last {{item_count}} contracts","1077515534":"Date to","1078221772":"Leverage prevents you from opening large positions.","1080068516":"Action","1080990424":"Confirm","1082158368":"*Maximum account cash balance","1082406746":"Please enter a stake amount that's at least {{min_stake}}.","1083781009":"Tax identification number*","1083826534":"Enable Block","1086118495":"Traders Hub","1088031284":"Strike:","1088138125":"Tick {{current_tick}} - ","1089085289":"Mobile number","1089436811":"Tutorials","1089687322":"Stop your current bot?","1095295626":"<0>•The Arbiter for Financial Services will determine whether the complaint can be accepted and is in accordance with the law.","1096078516":"We’ll review your documents and notify you of its status within 3 days.","1096175323":"You’ll need a Deriv account","1098147569":"Purchase commodities or shares of a company.","1098622295":"\"i\" starts with the value of 1, and it will be increased by 2 at every iteration. The loop will repeat until \"i\" reaches the value of 12, and then the loop is terminated.","1099892929":"Save bot","1100133959":"National ID","1100870148":"To learn more about account limits and how they apply, please go to the <0>Help Centre.","1101560682":"stack","1101712085":"Buy Price","1102420931":"Next, upload the front and back of your driving licence.","1102995654":"Calculates Exponential Moving Average (EMA) list from a list of values with a period","1103309514":"Target","1103452171":"Cookies help us to give you a better experience and personalised content on our site.","1104912023":"Pending verification","1107474660":"Submit proof of address","1107555942":"To","1109217274":"Success!","1110102997":"Statement","1112582372":"Interval duration","1113119682":"This block gives you the selected candle value from a list of candles.","1113292761":"Less than 8MB","1114679006":"You have successfully created your bot using a simple strategy.","1117863275":"Security and safety","1118294625":"You have chosen to exclude yourself from trading on our website until {{exclusion_end}}. If you are unable to place a trade or deposit after your self-exclusion period, please contact us via live chat.","1119887091":"Verification","1119986999":"Your proof of address was submitted successfully","1120985361":"Terms & conditions updated","1122910860":"Please complete your <0>financial assessment.","1123927492":"You have not selected your account currency","1125090693":"Must be a number","1126075317":"Add your Deriv MT5 <0>{{account_type_name}} STP account under Deriv (FX) Ltd regulated by Labuan Financial Services Authority (Licence no. MB/18/0024).","1126934455":"Length of token name must be between 2 and 32 characters.","1127149819":"Make sure§","1127224297":"Sorry for the interruption","1128139358":"How many CFD trades have you placed in the past 12 months?","1128321947":"Clear All","1128404172":"Undo","1129124569":"If you select \"Under\", you will win the payout if the last digit of the last tick is less than your prediction.","1129842439":"Please enter a take profit amount.","1130744117":"We shall try to resolve your complaint within 10 business days. We will inform you of the outcome together with an explanation of our position and propose any remedial measures we intend to take.","1130791706":"N","1133651559":"Live chat","1134405047":"Welcome to DBot!","1134879544":"Example of a document with glare","1138126442":"Forex: standard","1139483178":"Enable stack","1143730031":"Direction is {{ direction_type }}","1144028300":"Relative Strength Index Array (RSIA)","1145927365":"Run the blocks inside after a given number of seconds","1146064568":"Go to Deposit page","1147269948":"Barrier cannot be zero.","1147625645":"Please proceed to withdraw all your funds from your account before <0>30 November 2021.","1150637063":"*Volatility 150 Index and Volatility 250 Index","1151964318":"both sides","1152294962":"Upload the front of your driving licence.","1154021400":"list","1154239195":"Title and name","1155011317":"This block converts the date and time to the number of seconds since the Unix Epoch (1970-01-01 00:00:00).","1155626418":"below","1158678321":"<0>b.The Head of the Dispute Resolution Committee (DRC) will contact both you and us within 5 business days to obtain all necessary information and see if there is a chance to settle the complaint during the investigation phase.","1160761178":"No payout if exit spot is below or equal to the lower barrier.","1161924555":"Please select an option","1163771266":"The third block is <0>optional. You may use this block if you want to sell your contract before it expires. For now, leave the block as it is. ","1163836811":"Real Estate","1164773983":"Take profit and/or stop loss are not available while deal cancellation is active.","1166128807":"Choose one of your accounts or add a new cryptocurrency account","1166377304":"Increment value","1168029733":"Win payout if exit spot is also equal to entry spot.","1169201692":"Create {{platform}} password","1170228717":"Stay on {{platform_name_trader}}","1171765024":"Step 3","1173770679":"- currentPL: Use this variable to store the cumulative profit or loss while your bot is running. Set the initial value to 0.","1174542625":"- Find the chat ID property in the response, and copy the value of the id property","1174748431":"Payment channel","1175183064":"Vanuatu","1176926166":"Experience with trading other financial instruments","1177396776":"If you select \"Asian Fall\", you will win the payout if the last tick is lower than the average of the ticks.","1177723589":"There are no transactions to display","1178582280":"The number of contracts you have lost since you last cleared your stats.","1178800778":"Take a photo of the back of your license","1178942276":"Please try again in a minute.","1179704370":"Please enter a take profit amount that's higher than the current potential profit.","1180619731":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts, up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts, and up to {{ allowed_dxtrade }} transfers between your Deriv and {{platform_name_dxtrade}} accounts.","1181396316":"This block gives you a random number from within a set range","1181770592":"Profit/loss from selling","1183007646":"- Contract type: the name of the contract type such as Rise, Fall, Touch, No Touch, etс.","1184968647":"Close your contract now or keep it running. If you decide to keep it running, you can check and close it later on the ","1188316409":"To receive your funds, contact the payment agent with the details below","1188980408":"5 minutes","1189249001":"4.1. What is considered a complaint?","1189368976":"Please complete your personal details before you verify your identity.","1191429031":"Please click on the link in the email to change your <0>{{platform_name_dxtrade}} password.","1191644656":"Predict the market direction and select either “Up” or “Down” to open a position. We will charge a commission when you open a position.","1195393249":"Notify {{ notification_type }} with sound: {{ notification_sound }} {{ input_message }}","1196683606":"Deriv MT5 CFDs demo account","1197326289":"You are no longer able to trade digital options on any of our platforms. Also, you can’t make deposits into your Options account.","1198368641":"Relative Strength Index (RSI)","1199281499":"Last Digits List","1201533528":"Contracts won","1201773643":"numeric","1203297580":"This block sends a message to a Telegram channel.","1204223111":"In this example, the open prices from a list of candles are assigned to a variable called \"candle_list\".","1206227936":"How to mask your card?","1206821331":"Armed Forces","1207152000":"Choose a template and set your trade parameters.","1208729868":"Ticks","1208903663":"Invalid token","1211912982":"Bot is starting","1214893428":"Account creation is currently unavailable for mobile. Please log in with your computer to create a new account.","1216408337":"Self-Employed","1217159705":"Bank account number","1217481729":"Tether as an ERC20 token (eUSDT) is a version of Tether that is hosted on Ethereum.","1218546232":"What is Fiat onramp?","1219844088":"do %1","1221250438":"To enable withdrawals, please submit your <0>Proof of Identity (POI) and <1>Proof of Address (POA) and also complete the <2>financial assessment in your account settings.","1222096166":"Deposit via bank wire, credit card, and e-wallet","1222521778":"Making deposits and withdrawals is difficult.","1222544232":"We’ve sent you an email","1225150022":"Number of assets","1227074958":"random fraction","1227240509":"Trim spaces","1228534821":"Some currencies may not be supported by payment agents in your country.","1229883366":"Tax identification number","1230884443":"State/Province (optional)","1231282282":"Use only the following special characters: {{permitted_characters}}","1232291311":"Maximum withdrawal remaining","1232353969":"0-5 transactions in the past 12 months","1233300532":"Payout","1234292259":"Source of wealth","1234764730":"Upload a screenshot of your name and email address from the personal details section.","1235426525":"50%","1237330017":"Pensioner","1238311538":"Admin","1239760289":"Complete your trading assessment","1239940690":"Restarts the bot when an error is encountered.","1240027773":"Please Log in","1241238585":"You may transfer between your Deriv fiat, cryptocurrency, and {{platform_name_mt5}} accounts.","1242288838":"Hit the checkbox above to choose your document.","1243064300":"Local","1246207976":"Enter the authentication code generated by your 2FA app:","1246880072":"Select issuing country","1247280835":"Our cryptocurrency cashier is temporarily down due to system maintenance. You can make cryptocurrency deposits and withdrawals in a few minutes when the maintenance is complete.","1248018350":"Source of income","1248940117":"<0>a.The decisions made by the DRC are binding on us. DRC decisions are binding on you only if you accept them.","1250495155":"Token copied!","1252669321":"Import from your Google Drive","1254565203":"set {{ variable }} to create list with","1255909792":"last","1255963623":"To date/time {{ input_timestamp }} {{ dummy }}","1258097139":"What could we do to improve?","1258198117":"positive","1259598687":"GBP/JPY","1260259925":"Phone is not in a proper format.","1263387702":"All {{count}} account types use market execution. This means you agree with the broker's price in advance and will place orders at the broker's price.","1264096613":"Search for a given string","1264842111":"You can switch between real and demo accounts.","1265704976":"","1270581106":"If you select \"No Touch\", you win the payout if the market never touches the barrier at any time during the contract period.","1271461759":"Your contract will be closed automatically if your profit reaches this amount.","1272012156":"GBP/CHF","1272337240":"Days","1272681097":"Hours","1274819385":"3. Complaints and Disputes","1281045211":"Sorts the items in a given list, by their numeric or alphabetical value, in either ascending or descending order.","1281290230":"Select","1282951921":"Only Downs","1284522768":"If \"Loss\" is selected, it will return \"True\" if your last trade was unsuccessful. Otherwise, it will return an empty string.","1286094280":"Withdraw","1286507651":"Close identity verification screen","1288965214":"Passport","1289146554":"British Virgin Islands Financial Services Commission","1289646209":"Margin call","1290525720":"Example: ","1291887623":"Digital options trading frequency","1292188546":"Reset Deriv MT5 investor password","1292891860":"Notify Telegram","1293660048":"Max. total loss per day","1294756261":"This block creates a function, which is a group of instructions that can be executed at any time. Place other blocks in here to perform any kind of action that you need in your strategy. When all the instructions in a function have been carried out, your bot will continue with the remaining blocks in your strategy. Click the “do something” field to give it a name of your choice. Click the plus icon to send a value (as a named variable) to your function.","1295284664":"Please accept our <0>updated Terms and Conditions to proceed.","1296380713":"Close my contract","1297577226":"Create your bot easily using our drag-and-drop blocks to match your desired trading strategy, or choose from our pre-made Quick Strategies.","1299479533":"8 hours","1300576911":"Please resubmit your proof of address or we may restrict your account.","1302691457":"Occupation","1303016265":"Yes","1303530014":"We’re processing your withdrawal.","1304083330":"copy","1304272843":"Please submit your proof of address.","1304620236":"Enable camera","1304788377":"<0/><1/>If your complaint relates to our data processing practices, you can submit a formal complaint to the <2>Information and Data Protection Commissioner (Malta) on their website or make a complaint to any supervisory authority within the European Union.","1304807342":"Compare CFDs demo accounts","1305217290":"Upload the back of your identity card.","1308625834":"Sets the default time interval for blocks that read list of candles.","1309017029":"Enabling this allows you to save your blocks as one collection which can be easily integrated into other bots.","1309044871":"Returns the value of the latest tick in string format","1310483610":"Results for \"{{ search_term }}\"","1311680770":"payout","1311799109":"We do not support Binance Smart Chain tokens to deposit, please use only Ethereum ({{token}}).","1313167179":"Please log in","1316216284":"You can use this password for all your {{platform}} accounts.","1319217849":"Check your mobile","1320750775":"Front and back","1322804930":"Restart the process on the latest version of Google Chrome","1323327633":"Our complaints process comprises the following 4 steps:","1323476617":"Changes the capitalisation of a string of text to Upper case, Lower case, Title case.","1323996051":"Profile","1324110809":"Address information","1324922837":"2. The new variable will appear as a block under Set variable.","1327181172":"Financial Vanuatu","1327494533":"{{sell_value}} (Sell)","1329136554":"Jump 200 Index","1329325646":"The content of this block is called on every tick","1331199417":"Please enter the correct format. ","1331367811":"Client account number","1332168410":"Learn more","1332168769":"Disconnect","1333576137":"Please update your {{details}} to continue.","1333839457":"Submit identity card (front)","1334326985":"It may take a few minutes to arrive","1335967988":"Notice","1336052175":"Switch accounts","1337846406":"This block gives you the selected candle value from a list of candles within the selected time interval.","1337864666":"Photo of your document","1338496204":"Ref. ID","1339613797":"Regulator/External dispute resolution","1341840346":"View in Journal","1346204508":"Take profit","1346339408":"Managers","1347071802":"{{minutePast}}m ago","1348009461":"Please close your positions in the following Deriv X account(s):","1349133669":"Try changing your search criteria.","1349289354":"Great, that's everything we need","1349295677":"in text {{ input_text }} get substring from {{ position1 }} {{ index1 }} to {{ position2 }} {{ index2 }}","1351906264":"This feature is not available for payment agents.","1353197182":"Please select","1353958640":"You can also use these shortcuts to import or build your bot.","1354288636":"Based on your answers, it looks like you have insufficient knowledge and experience in trading CFDs. CFD trading is risky and you could potentially lose all of your capital.<0/><0/>","1355250245":"{{ calculation }} of list {{ input_list }}","1356574493":"Returns a specific portion of a given string of text.","1356607862":"Deriv password","1357129681":"{{num_day}} days {{num_hour}} hours {{num_minute}} minutes","1357213116":"Identity card","1358543466":"Not available","1358543748":"enabled","1359424217":"You have sold this contract at <0 />","1360929368":"Add a Deriv account","1362578283":"High","1363060668":"Your trading statistics since:","1363645836":"Derived FX","1363675688":"Duration is a required field.","1364958515":"Stocks","1366244749":"Limits","1367023655":"To ensure your loss does not exceed your stake, your contract will be closed automatically when your loss equals to <0/>.","1367488817":"4. Restart trading conditions","1367990698":"Volatility 10 Index","1369709538":"Our terms of use","1370647009":"Enjoy higher daily limits","1371193412":"Cancel","1371555192":"Choose your preferred payment agent and enter your withdrawal amount. If your payment agent is not listed, <0>search for them using their account number.","1371641641":"Open the link on your mobile","1371911731":"Financial products in the EU are offered by {{legal_entity_name}}, licensed as a Category 3 Investment Services provider by the Malta Financial Services Authority (<0>Licence no. IS/70156).","1374627690":"Max. account balance","1376329801":"Last 60 days","1378419333":"Ether","1383017005":"You have switched accounts.","1384127719":"You should enter {{min}}-{{max}} numbers.","1384222389":"Please submit valid identity documents to unlock the cashier.","1385418910":"Please set a currency for your existing real account before creating another account.","1387503299":"Log in","1388770399":"Proof of identity required","1389197139":"Import error","1390792283":"Trade parameters","1391174838":"Potential payout:","1392966771":"Mrs","1392985917":"This is similar to a commonly used password","1393559748":"Invalid date/time: {{ datetime_string }}","1393901361":"There’s an app for that","1393903598":"if true {{ return_value }}","1396179592":"Commission","1396417530":"Bear Market Index","1397628594":"Insufficient funds","1400341216":"We’ll review your documents and notify you of its status within 1 to 3 days.","1400637999":"(All fields are required)","1400732866":"View from camera","1400962248":"High-Close","1402208292":"Change text case","1403376207":"Update my details","1405584799":"with interval: {{ candle_interval_type }}","1407191858":"DTrader","1408844944":"Click the plus icon to extend the functionality of this block.","1410320737":"Go to Deriv MT5 dashboard","1412535872":"You can check the result of the last trade with this block. It can only be placed within the \"Restart trading conditions\" root block.","1413047745":"Assigns a given value to a variable","1413359359":"Make a new transfer","1414205271":"prime","1415006332":"get sub-list from first","1415974522":"If you select \"Differs\", you will win the payout if the last digit of the last tick is not the same as your prediction.","1417558007":"Max. total loss over 7 days","1417914636":"Login ID","1418115525":"This block repeats instructions as long as a given condition is true.","1421749665":"Simple Moving Average (SMA)","1422060302":"This block replaces a specific item in a list with another given item. It can also insert the new item in the list at a specific position.","1422129582":"All details must be clear — nothing blurry","1423082412":"Last Digit","1423296980":"Enter your SSNIT number","1424741507":"See more","1424779296":"If you've recently used bots but don't see them in this list, it may be because you:","1428657171":"You can only make deposits. Please contact us via <0>live chat for more information.","1430396558":"5. Restart buy/sell on error","1430632931":"To get trading, please confirm who you are, and where you live.","1433367863":"Sorry, an error occured while processing your request.","1433468641":"We offer our services in all countries, except for the ones mentioned in our terms and conditions.","1434382099":"Displays a dialog window with a message","1434976996":"Announcement","1435363248":"This block converts the number of seconds since the Unix Epoch to a date and time format such as 2019-08-01 00:00:00.","1435380105":"Minimum deposit","1437396005":"Add comment","1438247001":"A professional client receives a lower degree of client protection due to the following.","1438340491":"else","1439168633":"Stop loss:","1441208301":"Total<0 />profit/loss","1442747050":"Loss amount: <0>{{profit}}","1442840749":"Random integer","1443478428":"Selected proposal does not exist","1444843056":"Corporate Affairs Commission","1445592224":"You accidentally gave us another email address (Usually a work or a personal one instead of the one you meant).","1446742608":"Click here if you ever need to repeat this tour.","1449462402":"In review","1452260922":"Too many failed attempts","1452941569":"This block delays execution for a given number of seconds. You can place any blocks within this block. The execution of other blocks in your strategy will be paused until the instructions in this block are carried out.","1453317405":"This block gives you the balance of your account either as a number or a string of text.","1454406889":"Choose <0>until as the repeat option.","1454648764":"deal reference id","1454865058":"Do not enter an address linked to an ICO purchase or crowdsale. If you do, the ICO tokens will not be credited into your account.","1455741083":"Upload the back of your driving licence.","1457341530":"Your proof of identity verification has failed","1457603571":"No notifications","1458160370":"Enter your {{platform}} password to add a {{platform_name}} {{account}} {{jurisdiction_shortcode}} account.","1459761348":"Submit proof of identity","1461323093":"Display messages in the developer’s console.","1464190305":"This block will transfer the control back to the Purchase conditions block, enabling you to purchase another contract without manually stopping and restarting your bot.","1464253511":"You already have an account for each of the cryptocurrencies available on {{deriv}}.","1465084972":"How much experience do you have with other financial instruments?","1465919899":"Pick an end date","1466430429":"Should be between {{min_value}} and {{max_value}}","1466900145":"Doe","1467017903":"This market is not yet available on {{platform_name_trader}}, but it is on {{platform_name_smarttrader}}.","1467421920":"with interval: %1","1467661678":"Cryptocurrency trading","1467880277":"3. General queries","1468308734":"This block repeats instructions as long as a given condition is true","1468419186":"Deriv currently supports withdrawals of Tether USDT to Omni wallet. To ensure a successful transaction, enter a wallet address compatible with the tokens you wish to withdraw. <0>Learn more","1468937050":"Trade on {{platform_name_trader}}","1469150826":"Take Profit","1469764234":"Cashier Error","1469814942":"- Division","1470319695":"Returns either True or False","1471070549":"Can contract be sold?","1471741480":"Severe error","1473369747":"Synthetics only","1476301886":"Similar to SMA, this block gives you the entire SMA line containing a list of all values for a given period.","1478030986":"Create or delete API tokens for trading and withdrawals","1480915523":"Skip","1481977420":"Please help us verify your withdrawal request.","1483470662":"Click ‘Open’ to start trading with your account","1484336612":"This block is used to either terminate or continue a loop, and can be placed anywhere within a loop block.","1487086154":"Your documents were submitted successfully","1488126519":"Your bots","1488548367":"Upload again","1490583127":"DBot isn't quite ready for real accounts","1491392301":"<0>Sold for: {{sold_for}}","1492686447":"Your MT5 Financial STP account will be opened through Deriv (FX) Ltd. All trading in this account is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA). None of your other accounts, including your Deriv account, is subject to the regulations and guidelines of the Labuan Financial Service Authority (LFSA).","1493673429":"Change email","1493866481":"Run Deriv X on your browser","1496810530":"GBP/AUD","1497773819":"Deriv MT5 accounts","1499074768":"Add a real Deriv Multipliers account","1499080621":"Tried to perform an invalid operation.","1501691227":"Add Your Deriv MT5 <0>{{account_type_name}} account under Deriv (V) Ltd, regulated by the Vanuatu Financial Services Commission.","1502039206":"Over {{barrier}}","1502325741":"Your password cannot be the same as your email address.","1503618738":"- Deal reference ID: the reference ID of the contract","1505420815":"No payment agents found for your search","1505898522":"Download stack","1505927599":"Our servers hit a bump. Let’s refresh to move on.","1509570124":"{{buy_value}} (Buy)","1509678193":"Education","1510075920":"Gold/USD","1510357015":"Tax residence is required.","1510735345":"This block gives you a list of the last digits of the last 1000 tick values.","1512469749":"In the above example it is assumed that variable candle_open_price is processed somewhere within other blocks.","1516537408":"You can no longer trade on Deriv or deposit funds into your account.","1516559721":"Please select one file only","1516676261":"Deposit","1516834467":"‘Get’ the accounts you want","1517503814":"Drop file or click here to upload","1519124277":"Derived SVG","1519891032":"Welcome to Trader's Hub","1520332426":"Net annual income","1524636363":"Authentication failed","1526483456":"2. Enter a name for your variable, and hit Create. New blocks containing your new variable will appear below.","1527251898":"Unsuccessful","1527906715":"This block adds the given number to the selected variable.","1531017969":"Creates a single text string from combining the text value of each attached item, without spaces in between. The number of items can be added accordingly.","1533177906":"Fall","1534569275":"As part of the changes in our markets, we will be closing our UK clients’ accounts.","1534796105":"Gets variable value","1537711064":"You need to make a quick identity verification before you can access the Cashier. Please go to your account settings to submit your proof of identity.","1540585098":"Decline","1541508606":"Looking for CFDs? Go to Trader's Hub","1541969455":"Both","1542742708":"Synthetics, Forex, Stocks, Stock indices, Commodities, and Cryptocurrencies","1544642951":"If you select \"Only Ups\", you win the payout if consecutive ticks rise successively after the entry spot. No payout if any tick falls or is equal to any of the previous ticks.","1547148381":"That file is too big (only up to 8MB allowed). Please upload another file.","1548765374":"Verification of document number failed","1549098835":"Total withdrawn","1551172020":"AUD Basket","1552162519":"View onboarding","1552918367":"Send only {{currency}} ({{currency_symbol}}) to this address.","1555345325":"User Guide","1557426040":"Demo Derived SVG","1557682012":"Account Settings","1558972889":"set {{ variable }} to Simple Moving Average {{ dummy }}","1559136143":"No, we don't offer cryptocurrencies on DBot.","1559220089":"Options and multipliers trading platform.","1560302445":"Copied","1562374116":"Students","1564392937":"When you set your limits or self-exclusion, they will be aggregated across all your account types in {{platform_name_trader}} and {{platform_name_dbot}}. For example, the losses made on both platforms will add up and be counted towards the loss limit you set.","1566037033":"Bought: {{longcode}} (ID: {{transaction_id}})","1567076540":"Only use an address for which you have proof of residence - ","1567586204":"Self-exclusion","1567745852":"Bot name","1569624004":"Dismiss alert","1570484627":"Ticks list","1571303610":"3. Set your trade parameters and hit Create.","1571575776":"Accepted formats: pdf, jpeg, jpg, and png. Max file size: 8MB","1572504270":"Rounding operation","1572982976":"Server","1573429525":"Call/Put","1573533094":"Your document is pending for verification.","1575556189":"Tether on the Ethereum blockchain, as an ERC20 token, is a newer transport layer, which now makes Tether available in Ethereum smart contracts. As a standard ERC20 token, it can also be sent to any Ethereum address.","1577480486":"Your mobile link will expire in one hour","1577527507":"Account opening reason is required.","1577612026":"Select a folder","1579839386":"Appstore","1580498808":"Multiple faces found","1584109614":"Ticks String List","1584936297":"XML file contains unsupported elements. Please check or modify file.","1585859194":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts, your Deriv fiat and {{platform_name_derivez}} accounts, and your Deriv fiat and {{platform_name_dxtrade}} accounts.","1587046102":"Documents from that country are not currently supported — try another document type","1589148299":"Start","1589640950":"Resale of this contract is not offered.","1589702653":"Proof of address","1590400723":"Total assets in all your accounts","1591933071":"Resubmit document","1593010588":"Login now","1594147169":"Please come back in","1594322503":"Sell is available","1596378630":"You have added a real Gaming account.<0/>Make a deposit now to start trading.","1597672660":"Deriv MT5 Password","1598009247":"<0>a.You may file a complaint with the Financial Commission up to 45 days after the incident.","1598386296":"Town/City is required.","1598443642":"Transaction hash","1602894348":"Create a password","1604171868":"Please withdraw all your funds as soon as possible.","1604916224":"Absolute","1605222432":"I have no knowledge and experience in trading at all.","1605292429":"Max. total loss","1611306795":"How is my bot doing?","1612105450":"Get substring","1612638396":"Cancel your trade at any time within a specified timeframe.","1613633732":"Interval should be between 10-60 minutes","1615897837":"Signal EMA Period {{ input_number }}","1617455864":"Shortcuts","1618809782":"Maximum withdrawal","1619070150":"You are being redirected to an external website.","1620278321":"Names and surnames by themselves are easy to guess","1620346110":"Set currency","1621024661":"Tether as a TRC20 token (tUSDT) is a version of Tether that is hosted on Tron.","1622662457":"Date from","1622944161":"Now, go to the <0>Restart trading conditions block.","1623706874":"Use this block when you want to use multipliers as your trade type.","1630372516":"Try our Fiat onramp","1630417358":"Please go to your account settings and complete your personal details to enable withdrawals.","1631281562":"GBP Basket","1634903642":"Only your face can be in the selfie","1634969163":"Change currency","1635266650":"It seems that your name in the document is not the same as your Deriv profile. Please update your name in the <0>Personal details page to solve this issue.","1636605481":"Platform settings","1636782601":"Multipliers","1638321777":"Your demo account balance is low. Reset your balance to continue trading from your demo account.","1639262461":"Pending withdrawal request:","1639304182":"Please click on the link in the email to reset your password.","1641395634":"Last digits list","1641635657":"New proof of identity document needed","1641980662":"Salutation is required.","1644703962":"Looking for CFD accounts? Go to Trader's Hub","1644864436":"You’ll need to authenticate your account before requesting to become a professional client. <0>Authenticate my account","1644908559":"Digit code is required.","1647186767":"The bot encountered an error while running.","1648938920":"Netherlands 25","1649239667":"2. Under the Blocks menu, you'll see a list of categories. Blocks are grouped within these categories. Choose the block you want and drag them to the workspace.","1651513020":"Display remaining time for each interval","1651951220":"Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"","1652366857":"get and remove","1652968048":"Define your trade options such as multiplier and stake.","1652976865":"In this example, this block is used with another block to get the open prices from a list of candles. The open prices are then assigned to the variable called \"cl\".","1653136377":"copied!","1653180917":"We cannot verify you without using your camera","1654365787":"Unknown","1654496508":"Our system will finish any DBot trades that are running, and DBot will not place any new trades.","1654721858":"Upload anyway","1655627840":"UPPER CASE","1656155124":"Resend in <0 /> seconds","1658954996":"Plant and Machine Operators and Assemblers","1659074761":"Reset Put","1659352235":"Add your Deriv MT5 CFDs account under Deriv Investments (Europe) Limited, regulated by the Malta Financial Services Authority (MFSA) (licence no. IS/70156).","1665272539":"Remember: You cannot log in to your account until the selected date.","1665738338":"Balance","1665756261":"Go to live chat","1668138872":"Modify account settings","1670016002":"Multiplier: {{ multiplier }}","1670426231":"End Time","1671232191":"You have set the following limits:","1674163852":"You can determine the expiry of your contract by setting the duration or end time.","1675030608":"To create this account first we need you to resubmit your proof of address.","1675289747":"Switched to real account","1677027187":"Forex","1677990284":"My apps","1679743486":"1. Go to Quick strategy and select the strategy you want.","1680666439":"Upload your bank statement showing your name, account number, and transaction history.","1682409128":"Untitled Strategy","1682636566":"Resend email in","1683522174":"Top-up","1683963454":"Your contract will be closed automatically at the next available asset price on {{date}} at {{timestamp}}.","1684419981":"What's this?","1686800117":"{{error_msg}}","1687173740":"Get more","1689103988":"Second Since Epoch","1689258195":"We were unable to verify your address with the details you provided. Please check and resubmit or choose a different document type.","1691335819":"To continue trading with us, please confirm who you are.","1691765860":"- Negation","1692912479":"Deriv MT5, Deriv X","1693614409":"Start time","1694331708":"You can switch between CFDs, digital options, and multipliers at any time.","1694517345":"Enter a new email address","1698624570":"2. Hit Ok to confirm.","1700233813":"Transfer from {{selected_value}} is not allowed, Please choose another account from dropdown","1701447705":"Please update your address","1703091957":"We collect information about your employment as part of our due diligence obligations, as required by anti-money laundering legislation.","1704656659":"How much experience do you have in CFD trading?","1708413635":"For your {{currency_name}} ({{currency}}) account","1709401095":"Trade CFDs on Deriv X with financial markets and our Derived indices.","1709859601":"Exit Spot Time","1710662619":"If you have the app, launch it to start trading.","1711013665":"Anticipated account turnover","1711676335":"square root","1711929663":"Your funds have been transferred","1712357617":"Invalid email address.","1714255392":"To enable withdrawals, please complete your financial assessment.","1715011380":"Jump 25 Index","1715630945":"Returns the total profit in string format","1717023554":"Resubmit documents","1719248689":"EUR/GBP/USD","1720451994":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv fiat and Deriv cryptocurrency accounts.","1720790758":"No, DBot will stop running when your web browser is closed.","1720968545":"Upload passport photo page from your computer","1723589564":"Represents the maximum number of outstanding contracts in your portfolio. Each line in your portfolio counts for one open position. Once the maximum is reached, you will not be able to open new positions without closing an existing position first.","1724696797":"You are limited to one fiat account only.","1725958461":"Account number","1726472773":"Function with no return value","1726565314":"Close my account","1728121741":"Transactions.csv","1728183781":"About Tether","1729145421":"Risk warning","1731747596":"The block(s) highlighted in red are missing input values. Please update them and click \"Run bot\".","1732891201":"Sell price","1733711201":"Regulators/external dispute resolution","1734185104":"Balance: %1","1734264460":"Disclaimer","1736292549":"Update postal code","1737352280":"Bot.init is not called","1738094481":"<0>Duration: Ticks 1","1738681493":"Remove your glasses, if necessary","1739086943":"Wall Street 30","1739384082":"Unemployed","1739668049":"Close your account","1740371444":"Underlying market is not selected","1742256256":"Please upload one of the following documents:","1743448290":"Payment agents","1743902050":"Complete your financial assessment","1744509610":"Just drag the XML file from your computer onto the workspace, and your bot will be loaded accordingly. Alternatively, you can hit Import in Bot Builder, and choose to import your bot from your computer or from your Google Drive.","1745523557":"- Square root","1746051371":"Download the app","1746273643":"Moving Average Convergence Divergence","1747501260":"Sell conditions","1747523625":"Go back","1747674345":"Please use `.` as a decimal separator for fractional numbers.","1747682136":"Contract was cancelled.","1748754976":"Run","1749675724":"Deriv charges no commission across all account types.","1750065391":"Login time:","1753183432":"We take all complaints seriously and aim to resolve them as quickly and fairly as possible. If you are unhappy with any aspect of our service, please let us know by submitting a complaint using the guidance below:","1753226544":"remove","1753975551":"Upload passport photo page","1756678453":"break out","1758386013":"Do not get lured to fake \"Deriv\" pages!","1761038852":"Let’s continue with providing proofs of address and identity.","1761762171":"Restart last trade on error (bot ignores the unsuccessful trade): {{ checkbox }}","1762707297":"Phone number","1762746301":"MF4581125","1763123662":"Upload your NIMC slip.","1766212789":"Server maintenance starts at 06:00 GMT every Sunday and may last up to 2 hours. You may experience service disruption during this time.","1766993323":"Only letters, numbers, and underscores are allowed.","1767429330":"Add a Derived account","1768861315":"Minute","1768918213":"Only letters, space, hyphen, period, and apostrophe are allowed.","1769068935":"Choose any of these exchanges to buy cryptocurrencies:","1771037549":"Add a Deriv real account","1771592738":"Conditional block","1777847421":"This is a very common password","1778893716":"Click here","1779144409":"Account verification required","1779519903":"Should be a valid number.","1780442963":"Scan the QR code to download {{ platform }}.","1780770384":"This block gives you a random fraction between 0.0 to 1.0.","1781393492":"We do not charge a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts, your Deriv fiat and {{platform_name_derivez}} accounts and your Deriv fiat and {{platform_name_dxtrade}} accounts.","1782308283":"Quick strategy","1782395995":"Last Digit Prediction","1782690282":"Blocks menu","1782703044":"Sign up","1783526986":"How do I build a trading bot?","1783740125":"Upload your selfie","1787135187":"Postal/ZIP code is required","1787492950":"Indicators on the chart tab are for indicative purposes only and may vary slightly from the ones on the {{platform_name_dbot}} workspace.","1788515547":"<0/>For more information on submitting a complaint with the Office of the Arbiter for Financial Services, please <1>see their guidance.","1788966083":"01-07-1999","1789273878":"Payout per point","1789497185":"Make sure your passport details are clear to read, with no blur or glare","1790770969":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies","1791017883":"Check out this <0>user guide.","1791432284":"Search for country","1791971912":"Recent","1793913365":"To deposit money, please switch to your {{currency_symbol}} account.","1794815502":"Download your transaction history.","1796787905":"Please upload the following document(s).","1798943788":"You can only make deposits.","1801093206":"Get candle list","1801270786":"Ready to automate your trading strategy without writing any code? You’ve come to the right place.","1801927731":"{{platform_name_dxtrade}} accounts","1803338729":"Choose what type of contract you want to trade. For example, for the Rise/Fall trade type you can choose one of three options: Rise, Fall, or Both. Selected option will determine available options for the Purchase block.","1804620701":"Expiration","1804789128":"{{display_value}} Ticks","1806017862":"Max. ticks","1806355993":"No commission","1806503050":"Please note that some payment methods might not be available in your country.","1808058682":"Blocks are loaded successfully","1808393236":"Login","1808867555":"This block uses the variable “i” to control the iterations. With each iteration, the value of “i” is determined by the items in a given list.","1810217569":"Please refresh this page to continue.","1811109068":"Jurisdiction","1811972349":"Market","1811973475":"Returns a specific character from a given string","1812006199":"Identity verification","1812582011":"Connecting to server","1813700208":"Boom 300 Index","1813958354":"Remove comment","1815034361":"alphabetic","1815905959":"DTrader, DBot, SmartTrader, and Binary Bot","1815995250":"Buying contract","1816126006":"Trade on Deriv MT5 ({{platform_name_dmt5}}), the all-in-one FX and CFD trading platform.","1817154864":"This block gives you a random number from within a set range.","1820242322":"e.g. United States","1820332333":"Top up","1821818748":"Enter Driver License Reference number","1823177196":"Most popular","1824193700":"This block gives you the last digit of the latest tick value.","1824292864":"Call","1827607208":"File not uploaded.","1828370654":"Onboarding","1830520348":"{{platform_name_dxtrade}} Password","1831847842":"I confirm that the name and date of birth above match my chosen identity document (see below)","1833481689":"Unlock","1833499833":"Proof of identity documents upload failed","1836767074":"Search payment agent name","1837762008":"Please submit your proof of identity and proof of address to verify your account in your account settings to access the cashier.","1838639373":"Resources","1839021527":"Please enter a valid account number. Example: CR123456789","1840865068":"set {{ variable }} to Simple Moving Average Array {{ dummy }}","1841381387":"Get more wallets","1841788070":"Palladium/USD","1841996888":"Daily loss limit","1842266423":"back","1842862156":"Welcome to your Deriv X dashboard","1843658716":"If you select \"Only Downs\", you win the payout if consecutive ticks fall successively after the entry spot. No payout if any tick rises or is equal to any of the previous ticks.","1845892898":"(min: {{min_stake}} - max: {{max_payout}})","1846266243":"This feature is not available for demo accounts.","1846587187":"You have not selected your country of residence","1846664364":"{{platform_name_dxtrade}}","1849484058":"Any unsaved changes will be lost.","1850031313":"- Low: the lowest price","1850132581":"Country not found","1850659345":"- Payout: the payout of the contract","1850663784":"Submit proofs","1851052337":"Place of birth is required.","1851776924":"upper","1851951013":"Please switch to your demo account to run your DBot.","1854480511":"Cashier is locked","1854874899":"Back to list","1855566768":"List item position","1856485118":"Please <0>resubmit your proof of address to transfer funds between MT5 and Deriv accounts.","1858251701":"minute","1859308030":"Give feedback","1862182694":"Three of the most commonly used strategies in automated trading are Martingale, D'Alembert, and Oscar's Grind — you can find them all ready-made and waiting for you in DBot.","1863053247":"Please upload your identity document.","1863694618":"Trade CFDs on MT5 with forex, stocks, stock indices, commodities, and cryptocurrencies.","1863731653":"To receive your funds, contact the payment agent","1866811212":"Deposit in your local currency via an authorised, independent payment agent in your country.","1866836018":"<0/><1/>If your complaint relates to our data processing practices, you can submit a formal complaint to your local supervisory authority.","1867217564":"Index must be a positive integer","1867783237":"High-to-Close","1869315006":"See how we protect your funds to unlock the cashier.","1869787212":"Even","1870933427":"Crypto","1871196637":"True if the result of the last trade matches the selection","1871664426":"Note","1873838570":"Please verify your address","1874481756":"Use this block to purchase the specific contract you want. You may add multiple Purchase blocks together with conditional blocks to define your purchase conditions. This block can only be used within the Purchase conditions block.","1874756442":"BVI","1875702561":"Load or build your bot","1876015808":"Social Security and National Insurance Trust","1876325183":"Minutes","1877225775":"Your proof of address is verified","1877272122":"We’ve limited the maximum payout for every contract, and it differs for every asset. Your contract will be closed automatically when the maximum payout is reached.","1877410120":"What you need to do now","1877832150":"# from end","1879042430":"Appropriateness Test, WARNING:","1879412976":"Profit amount: <0>{{profit}}","1879463662":"A minimum deposit value of {{minimum_deposit}} {{currency}} is required. Otherwise, the funds will be lost and cannot be recovered.","1879651964":"<0>Pending verification","1880029566":"Australian Dollar","1880097605":"prompt for {{ string_or_number }} with message {{ input_text }}","1880875522":"Create \"get %1\"","1881018702":"hour","1881587673":"Total stake since you last cleared your stats.","1882825238":"Restart trading conditions","1883531976":"Clerks","1885708031":"#","1887852176":"Site is being updated","1889357660":"Enter a value in minutes, up to 60480 minutes (equivalent to 6 weeks).","1890171328":"By clicking Accept below and proceeding with the Account Opening you should note that you may be exposing yourself to risks (which may be significant, including the risk of loss of the entire sum invested) that you may not have the knowledge and experience to properly assess or mitigate.","1890332321":"Returns the number of characters of a given string of text, including numbers, spaces, punctuation marks, and symbols.","1894667135":"Please verify your proof of address","1898670234":"{{formatted_opening_time}} (GMT) on {{opening_day}},<0> {{opening_date}}.","1902547203":"MetaTrader 5 MacOS app","1903437648":"Blurry photo detected","1905032541":"We're now ready to verify your identity","1905589481":"If you want to change your account currency, please contact us via <0>live chat.","1906639368":"If this is the first time you try to create a password, or you have forgotten your password, please reset it.","1907884620":"Add a real Deriv Gaming account","1908239019":"Make sure all of the document is in the photo","1908686066":"Appropriateness Test Warning","1909647105":"TRX/USD","1909769048":"median","1913777654":"Switch account","1914014145":"Today","1914270645":"Default Candle Interval: {{ candle_interval_type }}","1914725623":"Upload the page that contains your photo.","1917178459":"Bank Verification Number","1917523456":"This block sends a message to a Telegram channel. You will need to create your own Telegram bot to use this block.","1917804780":"You will lose access to your Options account when it gets closed, so be sure to withdraw all your funds. (If you have a CFDs account, you can also transfer the funds from your Options account to your CFDs account.)","1918633767":"Second line of address is not in a proper format.","1918796823":"Please enter a stop loss amount.","1918832194":"No experience","1919030163":"Tips to take a good selfie","1919594496":"{{website_name}} is not affiliated with any payment agents. Customers deal with payment agents at their sole risk. Customers are advised to check the credentials of payment agents and the accuracy of any information about payment agents (on {{website_name}} or elsewhere) before using their services.","1919694313":"To start trading, transfer funds from your Deriv account into this account.","1920217537":"Compare","1920468180":"How to use the SMA block","1921634159":"A few personal details","1921914669":"Deposit with Deriv P2P","1922529883":"Boom 1000 Index","1922955556":"Use a longer keyboard pattern with more turns","1923431535":"“Stop loss” is deactivated and will only be available when “Deal cancellation” expires.","1924365090":"Maybe later","1924765698":"Place of birth*","1925090823":"Sorry, trading is unavailable in {{clients_country}}.","1928930389":"GBP/NOK","1929309951":"Employment Status","1929379978":"Switch between your demo and real accounts.","1929694162":"Compare accounts","1930899934":"Tether","1931659123":"Run on every tick","1931884033":"It seems that your date of birth in the document is not the same as your Deriv profile. Please update your date of birth in the <0>Personal details page to solve this issue.","1934450653":"For <0>Contract type, set it to Both.","1939014728":"How do I remove blocks from the workspace?","1939902659":"Signal","1940408545":"Delete this token","1941915555":"Try later","1942091675":"Cryptocurrency trading is not available for clients residing in the United Kingdom.","1943440862":"Calculates Bollinger Bands (BB) list from a list with a period","1944204227":"This block returns current account balance.","1947527527":"1. This link was sent by you","1948092185":"GBP/CAD","1949180450":"Do you offer pre-built trading bots on DBot?","1949719666":"Here are the possible reasons:","1950413928":"Submit identity documents","1952580688":"Submit passport photo page","1955219734":"Town/City*","1957759876":"Upload identity document","1958807602":"4. 'Table' takes an array of data, such as a list of candles, and displays it in a table format.","1959678342":"Highs & Lows","1960240336":"first letter","1964097111":"USD","1964165648":"Connection lost","1965916759":"Asian options settle by comparing the last tick with the average spot over the period.","1966023998":"2FA enabled","1966281100":"Console {{ message_type }} value: {{ input_message }}","1968025770":"Bitcoin Cash","1968077724":"Agriculture","1968368585":"Employment status","1970060713":"You’ve successfully deleted a bot.","1971898712":"Add or manage account","1973536221":"You have no open positions yet.","1973564194":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit or created a real {{dmt5_label}} or {{platform_name_dxtrade}} account.","1973910243":"Manage your accounts","1974273865":"This scope will allow third-party apps to view your account activity, settings, limits, balance sheets, trade purchase history, and more.","1974903951":"If you hit Yes, the info you entered will be lost.","1981940238":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}} and {{legal_entity_name_v}}.","1982912252":"Relative Strength Index (RSI) from a list with a period","1983001416":"Define your trade options such as multiplier and stake. This block can only be used with the multipliers trade type. If you select another trade type, this block will be replaced with the Trade options block.","1983358602":"This policy, which may change from time to time, applies to your account registered with {{legal_entity_name}}.","1983387308":"Preview","1983480826":"Sign in","1983544897":"P.O. Box is not accepted in address","1983676099":"Please check your email for details.","1984700244":"Request an input","1984742793":"Uploading documents","1985366224":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts and up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts.","1985637974":"Any blocks placed within this block will be executed at every tick. If the default candle interval is set to 1 minute in the Trade Parameters root block, the instructions in this block will be executed once every minute. Place this block outside of any root block.","1986094286":"- maximumLoss: Use this variable to store your maximum loss limit. You can assign any amount you want, but it must be a positive number.","1986498784":"BTC/LTC","1987080350":"Demo","1987447369":"Your cashier is locked","1988153223":"Email address","1988302483":"Take profit:","1990331072":"Proof of ownership","1990735316":"Rise Equals","1991055223":"View the market price of your favourite assets.","1991448657":"Don't know your tax identification number? Click <0>here to learn more.","1991524207":"Jump 100 Index","1994023526":"The email address you entered had a mistake or typo (happens to the best of us).","1994558521":"The platforms aren’t user-friendly.","1994600896":"This block requires a list of candles as an input parameter.","1995023783":"First line of address*","1996767628":"Please confirm your tax information.","1997138507":"If the last tick is equal to the average of the ticks, you don't win the payout.","1998199587":"You can also exclude yourself entirely for a specified duration. If, at any time, you decide to trade again, you must then contact our Customer Support to remove this self-exclusion. There will be a 24-hour-cooling-off period before you can resume trading. ","2001222130":"Check your spam or junk folder. If it's not there, try resending the email.","2004395123":"New trading tools for MT5","2004792696":"If you are a UK resident, to self-exclude from all online gambling companies licensed in Great Britain, go to <0>www.gamstop.co.uk.","2007028410":"market, trade type, contract type","2007092908":"Trade with leverage and low spreads for better returns on successful trades.","2008809853":"Please proceed to withdraw your funds before 30 November 2021.","2009620100":"DBot will not proceed with any new trades. Any ongoing trades will be completed by our system. Any unsaved changes will be lost.<0>Note: Please check your statement to view completed transactions.","2009770416":"Address:","2010759971":"Uploads successful","2010866561":"Returns the total profit/loss","2011609940":"Please input number greater than 0","2011808755":"Purchase Time","2012110280":"Synthetics, Basket indices and Derived FX","2014536501":"Card number","2014590669":"Variable '{{variable_name}}' has no value. Please set a value for variable '{{variable_name}}' to notify.","2017672013":"Please select the country of document issuance.","2020545256":"Close your account?","2021037737":"Please update your details to continue.","2023659183":"Student","2023762268":"I prefer another trading website.","2025339348":"Move away from direct light — no glare","2027625329":"Simple Moving Average Array (SMAA)","2027696535":"Tax information","2028163119":"EOS/USD","2029237955":"Labuan","2030018735":"RSI is a technical analysis tool that helps you identify the market trend. It will give you a value from 0 to 100. An RSI value of 70 and above means that the asset is overbought and the current trend may reverse, while a value of 30 and below means that the asset is oversold.","2030045667":"Message","2033648953":"This block gives you the specified candle value for a selected time interval.","2034803607":"You must be 18 years old and above.","2035258293":"Start trading with us","2035925727":"sort {{ sort_type }} {{ sort_direction }} {{ input_list }}","2036578466":"Should be {{value}}","2037481040":"Choose a way to fund your account","2037607934":"The purchase of <0>{{trade_type_name}} contract has been completed successfully for the amount of <0> {{buy_price}} {{currency}}","2037665157":"Expand All Blocks","2037906477":"get sub-list from #","2042023623":"We’re reviewing your documents. This should take about 5 minutes.","2042050260":"- Purchase price: the purchase price (stake) of the contract","2042115724":"Upload a screenshot of your account and personal details page with your name, account number, phone number, and email address.","2044086432":"The close is the latest tick at or before the end time. If you selected a specific end time, the end time is the selected time.","2046273837":"Last tick","2048110615":"Email address*","2048134463":"File size exceeded.","2049386104":"We need you to submit these in order to get this account:","2050080992":"Tron","2050170533":"Tick list","2051558666":"View transaction history","2053617863":"Please proceed to withdraw all your funds from your account.","2054889300":"Create \"%1\"","2055317803":"Copy the link to your mobile browser","2057082550":"Accept our updated <0>terms and conditions","2057419639":"Exit Spot","2059365224":"Yes, you can get started with a pre-built bot using the Quick strategy feature. You’ll find some of the most popular trading strategies here: Martingale, D'Alembert, and Oscar's Grind. Just select the strategy, enter your trade parameters, and your bot will be created for you. You can always tweak the parameters later.","2059753381":"Why did my verification fail?","2060873863":"Your order {{order_id}} is complete","2062299501":"<0>For {{title}}: Your payout will grow by this amount for every point {{trade_type}} your strike price. You will start making a profit when the payout is higher than your stake.","2062912059":"function {{ function_name }} {{ function_params }}","2063655921":"By purchasing the \"Close-to-Low\" contract, you'll win the multiplier times the difference between the close and low over the duration of the contract.","2063812316":"Text Statement","2063890788":"Cancelled","2065278286":"Spread","2067903936":"Driving licence","2070002739":"Don’t accept","2070345146":"When opening a leveraged CFD trade.","2070752475":"Regulatory Information","2071043849":"Browse","2073813664":"CFDs, Options or Multipliers","2074235904":"Last name is required.","2074497711":"The Telegram notification could not be sent","2074713563":"4.2. Submission of a complaint","2080553498":"3. Get the chat ID using the Telegram REST API (read more: https://core.telegram.org/bots/api#getupdates)","2080829530":"Sold for: {{sold_for}}","2082533832":"Yes, delete","2084693624":"Converts a string representing a date/time string into seconds since Epoch. Example: 2019-01-01 21:03:45 GMT+0800 will be converted to 1546347825. Time and time zone offset are optional.","2084925123":"Use our fiat onramp services to buy and deposit cryptocurrency into your Deriv account.","2085387371":"Must be numbers, letters, and special characters . , ' -","2085602195":"- Entry value: the value of the first tick of the contract","2086742952":"You have added a real Options account.<0/>Make a deposit now to start trading.","2086792088":"Both barriers should be relative or absolute","2088735355":"Your session and login limits","2089581483":"Expires on","2091671594":"Status","2093675079":"- Close: the closing price","2096014107":"Apply","2096456845":"Date of birth*","2097170986":"About Tether (Omni)","2097365786":"A copy of your identity document (identity card, passport)","2097381850":"Calculates Simple Moving Average line from a list with a period","2097932389":"Upload 2 separate screenshots from the personal details page and the account page via <0>https://app.astropay.com/profile","2100713124":"account","2101972779":"This is the same as the above example, using a tick list.","2102572780":"Length of digit code must be 6 characters.","2104115663":"Last login","2104397115":"Please go to your account settings and complete your personal details to enable deposits and withdrawals.","2107381257":"Scheduled cashier system maintenance","2109312805":"The spread is the difference between the buy price and sell price. A variable spread means that the spread is constantly changing, depending on market conditions. A fixed spread remains constant but is subject to alteration, at the Broker's absolute discretion.","2110365168":"Maximum number of trades reached","2111015970":"This block helps you check if your contract can be sold. If your contract can be sold, it returns “True”. Otherwise, it returns an empty string.","2111528352":"Creating a variable","2112119013":"Take a selfie showing your face","2112175277":"with delimiter","2113321581":"Add a Deriv Gaming account","2115223095":"Loss","2117073379":"Our cryptocurrency cashier is temporarily down due to system maintenance. You can access the Cashier in a few minutes when the maintenance is complete.","2117165122":"1. Create a Telegram bot and get your Telegram API token. Read more on how to create bots in Telegram here: https://core.telegram.org/bots#6-botfather","2117489390":"Auto update in {{ remaining }} seconds","2118315870":"Where do you live?","2119449126":"Example output of the below example will be:","2119710534":"FAQ","2120617758":"Set up your trade","2121227568":"NEO/USD","2122152120":"Assets","2127564856":"Withdrawals are locked","2131963005":"Please withdraw your funds from the following Deriv MT5 account(s):","2133451414":"Duration","2133470627":"This block returns the potential payout for the selected trade type. This block can be used only in the \"Purchase conditions\" root block.","2135563258":"Forex trading frequency","2136246996":"Selfie uploaded","2137901996":"This will clear all data in the summary, transactions, and journal panels. All counters will be reset to zero.","2137993569":"This block compares two values and is used to build a conditional structure.","2138861911":"Scans and photocopies are not accepted","2139171480":"Reset Up/Reset Down","2139362660":"left side","2141055709":"New {{type}} password","2141873796":"Get more info on <0>CFDs, <1>multipliers, and <2>options.","2143803283":"Purchase Error","2144609616":"If you select \"Reset-Down”, you win the payout if the exit spot is strictly lower than either the entry spot or the spot at reset time.","2145690912":"Income Earning","2145995536":"Create new account","2146336100":"in text %1 get %2","2146698770":"Pro tip: You can also click and drag out the desired block","2146892766":"Binary options trading experience","-612174191":"First line of address is required","-242734402":"Only {{max}} characters, please.","-378415317":"State is required","-1784470716":"State is not in a proper format","-1699820408":"Please enter a {{field_name}} under {{max_number}} characters.","-1575567374":"postal/ZIP code","-1497654315":"Our accounts and services are unavailable for the Jersey postal code.","-755626951":"Complete your address details","-1024240099":"Address","-584911871":"Select wallet currency","-1461267236":"Please choose your currency","-1352330125":"CURRENCY","-1027595143":"Less than $25,000","-40491332":"$25,000 - $50,000","-1139806939":"$50,001 - $100,000","-626752657":"0-1 year","-532014689":"1-2 years","-1001024004":"Over 3 years","-790513277":"6-10 transactions in the past 12 months","-580085300":"11-39 transactions in the past 12 months","-654781670":"Primary","-1717373258":"Secondary","-996132458":"Construction","-915003867":"Health","-1430012453":"Information & Communications Technology","-987824916":"Science & Engineering","-146630682":"Social & Cultural","-761306973":"Manufacturing","-739367071":"Employed","-1156937070":"$500,001 - $1,000,000","-315534569":"Over $1,000,000","-2068544539":"Salaried Employee","-531314998":"Investments & Dividends","-1235114522":"Pension","-1298056749":"State Benefits","-449943381":"Savings & Inheritance","-1631552645":"Professionals","-474864470":"Personal Care, Sales and Service Workers","-1129355784":"Agricultural, Forestry and Fishery Workers","-1242914994":"Craft, Metal, Electrical and Electronics Workers","-1317824715":"Cleaners and Helpers","-1592729751":"Mining, Construction, Manufacturing and Transport Workers","-2137323480":"Company Ownership","-1590574533":"Divorce Settlement","-1667683002":"Inheritance","-1237843731":"Investment Income","-777506574":"Sale of Property","-1232613003":"<0>Verification failed. <1>Why?","-2029508615":"<0>Need verification.<1>Verify now","-1161338910":"First name is required.","-1161818065":"Last name should be between 2 and 50 characters.","-1281693513":"Date of birth is required.","-26599672":"Citizenship is required","-912174487":"Phone is required.","-673765468":"Letters, numbers, spaces, periods, hyphens and forward slashes only.","-1356204661":"This Tax Identification Number (TIN) is invalid. You may continue with account creation, but to facilitate future payment processes, valid tax information will be required.","-1823540512":"Personal details","-1227878799":"Speculative","-1174064217":"Mr","-855506127":"Ms","-621555159":"Identity information","-204765990":"Terms of use","-231863107":"No","-870902742":"How much knowledge and experience do you have in relation to online trading?","-1929477717":"I have an academic degree, professional certification, and/or work experience related to financial services.","-1540148863":"I have attended seminars, training, and/or workshops related to trading.","-922751756":"Less than a year","-542986255":"None","-1337206552":"In your understanding, CFD trading allows you to","-456863190":"Place a position on the price movement of an asset where the outcome is a fixed return or nothing at all.","-1314683258":"Make a long-term investment for a guaranteed profit.","-1546090184":"How does leverage affect CFD trading?","-1636427115":"Leverage helps to mitigate risk.","-800221491":"Leverage guarantees profits.","-811839563":"Leverage lets you open large positions for a fraction of trade value, which may result in increased profit or loss.","-1185193552":"Close your trade automatically when the loss is equal to or more than a specified amount, as long as there is adequate market liquidity.","-1046354":"Close your trade automatically when the profit is equal to or more than a specified amount, as long as there is adequate market liquidity.","-1842858448":"Make a guaranteed profit on your trade.","-860053164":"When trading multipliers.","-1250327770":"When buying shares of a company.","-1222388581":"All of the above.","-931052769":"Submit verification","-1004605898":"Tips","-1938142055":"Documents uploaded","-448090287":"The link only works on mobile devices","-1244287721":"Something's gone wrong","-241258681":"You'll need to restart your verification on your computer","-929254273":"Get secure link","-2021867851":"Check back here to finish the submission","-1547069149":"Open the link and complete the tasks","-1767652006":"Here's how to do it:","-277611959":"You can now return to your computer to continue","-724178625":"Make sure full document is visible","-1519380038":"Glare detected","-1895280620":"Make sure your card details are clear to read, with no blur or glare","-1464447919":"Make sure your permit details are clear to read, with no blur or glare","-1436160506":"Make sure details are clear to read, with no blur or glare","-759124288":"Close","-759118956":"Redo","-753375398":"Enlarge image","-1042933881":"Driver's license","-1503134764":"Face photo page","-1335343167":"Sorry, no mobile phone bills","-699045522":"Documents you can use to verify your identity","-543666102":"It must be an official photo ID","-903877217":"These are the documents most likely to show your current home address","-1356835948":"Choose document","-1364375936":"Select a %{country} document","-401586196":"or upload photo – no scans or photocopies","-3110517":"Take a photo with your phone","-2033894027":"Submit identity card (back)","-20684738":"Submit license (back)","-1359585500":"Submit license (front)","-106779602":"Submit residence permit (back)","-1287247476":"Submit residence permit (front)","-1954762444":"Restart the process on the latest version of Safari","-261174676":"Must be under 10MB.","-685885589":"An error occurred while loading the component","-502539866":"Your face is needed in the selfie","-1377968356":"Please try again","-1226547734":"Try using a JPG or PNG file","-849068301":"Loading...","-1730346712":"Loading","-1849371752":"Check that your number is correct","-309848900":"Copy","-1424436001":"Send link","-1093833557":"How to scan a QR code","-1408210605":"Point your phone’s camera at the QR code","-1773802163":"If it doesn’t work, download a QR code scanner from Google Play or the App Store","-109026565":"Scan QR code","-1644436882":"Get link via SMS","-1667839246":"Enter mobile number","-1533172567":"Enter your mobile number:","-1352094380":"Send this one-time link to your phone","-28974899":"Get your secure link","-359315319":"Continue","-1279080293":"2. Your desktop window stays open","-102776692":"Continue with the verification","-89152891":"Take a photo of the back of your card","-1646367396":"Take a photo of the front of your card","-1350855047":"Take a photo of the front of your license","-2119367889":"Take a photo using the basic camera mode instead","-342915396":"Take a photo","-419040068":"Passport photo page","-1354983065":"Refresh","-1925063334":"Recover camera access to continue face verification","-54784207":"Camera access is denied","-1392699864":"Allow camera access","-269477401":"Provide the whole document page for best results","-864639753":"Upload back of card from your computer","-1309771027":"Upload front of license from your computer","-1722060225":"Take photo","-565732905":"Selfie","-1703181240":"Check that it is connected and functional. You can also continue verification on your phone","-2043114239":"Camera not working?","-2029238500":"It may be disconnected. Try using your phone instead.","-468928206":"Make sure your device's camera works","-466246199":"Camera not working","-698978129":"Remember to press stop when you're done. Redo video actions","-538456609":"Looks like you took too long","-781816433":"Photo of your face","-1471336265":"Make sure your selfie clearly shows your face","-1375068556":"Check selfie","-1914530170":"Face forward and make sure your eyes are clearly visible","-776541617":"We'll compare it with your document","-478752991":"Your link will expire in one hour","-1859729380":"Keep this window open while using your mobile","-1283761937":"Resend link","-629011256":"Don't refresh this page","-1005231905":"Once you've finished we'll take you to the next step","-542134805":"Upload photo","-1462975230":"Document example","-1472844935":"The photo should clearly show your document","-189310067":"Account closed","-849320995":"Assessments","-773766766":"Email and passwords","-1466827732":"Self exclusion","-1498206510":"Account limits","-241588481":"Login history","-966136867":"Connected apps","-213009361":"Two-factor authentication","-1214803297":"Dashboard-only path","-526636259":"Error 404","-1030759620":"Government Officers","-1196936955":"Upload a screenshot of your name and email address from the personal information section.","-1286823855":"Upload your mobile bill statement showing your name and phone number.","-1309548471":"Upload your bank statement showing your name and account details.","-1410396115":"Upload a photo showing your name and the first six and last four digits of your card number. If the card does not display your name, upload the bank statement showing your name and card number in the transaction history.","-3805155":"Upload a screenshot of either of the following to process the transaction:","-1523487566":"- your account profile section on the website","-613062596":"- the Account Information page on the app","-1718304498":"User ID","-609424336":"Upload a screenshot of your name, account number, and email address from the personal details section of the app or profile section of your account on the website.","-1954436643":"Upload a screenshot of your username on the General Information page at <0>https://onlinenaira.com/members/index.htm","-79853954":"Upload a screenshot of your account number and phone number on the Bank Account/Mobile wallet page at <0>https://onlinenaira.com/members/bank.htm","-1192882870":"Upload a screenshot of your name and account number from the personal details section.","-1437206131":"JPEG JPG PNG PDF GIF","-820458471":"1 - 6 months old","-155705811":"A clear colour photo or scanned image","-587941902":"Issued under your name with your current address","-438669274":"JPEG JPG PNG PDF GIF","-723198394":"File size should be 8MB or less","-1948369500":"File uploaded is not supported","-1040865880":"Drop files here..","-1120954663":"First name*","-1659980292":"First name","-1466268810":"Please remember that it is your responsibility to keep your answers accurate and up to date. You can update your personal details at any time in your <0>account settings.","-32386760":"Name","-766265812":"first name","-1857534296":"John","-1282749116":"last name","-1485480657":"Other details","-1784741577":"date of birth","-1315571766":"Place of birth","-2040322967":"Citizenship","-789291456":"Tax residence*","-1692219415":"Tax residence","-1903720068":"The country in which you meet the criteria for paying taxes. Usually the country in which you physically reside.","-651516152":"Tax Identification Number","-344715612":"Employment status*","-1543016582":"I hereby confirm that the tax information I provided is true and complete. I will also inform {{legal_entity_name}} about any changes to this information.","-1387062433":"Account opening reason","-222283483":"Account opening reason*","-190838815":"We need this for verification. If the information you provide is fake or inaccurate, you won’t be able to deposit and withdraw.","-1113902570":"Details","-71696502":"Previous","-1541554430":"Next","-705047643":"Sorry, an error occured. Please select another file.","-1664309884":"Tap here to upload","-987011273":"Your proof of ownership isn't required.","-808299796":"You are not required to submit proof of ownership at this time. We will inform you if proof of ownership is required in the future.","-179726573":"We’ve received your proof of ownership.","-813779897":"Proof of ownership verification passed.","-638756912":"Black out digits 7 to 12 of the card number that’s shown on the front of your debit/credit card.⁤","-2073934245":"The financial trading services offered on this site are only suitable for customers who accept the possibility of losing all the money they invest and who understand and have experience of the risk involved in the purchase of financial contracts. Transactions in financial contracts carry a high degree of risk. If the contracts you purchased expire as worthless, you will lose all your investment, which includes the contract premium.","-1166068675":"Your account will be opened with {{legal_entity_name}}, regulated by the UK Gaming Commission (UKGC), and will be subject to the laws of the Isle of Man.","-975118358":"Your account will be opened with {{legal_entity_name}}, regulated by the Malta Financial Services Authority (MFSA), and will be subject to the laws of Malta.","-680528873":"Your account will be opened with {{legal_entity_name}} and will be subject to the laws of Samoa.","-1125193491":"Add account","-2068229627":"I am not a PEP, and I have not been a PEP in the last 12 months.","-684271315":"OK","-740157281":"Trading Experience Assessment","-1720468017":"In providing our services to you, we are required to obtain information from you in order to assess whether a given product or service is appropriate for you.","-186841084":"Change your login email","-907403572":"To change your email address, you'll first need to unlink your email address from your {{identifier_title}} account.","-1850792730":"Unlink from {{identifier_title}}","-2139303636":"You may have followed a broken link, or the page has moved to a new address.","-1448368765":"Error code: {{error_code}} page not found","-1265833982":"Accept","-839094775":"Back","-2145244263":"This field is required","-254792921":"You can only make deposits at the moment. To enable withdrawals, please complete your financial assessment.","-1437017790":"Financial information","-70342544":"We’re legally obliged to ask for your financial information.","-1100235269":"Industry of employment","-684388823":"Estimated net worth","-39038029":"Trading experience","-601903492":"Forex trading experience","-1012699451":"CFD trading experience","-1894668798":"Other trading instruments experience","-1026468600":"Other trading instruments frequency","-179005984":"Save","-307865807":"Risk Tolerance Warning","-690100729":"Yes, I understand the risk.","-2010628430":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the high risk of losing your money. <0/><0/> To continue, you must confirm that you understand your capital is at risk.","-863770104":"Please note that by clicking ‘OK’, you may be exposing yourself to risks. You may not have the knowledge or experience to properly assess or mitigate these risks, which may be significant, including the risk of losing the entire sum you have invested.","-1292808093":"Trading Experience","-884768257":"You should enter 0-35 characters.","-2113555886":"Only letters, numbers, space, and hyphen are allowed.","-874280157":"This Tax Identification Number (TIN) is invalid. You may continue using it, but to facilitate future payment processes, valid tax information will be required.","-1037916704":"Miss","-634958629":"We use the information you give us only for verification purposes. All information is kept confidential.","-731992635":"Title*","-352888977":"Title","-136976514":"Country of residence*","-945104751":"We’re legally obliged to ask for your tax information.","-1702919018":"Second line of address (optional)","-1124948631":"Professional Client","-259515058":"By default, all {{brand_website_name}} clients are retail clients but anyone can request to be treated as a professional client.","-1463348492":"I would like to be treated as a professional client.","-1958764604":"Email preference","-2121071263":"Check this box to receive updates via email.","-2068064150":"Get updates about Deriv products, services and events.","-1558679249":"Please make sure your information is correct or it may affect your trading experience.","-1822545742":"Ether Classic","-1334641066":"Litecoin","-1214036543":"US Dollar","-1782590355":"No currency has been set for this account","-2116332353":"Please close your positions in the following Deriv account(s):","-2048005267":"{{number_of_positions}} position(s)","-1923892687":"Please withdraw your funds from the following Deriv X account(s):","-1629894615":"I have other financial priorities.","-844051272":"I want to stop myself from trading.","-1113965495":"I’m no longer interested in trading.","-1224285232":"Customer service was unsatisfactory.","-9323953":"Remaining characters: {{remaining_characters}}","-2061895474":"Closing your account will automatically log you out. We shall delete your personal information as soon as our legal obligations are met.","-203298452":"Close account","-937707753":"Go Back","-1219849101":"Please select at least one reason","-484540402":"An error occurred","-1911549768":"Inaccessible MT5 account(s)","-1869355019":"Action required","-1030102424":"You can't trade on Deriv.","-448385353":"You can't make transactions.","-1058447223":"Before closing your account:","-912764166":"Withdraw your funds.","-60139953":"We shall delete your personal information as soon as our legal obligations are met, as mentioned in the section on Data Retention in our <0>Security and privacy policy","-536187647":"Confirm revoke access?","-1357606534":"Permission","-570222048":"Revoke access","-1076138910":"Trade","-488597603":"Trading information","-1666909852":"Payments","-1725454783":"Failed","-506510414":"Date and time","-1708927037":"IP address","-80717068":"Apps you have linked to your <0>Deriv password:","-2143208677":"Click the <0>Change password button to change your Deriv MT5 password.","-9570380":"Use the {{platform_name_dxtrade}} password to log in to your {{platform_name_dxtrade}} accounts on the web and mobile apps.","-2131200819":"Disable","-200487676":"Enable","-1840392236":"That's not the right code. Please try again.","-2067796458":"Authentication code","-790444493":"Protect your account with 2FA. Each time you log in to your account, you will need to enter your password and an authentication code generated by a 2FA app on your smartphone.","-368010540":"You have enabled 2FA for your Deriv account.","-403552929":"To disable 2FA, please enter the six-digit authentication code generated by your 2FA app below:","-752939584":"How to set up 2FA for your Deriv account","-90649785":"Click here to copy key","-206376148":"Key copied!","-650175948":"A recent bank statement or government-issued letter with your name and address.","-2006895756":"1. Address","-716361389":"An accurate and complete address helps to speed up your verification process.","-1315410953":"State/Province","-890084320":"Save and submit","-1592318047":"See example","-1376950117":"That file format isn't supported. Please upload .pdf, .png, .jpg, or .jpeg files only.","-1272489896":"Please complete this field.","-397487797":"Enter your full card number","-153346659":"Upload your selfie.","-602131304":"Passport number","-1051213440":"Upload the front and back of your identity card.","-1600807543":"First, enter your identity card number and the expiry date.","-1139923664":"Next, upload the front and back of your identity card.","-783705755":"Upload the front of your identity card.","-566750665":"NIMC slip and proof of age","-1465944279":"NIMC slip number","-429612996":"Next, upload both of the following documents.","-376981174":"Upload your proof of age: birth certificate or age declaration document.","-1515286538":"Please enter your document number. ","-477761028":"Voter ID","-1466346630":"CPF","-1694758788":"Enter your document number","-1458676679":"You should enter 2-50 characters.","-1176889260":"Please select a document type.","-612752984":"These are default limits that we apply to your accounts.","-1598263601":"To learn more about trading limits and how they apply, please go to the <0>Help Centre.","-1411635770":"Learn more about account limits","-1340125291":"Done","-1101543580":"Limit","-858297154":"Represents the maximum amount of cash that you may hold in your account. If the maximum is reached, you will be asked to withdraw funds.","-976258774":"Not set","-1182362640":"Represents the maximum aggregate payouts on outstanding contracts in your portfolio. If the maximum is attained, you may not purchase additional contracts without first closing out existing positions.","-1781293089":"Maximum aggregate payouts on open positions","-1412690135":"*Any limits in your Self-exclusion settings will override these default limits.","-1598751496":"Represents the maximum volume of contracts that you may purchase in any given trading day.","-173346300":"Maximum daily turnover","-1502578110":"Your account is fully authenticated and your withdrawal limits have been lifted.","-138380129":"Total withdrawal allowed","-854023608":"To increase limit please verify your identity","-1500958859":"Verify","-1662154767":"a recent utility bill (e.g. electricity, water, gas, landline, or internet), bank statement, or government-issued letter with your name and this address.","-223216785":"Second line of address*","-594456225":"Second line of address","-1940457555":"Postal/ZIP Code*","-1964954030":"Postal/ZIP Code","-516397235":"Be careful who you share this token with. Anyone with this token can perform the following actions on your account behalf","-989216986":"Add accounts","-617480265":"Delete token","-316749685":"Are you sure you want to delete this token?","-786372363":"Learn more about API token","-55560916":"To access our mobile apps and other third-party apps, you'll first need to generate an API token.","-198329198":"API Token","-955038366":"Copy this token","-1668692965":"Hide this token","-1661284324":"Show this token","-605778668":"Never","-1628008897":"Token","-1238499897":"Last Used","-1171226355":"Length of token name must be between {{MIN_TOKEN}} and {{MAX_TOKEN}} characters.","-1803339710":"Maximum {{MAX_TOKEN}} characters.","-408613988":"Select scopes based on the access you need.","-5605257":"This scope will allow third-party apps to withdraw to payment agents and make inter-account transfers for you.","-1373485333":"This scope will allow third-party apps to view your trading history.","-758221415":"This scope will allow third-party apps to open accounts for you, manage your settings and token usage, and more. ","-1117963487":"Name your token and click on 'Create' to generate your token.","-2005211699":"Create","-2115275974":"CFDs","-1879666853":"Deriv MT5","-460645791":"You are limited to one fiat account. You won’t be able to change your account currency if you have already made your first deposit or created a real {{dmt5_label}} account.","-1146960797":"Fiat currencies","-1959484303":"Cryptocurrencies","-561724665":"You are limited to one fiat currency only","-2087317410":"Oops, something went wrong.","-509054266":"Anticipated annual turnover","-1117345066":"Choose the document type","-651192353":"Sample:","-1044962593":"Upload Document","-164448351":"Show less","-1361653502":"Show more","-337620257":"Switch to real account","-2120454054":"Add a real account","-38915613":"Unsaved changes","-2137450250":"You have unsaved changes. Are you sure you want to discard changes and leave this page?","-1067082004":"Leave Settings","-1982432743":"It appears that the address in your document doesn’t match the address\n in your Deriv profile. Please update your personal details now with the\n correct address.","-1451334536":"Continue trading","-1525879032":"Your documents for proof of address is expired. Please submit again.","-1425489838":"Proof of address verification not required","-1008641170":"Your account does not need address verification at this time. We will inform you if address verification is required in the future.","-60204971":"We could not verify your proof of address","-1944264183":"To continue trading, you must also submit a proof of identity.","-1088324715":"We’ll review your documents and notify you of its status within 1 - 3 working days.","-329713179":"Ok","-1926456107":"The ID you submitted is expired.","-555047589":"It looks like your identity document has expired. Please try again with a valid document.","-841187054":"Try Again","-2097808873":"We were unable to verify your ID with the details you provided. ","-228284848":"We were unable to verify your ID with the details you provided.","-1391934478":"Your ID is verified. You will also need to submit proof of your address.","-118547687":"ID verification passed","-200989771":"Go to personal details","-1358357943":"Please check and update your postal code before submitting proof of identity.","-1401994581":"Your personal details are missing","-2004327866":"Please select a valid country of document issuance.","-1664159494":"Country","-749870311":"Please contact us via <0>live chat.","-1084991359":"Proof of identity verification not required","-1981334109":"Your account does not need identity verification at this time. We will inform you if identity verification is required in the future.","-182918740":"Your proof of identity submission failed because:","-246893488":"JPEG, JPG, PNG, PDF, or GIF","-1454880310":"Must be valid for at least 6 months","-100534371":"Before uploading, please ensure that you’re facing forward in the selfie, your face is within the frame, and your eyes are clearly visible even if you’re wearing glasses.","-1529523673":"Confirm and upload","-856213726":"You must also submit a proof of address.","-1389323399":"You should enter {{min_number}}-{{max_number}} characters.","-1313806160":"Please request a new password and check your email for the new token.","-1598167506":"Success","-1077809489":"You have a new {{platform}} password to log in to your {{platform}} accounts on the web and mobile apps.","-2068479232":"{{platform}} password","-1332137219":"Strong passwords contain at least 8 characters that include uppercase and lowercase letters, numbers, and symbols.","-1597186502":"Reset {{platform}} password","-848721396":"These trading limits are optional, and you can strengthen them at any time. If you don’t wish to set a specific limit, leave the field blank. If you live in the United Kingdom, Customer Support can only remove or weaken your trading limits after 24 hours of receiving the request. If you live in the Isle of Man, Customer Support can only remove or weaken your trading limits after your trading limit period has expired.","-469096390":"These trading limits are optional, and you can strengthen them at any time. If you don’t wish to set a specific limit, leave the field blank. Customer Support can only remove or weaken your trading limits after 24 hours of receiving the request.","-42808954":"You can also exclude yourself entirely for a specified duration. This can only be removed once your self-exclusion has expired. If you wish to continue trading once your self-exclusion period expires, you must contact Customer Support by calling <0>+447723580049 to lift this self-exclusion. Requests by chat or email shall not be entertained. There will be a 24-hour cooling-off period before you can resume trading.","-1088698009":"These self-exclusion limits help you control the amount of money and time you spend trading on {{platform_name_trader}}, {{platform_name_dbot}}, {{platform_name_smarttrader}} and {{platform_name_bbot}} on Deriv. The limits you set here will help you exercise <0>responsible trading.","-1702324712":"These limits are optional, and you can adjust them at any time. You decide how much and how long you’d like to trade. If you don’t wish to set a specific limit, leave the field blank.","-1819875658":"You can also exclude yourself entirely for a specified duration. Once the self-exclusion period has ended, you can either extend it further or resume trading immediately. If you wish to reduce or remove the self-exclusion period, contact our <0>Customer Support.","-1031814119":"About trading limits and self-exclusion","-183468698":"Trading limits and self-exclusion","-933963283":"No, review my limits","-1759860126":"Yes, log me out immediately","-572347855":"{{value}} mins","-313333548":"You’ll be able to adjust these limits at any time. You can reduce your limits from the <0>self-exclusion page. To increase or remove your limits, please contact our <1>Customer Support team.","-2123139671":"Your stake and loss limits","-1250802290":"24 hours","-2070080356":"Max. total stake","-1545823544":"7 days","-180147209":"You will be automatically logged out from each session after this time limit.","-374553538":"Your account will be excluded from the website until this date (at least 6 months, up to 5 years).","-2121421686":"To self-exclude from all online gambling companies licensed in Great Britain, go to <0>www.gamstop.co.uk.","-2105708790":"Your maximum account balance and open positions","-1960600163":"Once your account balance reaches this amount, you will not be able to deposit funds into your account.","-1073845224":"No. of open position(s)","-288196326":"Your maximum deposit limit","-568749373":"Max. deposit limit","-1884902844":"Max. deposit limit per day","-545085253":"Max. deposit limit over 7 days","-1031006762":"Max. deposit limit over 30 days","-1116871438":"Max. total loss over 30 days","-2134714205":"Time limit per session","-1884271702":"Time out until","-1265825026":"Timeout time must be greater than current time.","-1332882202":"Timeout time cannot be more than 6 weeks.","-1635977118":"Exclude time cannot be less than 6 months.","-1617352279":"The email is in your spam folder (Sometimes things get lost there).","-547557964":"We can’t deliver the email to this address (Usually because of firewalls or filtering).","-142444667":"Please click on the link in the email to change your Deriv MT5 password.","-742748008":"Check your email and click the link in the email to proceed.","-84068414":"Still didn't get the email? Please contact us via <0>live chat.","-428335668":"You will need to set a password to complete the process.","-1743024217":"Select Language","-30772747":"Your personal details have been saved successfully.","-1107320163":"Automate your trading, no coding needed.","-829643221":"Multipliers trading platform.","-1585707873":"Financial Commission","-199154602":"Vanuatu Financial Services Commission","-191165775":"Malta Financial Services Authority","-194969520":"Counterparty company","-1089385344":"Deriv (SVG) LLC","-2019617323":"Deriv (BVI) Ltd","-112814932":"Deriv (FX) Ltd","-1131400885":"Deriv Investments (Europe) Limited","-1471207907":"All assets","-781132577":"Leverage","-1591882610":"Synthetics","-543177967":"Stock indices","-362324454":"Commodities","-1071336803":"Platform","-820028470":"Options & Multipliers","-1018945969":"TradersHub","-1856204727":"Reset","-213142918":"Deposits and withdrawals temporarily unavailable ","-224804428":"Transactions","-1186807402":"Transfer","-1308346982":"Derived","-1145604233":"Trade CFDs on MT5 with Derived indices that simulate real-world market movements.","-328128497":"Financial","-1484404784":"Trade CFDs on MT5 with forex, stock indices, commodities, and cryptocurrencies.","-659955365":"Swap-Free","-133406819":"Trade swap-free CFDs on MT5 with synthetics, forex, stocks, stock indices, cryptocurrencies and ETFs.","-1210359945":"Transfer funds to your accounts","-81256466":"You need a Deriv account to create a CFD account.","-699372497":"Trade with leverage and tight spreads for better returns on successful trades. <0>Learn more","-1884966862":"Get more Deriv MT5 account with different type and jurisdiction.","-596618970":"Other CFDs","-982095728":"Get","-1277942366":"Total assets","-1255879419":"Trader's Hub","-493788773":"Non-EU","-673837884":"EU","-230566990":"The following documents you submitted did not pass our checks:","-846812148":"Proof of address.","-2055865877":"Non-EU regulation","-643108528":"Non-EU and EU regulation","-172898036":"CR5236585","-1665192032":"Multipliers account","-744999940":"Deriv account","-1638358352":"Get the upside of CFDs without risking more than your initial stake with <0>Multipliers.","-749129977":"Get a real Deriv account, start trading and manage your funds.","-1814994113":"CFDs <0>{{compare_accounts_title}}","-318106501":"Trade CFDs on MT5 with synthetics, baskets, and derived FX.","-1328701106":"Trade CFDs on MT5 with forex, stocks, stock indices, synthetics, cryptocurrencies, and commodities.","-2146691203":"Choice of regulation","-249184528":"You can create real accounts under EU or non-EU regulation. Click the <0><0/> icon to learn more about these accounts.","-1505234170":"Trader's Hub tour","-181080141":"Trading hub tour","-1042025112":"Need help moving around?<0>We have a short tutorial that might help. Hit Repeat tour to begin.","-1536335438":"These are the trading accounts available to you. You can click on an account’s icon or description to find out more","-1034232248":"CFDs or Multipliers","-1320214549":"You can choose between CFD trading accounts and Multipliers accounts","-2069414013":"Click the ‘Get’ button to create an account","-951876657":"Top-up your account","-1945421757":"Once you have an account click on ‘Deposit’ or ‘Transfer’ to add funds to an account","-1965920446":"Start trading","-514389291":"<0>EU statutory disclaimer: CFDs are complex instruments and come with a high risk of losing money rapidly due to leverage. <0>71% of retail investor accounts lose money when trading CFDs with this provider. You should consider whether you understand how CFDs work and whether you can afford to take the high risk of losing your money.","-1975494965":"Cashier","-1787304306":"Deriv P2P","-2021135479":"This field is required.","-1870909526":"Our server cannot retrieve an address.","-582721696":"The current allowed withdraw amount is {{format_min_withdraw_amount}} to {{format_max_withdraw_amount}} {{currency}}","-42592103":"Deposit cryptocurrencies","-60779216":"Withdrawals are temporarily unavailable due to system maintenance. You can make your withdrawals when the maintenance is complete.","-215186732":"You’ve not set your country of residence. To access Cashier, please update your country of residence in the Personal details section in your account settings.","-1392897508":"The identification documents you submitted have expired. Please submit valid identity documents to unlock Cashier. ","-954082208":"Your cashier is currently locked. Please contact us via <0>live chat to find out how to unlock it.","-929148387":"Please set your account currency to enable deposits and withdrawals.","-541392118":"Your account has not been authenticated. Please submit your <0>proof of identity and <1>proof of address to authenticate your account and access your cashier.","-247122507":"Your cashier is locked. Please complete the <0>financial assessment to unlock it.","-1443721737":"Your cashier is locked. See <0>how we protect your funds before you proceed.","-901712457":"Your access to Cashier has been temporarily disabled as you have not set your 30-day turnover limit. Please go to <0>Self-exclusion and set your 30-day turnover limit.","-166472881":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable deposits and withdrawals.","-666905139":"Deposits are locked","-378858101":"Your <0>personal details are incomplete. Please go to your account settings and complete your personal details to enable deposits.","-1318742415":"Your account has not been authenticated. Please submit your <0>proof of identity and <1>proof of address to authenticate your account and request for withdrawals.","-1923809087":"Unfortunately, you can only make deposits. Please contact us via <0>live chat to enable withdrawals.","-172277021":"Cashier is locked for withdrawals","-1624999813":"It seems that you've no commissions to withdraw at the moment. You can make withdrawals once you receive your commissions.","-1077304626":"Amount ({{currency}})","-1559994981":"Approximate value","-190084602":"Transaction","-1995606668":"Amount","-811190405":"Time","-1984478597":"The details of this transaction is available on CoinsPaid.","-1272778997":"We've sent you an email.","-89973258":"Resend email in {{seconds}}s","-1332236294":"Please verify your identity","-1675848843":"Error","-283017497":"Retry","-1196049878":"First line of home address","-1326406485":"Postal Code/ZIP","-939625805":"Telephone","-442575534":"Email verification failed","-1459042184":"Update your personal details","-1603543465":"We can't validate your personal details because there is some information missing.","-614516651":"Need help? <0>Contact us.","-203002433":"Deposit now","-720315013":"You have no funds in your {{currency}} account","-2052373215":"Please make a deposit to use this feature.","-379487596":"{{selected_percentage}}% of available balance ({{format_amount}} {{currency__display_code}})","-1957498244":"more","-299033842":"Recent transactions","-704362715":"{{amount}} {{currency}} on {{submit_date_moment}}","-1534990259":"Transaction hash:","-1612346919":"View all","-1059419768":"Notes","-316545835":"Please ensure <0>all details are <0>correct before making your transfer.","-949073402":"I confirm that I have verified the client’s transfer information.","-1752211105":"Transfer now","-598073640":"About Tether (Ethereum)","-275902914":"Tether on Ethereum (eUSDT)","-1188009792":"Tether on Omni Layer (USDT)","-1239329687":"Tether was originally created to use the bitcoin network as its transport protocol ‒ specifically, the Omni Layer ‒ to allow transactions of tokenised traditional currency.","-1705887186":"Your deposit is successful.","-142361708":"In process","-1582681840":"We’ve received your request and are waiting for more blockchain confirmations.","-1626218538":"You’ve cancelled your withdrawal request.","-1062841150":"Your withdrawal is unsuccessful due to an error on the blockchain. Please <0>contact us via live chat for more info.","-630780094":"We’re awaiting confirmation from the blockchain.","-1525882769":"Your withdrawal is unsuccessful. We've sent you an email with more information.","-298601922":"Your withdrawal is successful.","-1463156905":"Learn more about payment methods","-2013448791":"Want to exchange between e-wallet currencies? Try <0>Ewallet.Exchange","-1547606079":"We accept the following cryptocurrencies:","-1517325716":"Deposit via the following payment methods:","-639677539":"Buy cryptocurrencies","-1560098002":"Buy cryptocurrencies via fiat onramp","-541870313":"Deposit via payment agents","-474666134":"This is your {{currency_code}} account {{loginid}}","-197251450":"Don't want to trade in {{currency_code}}? You can open another cryptocurrency account.","-781389987":"This is your {{regulation_text}} {{currency_code}} account {{loginid}}","-1068036170":"We do not charge a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts and between your Deriv fiat and {{platform_name_dxtrade}} accounts.","-2056016338":"You’ll not be charged a transfer fee for transfers in the same currency between your Deriv fiat and {{platform_name_mt5}} accounts.","-599632330":"We’ll charge a 1% transfer fee for transfers in different currencies between your Deriv fiat and {{platform_name_mt5}} accounts and between your Deriv fiat and {{platform_name_dxtrade}} accounts.","-1196994774":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency accounts.","-1361372445":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts, your Deriv cryptocurrency and {{platform_name_derivez}} accounts, and your Deriv cryptocurrency and {{platform_name_dxtrade}} accounts.","-993556039":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts and between your Deriv cryptocurrency and {{platform_name_dxtrade}} accounts.","-1382702462":"We’ll charge a 2% transfer fee or {{minimum_fee}} {{currency}}, whichever is higher, for transfers between your Deriv cryptocurrency and Deriv MT5 accounts.","-1995859618":"You may transfer between your Deriv fiat, cryptocurrency, {{platform_name_mt5}}, {{platform_name_derivez}} and {{platform_name_dxtrade}} accounts.","-545616470":"Each day, you can make up to {{ allowed_internal }} transfers between your Deriv accounts, up to {{ allowed_mt5 }} transfers between your Deriv and {{platform_name_mt5}} accounts, up to {{ allowed_derivez }} transfers between your Deriv and {{platform_name_derivez}} accounts, and up to {{ allowed_dxtrade }} transfers between your Deriv and {{platform_name_dxtrade}} accounts.","-1151983985":"Transfer limits may vary depending on the exchange rates.","-1747571263":"Please bear in mind that some transfers may not be possible.","-757062699":"Transfers may be unavailable due to high volatility or technical issues and when the exchange markets are closed.","-1344870129":"Deriv accounts","-1156059326":"You have {{number}} transfer remaining for today.","-1109729546":"You will be able to transfer funds between MT5 accounts and other accounts once your address is verified.","-1593609508":"Transfer between your accounts in Deriv","-464965808":"Transfer limits: <0 /> - <1 />","-553249337":"Transfers are locked","-1638172550":"To enable this feature you must complete the following:","-1949883551":"You only have one account","-1149845849":"Back to Trader's Hub","-1232852916":"We’re switching over to your {{currency}} account to view the transaction.","-993393818":"Binance Smart Chain","-561858764":"Polygon (Matic)","-410890127":"Ethereum (ERC20)","-1059526741":"Ethereum (ETH)","-1615615253":"We do not support Tron, to deposit please use only Ethereum ({{token}}).","-1831000957":"Please select the network from where your deposit will come from.","-314177745":"Unfortunately, we couldn't get the address since our server was down. Please click Refresh to reload the address or try again later.","-1345040662":"Looking for a way to buy cryptocurrency?","-759000391":"We were unable to verify your information automatically. To enable this function, you must complete the following:","-1632668764":"I accept","-544232635":"Please go to the Deposit page to generate an address. Then come back here to continue with your transaction.","-1161069724":"Please copy the crypto address you see below. You'll need it to deposit your cryptocurrency.","-1388977563":"Copied!","-1962894999":"This address can only be used ONCE. Please copy a new one for your next transaction.","-451858550":"By clicking 'Continue' you will be redirected to {{ service }}, a third-party payment service provider. Please note that {{ website_name }} is not responsible for the content or services provided by {{ service }}. If you encounter any issues related to {{ service }} services, you must contact {{ service }} directly.","-2005265642":"Fiat onramp is a cashier service that allows you to convert fiat currencies to crypto to top up your Deriv crypto accounts. Listed here are third-party crypto exchanges. You’ll need to create an account with them to use their services.","-1593063457":"Select payment channel","-1309258714":"From account number","-1247676678":"To account number","-816476007":"Account holder name","-344403983":"Description","-922432739":"Please enter a valid client login ID.","-1024241603":"Insufficient balance.","-1979554765":"Please enter a valid description.","-1254233806":"You've transferred","-953082600":"Some payment methods may not be listed here but payment agents may still offer them. If you can’t find your favourite method, contact the payment agents directly to check further.","-1491457729":"All payment methods","-142563298":"Contact your preferred payment agent for payment instructions and make your deposit.","-1023961762":"Commission on deposits","-552873274":"Commission on withdrawal","-880645086":"Withdrawal amount","-118683067":"Withdrawal limits: <0 />-<1 />","-1125090734":"Important notice to receive your funds","-1924707324":"View transaction","-1474202916":"Make a new withdrawal","-511423158":"Enter the payment agent account number","-2059278156":"Note: {{website_name}} does not charge any transfer fees.","-1201279468":"To withdraw your funds, please choose the same payment method you used to make your deposits.","-2004264970":"Your wallet address should have 25 to 64 characters.","-1707299138":"Your {{currency_symbol}} wallet address","-38063175":"{{account_text}} wallet","-705272444":"Upload a proof of identity to verify your identity","-2024958619":"This is to protect your account from unauthorised withdrawals.","-130833284":"Please note that your maximum and minimum withdrawal limits aren’t fixed. They change due to the high volatility of cryptocurrency.","-1531269493":"We'll send you an email once your transaction has been processed.","-113940416":"Current stake:","-1999539705":"Deal cancel. fee:","-447037544":"Buy price:","-1342699195":"Total profit/loss:","-1511825574":"Profit/Loss:","-726626679":"Potential profit/loss:","-338379841":"Indicative price:","-2027409966":"Initial stake:","-1525144993":"Payout limit:","-1167474366":"Tick ","-555886064":"Won","-529060972":"Lost","-571642000":"Day","-155989831":"Decrement value","-1192773792":"Don't show this again","-1769852749":"N/A","-1572746946":"Asian Up","-686840306":"Asian Down","-2141198770":"Higher","-816098265":"Lower","-1646655742":"Spread Up","-668987427":"Spread Down","-912577498":"Matches","-1862940531":"Differs","-808904691":"Odd","-556230215":"Ends Outside","-1268220904":"Ends Between","-703542574":"Up","-1127399675":"Down","-768425113":"No Touch","-1163058241":"Stays Between","-1354485738":"Reset Call","-376148198":"Only Ups","-1337379177":"High Tick","-328036042":"Please enter a stop loss amount that's higher than the current potential loss.","-2127699317":"Invalid stop loss. Stop loss cannot be more than stake.","-1150099396":"We’re working to have this available for you soon. If you have another account, switch to that account to continue trading. You may add a Deriv MT5 Financial.","-1940333322":"DBot is not available for this account","-1223145005":"Loss amount: {{profit}}","-1062922595":"Reference ID (buy)","-2068574600":"Reference ID (sell)","-994038153":"Start Time","-1979852400":"Entry Spot","-427802309":"Profit/Loss","-668558002":"Journal.csv","-746652890":"Notifications","-824109891":"System","-749186458":"Account switching is disabled while your bot is running. Please stop your bot before switching accounts.","-662836330":"Would you like to keep your current contract or close it? If you decide to keep it running, you can check and close it later on the <0>Reports page.","-597939268":"Keep my contract","-1322453991":"You need to log in to run the bot.","-1483938124":"This strategy is currently not compatible with DBot.","-236548954":"Contract Update Error","-1428017300":"THE","-1450728048":"OF","-255051108":"YOU","-1845434627":"IS","-931434605":"THIS","-740712821":"A","-187634388":"This block is mandatory. Here is where you can decide if your bot should continue trading. Only one copy of this block is allowed.","-2105473795":"The only input parameter determines how block output is going to be formatted. In case if the input parameter is \"string\" then the account currency will be added.","-1800436138":"2. for \"number\": 1325.68","-2046396241":"This block is mandatory. Only one copy of this block is allowed. It is added to the canvas by default when you open DBot.","-530632460":"This block is used to determine if the market price moves in the selected direction or not. It gives you a value of \"True\" or \"False\".","-1875717842":"Examples:","-890079872":"1. If the selected direction is \"Rise\", and the previous tick value is less than the current tick value, the output will be \"True\". Otherwise, the output will be an empty string.","-489739641":"2. If the selected direction is \"Fall\", and the previous tick value is more than the current tick value, the output will be \"True\". Otherwise, the output will be an empty string.","-2116076360":"There are 4 message types:","-1421941045":"2. 'Warn' displays a message in yellow to highlight something that needs attention.","-277850921":"If \"Win\" is selected, it will return \"True\" if your last trade was successful. Otherwise, it will return an empty string.","-1918487001":"Example:","-2139916657":"1. In the below example the loop is terminated in case \"x\" is \"False\" even though only one iteration is complete","-1238900333":"2. In the below example the loop jumps to the next iteration without executing below block in case if \"x\" is \"False\"","-1729479576":"You can use \"i\" inside the loop, for example to access list items","-1474636594":"In this example, the loop will repeat three times, as that is the number of items in the given list. During each iteration, the variable \"i\" will be assigned a value from the list. ","-908772734":"This block evaluates a statement and will perform an action only when the statement is true.","-334040831":"2. In this example, the instructions are repeated as long as the value of x is greater than or equal to 10. Once the value of x drops below 10, the loop is terminated.","-444267958":"\"Seconds Since Epoch\" block returns the number of seconds since January 1st, 1970.","-447522129":"You might need it when you want to repeat an actions after certain amount of time.","-1488259879":"The term \"candle\" refers to each bar on the candlestick chart. Each candle represents four market prices for the selected time interval:","-2020693608":"Each candlestick on the chart represents 4 market prices for the selected time interval:","-62728852":"- Open price: the opening price","-1247744334":"- Low price: the lowest price","-1386365697":"- Close price: the closing price","-1498732382":"A black (or red) candle indicates that the open price is higher than the close price. This represents a downward movement of the market price.","-1871864755":"This block gives you the last digit of the latest tick value of the selected market. If the latest tick value is 1410.90, this block will return 0. It’s useful for digit-based contracts such as Even/Odd, Matches/Differs, or Higher/Lower.","-1029671512":"In case if the \"OR\" operation is selected, the block returns \"True\" in case if one or both given values are \"True\"","-210295176":"Available operations:","-1385862125":"- Addition","-983721613":"- Subtraction","-854750243":"- Multiplication","-1394815185":"In case if the given number is less than the lower boundary of the range, the block returns the lower boundary value. Similarly, if the given number is greater than the higher boundary, the block will return the higher boundary value. In case if the given value is between boundaries, the block will return the given value unchanged.","-1034564248":"In the below example the block returns the value of 10 as the given value (5) is less than the lower boundary (10)","-2009817572":"This block performs the following operations to a given number","-671300479":"Available operations are:","-514610724":"- Absolute","-1923861818":"- Euler’s number (2.71) to the power of a given number","-1556344549":"Here’s how:","-1061127827":"- Visit the following URL, make sure to replace with the Telegram API token you created in Step 1: https://api.telegram.org/bot/getUpdates","-70949308":"4. Come back to DBot and add the Notify Telegram block to the workspace. Paste the Telegram API token and chat ID into the block fields accordingly.","-311389920":"In this example, the open prices from a list of candles are assigned to a variable called \"cl\".","-1460794449":"This block gives you a list of candles within a selected time interval.","-1634242212":"Used within a function block, this block returns a value when a specific condition is true.","-2012970860":"This block gives you information about your last contract.","-1504783522":"You can choose to see one of the following:","-10612039":"- Profit: the profit you’ve earned","-555996976":"- Entry time: the starting time of the contract","-1391071125":"- Exit time: the contract expiration time","-1961642424":"- Exit value: the value of the last tick of the contract","-111312913":"- Barrier: the barrier value of the contract (applicable to barrier-based trade types such as stays in/out, touch/no touch, etc.)","-674283099":"- Result: the result of the last contract: \"win\" or \"loss\"","-704543890":"This block gives you the selected candle value such as open price, close price, high price, low price, and open time. It requires a candle as an input parameter.","-482281200":"In the example below, the open price is assigned to the variable \"op\".","-364621012":"This block gives you the specified candle value for a selected time interval. You can choose which value you want:","-232477769":"- Open: the opening price","-610736310":"Use this block to sell your contract at the market price. Selling your contract is optional. You may choose to sell if the market trend is unfavourable.","-1307657508":"This block gives you the potential profit or loss if you decide to sell your contract. It can only be used within the \"Sell conditions\" root block.","-1921072225":"In the example below, the contract will only be sold if the potential profit or loss is more than the stake.","-955397705":"SMA adds the market price in a list of ticks or candles for a number of time periods, and divides the sum by that number of time periods.","-1424923010":"where n is the number of periods.","-1835384051":"What SMA tells you","-749487251":"SMA serves as an indicator of the trend. If the SMA points up then the market price is increasing and vice versa. The larger the period number, the smoother SMA line is.","-1996062088":"In this example, each point of the SMA line is an arithmetic average of close prices for the last 10 days.","-1866751721":"Input list accepts a list of ticks or candles, while period is the specified time period.","-1097076512":"You may compare SMA values calculated on every bot run to identify the market trend direction. Alternatively, you may also use a variation of the SMA block, the Simple Moving Average Array block. ","-1254849504":"If a period of 10 is entered, the Simple Moving Average Array block will return a list of SMA values calculated based on period of 10.","-1190046167":"This block displays a dialog box with a customised message. When the dialog box is displayed, your strategy is paused and will only resume after you click \"OK\".","-859028989":"In this example, the date and time will be displayed in a green notification box.","-1452086215":"In this example, a Rise contract will be purchased at midnight on 1 August 2019.","-1765276625":"Click the multiplier drop-down menu and choose the multiplier value you want to trade with.","-1872233077":"Your potential profit will be multiplied by the multiplier value you’ve chosen.","-614454953":"To learn more about multipliers, please go to the <0>Multipliers page.","-2078588404":"Select your desired market and asset type. For example, Forex > Major pairs > AUD/JPY","-2037446013":"2. Trade Type","-533927844":"Select your desired trade type. For example, Up/Down > Rise/Fall","-1192411640":"4. Default Candle Interval","-485434772":"8. Trade Options","-1827646586":"This block assigns a given value to a variable, creating the variable if it doesn't already exist.","-254421190":"List: ({{message_length}})","-1616649196":"results","-90107030":"No results found","-984140537":"Add","-783058284":"Total stake","-2077494994":"Total payout","-1073955629":"No. of runs","-1729519074":"Contracts lost","-42436171":"Total profit/loss","-1137823888":"Total payout since you last cleared your stats.","-992662695":"The number of times your bot has run since you last cleared your stats. Each run includes the execution of all the root blocks.","-1382491190":"Your total profit/loss since you last cleared your stats. It is the difference between your total payout and your total stake.","-767342552":"Enter your bot name, choose to save on your computer or Google Drive, and hit ","-1372891985":"Save.","-462715374":"Untitled Bot","-1150107517":"Connect","-1373954791":"Should be a valid number","-1278608332":"Please enter a number between 0 and {{api_max_losses}}.","-287597204":"Enter limits to stop your bot from trading when any of these conditions are met.","-1445989611":"Limits your potential losses for the day across all Deriv platforms.","-152878438":"Maximum number of trades your bot will execute for this run.","-1490942825":"Apply and run","-1058262694":"Stopping the bot will prevent further trades. Any ongoing trades will be completed by our system.","-1473283434":"Please be aware that some completed transactions may not be displayed in the transaction table if the bot is stopped while placing trades.","-397015538":"You may refer to the statement page for details of all completed transactions.","-1442034178":"Contract bought","-2020280751":"Bot is stopping","-1436403979":"Contract closed","-1711732508":"Reference IDs","-386141434":"(Buy)","-482272687":"(Sell)","-1983189496":"ticks","-694277729":"(High)","-2028564707":"(Low)","-627895223":"Exit spot","-596238067":"Entry/Exit spot","-558594655":"The bot is not running","-478946875":"The stats are cleared","-1391310674":"Check out these guides and FAQs to learn more about building your bot:","-1706059570":"DBot - your automated trading partner","-2066779239":"FAQs","-1904049127":"What is DBot?","-507620484":"Unsaved","-764102808":"Google Drive","-9461328":"Security and privacy","-1200116647":"Click here to start building your DBot.","-1696412885":"Import","-250192612":"Sort","-1566369363":"Zoom out","-1285759343":"Search","-1040972299":"Purchase contract","-600546154":"Sell contract (optional)","-985351204":"Trade again","-112876186":"Analysis","-1769584466":"Stats","-1133736197":"Utility","-1682372359":"Text","-907562847":"Lists","-1646497683":"Loops","-251326965":"Miscellaneous","-1778025545":"You’ve successfully imported a bot.","-934909826":"Load strategy","-1692205739":"Import a bot from your computer or Google Drive, build it from scratch, or start with a quick strategy.","-1545070554":"Delete bot","-1972599670":"Your bot will be permanently deleted when you hit ","-1692956623":"Yes, delete.","-573479616":"Are you sure you want to delete it?","-786915692":"You are connected to Google Drive","-1256971627":"To import your bot from your Google Drive, you'll need to sign in to your Google account.","-1233084347":"To know how Google Drive handles your data, please review Deriv’s <0>Privacy policy.","-305283152":"Strategy name","-1003476709":"Save as collection","-636521735":"Save strategy","-1953880747":"Stop my bot","-1899230001":"Stopping the current bot will load the Quick Strategy you just created to the workspace.","-2131847097":"Any open contracts can be viewed on the ","-563774117":"Dashboard","-939764287":"Charts","-1793577405":"Build from scratch","-1805712946":"We also provide a tutorial on this tab to show you how you can build and execute a simple strategy.","-1212601535":"Monitor the market","-101854331":"Guides and FAQs to help you","-495736035":"Start with a video guide and the FAQs.","-1584847169":"See your bot's performance in real-time.","-1918369898":"Run or stop your bot","-782992165":"Step 1 :","-1656388044":"First, set <0>Market to Derived > Continuous Indices > Volatility 100 (1s) Index.","-1706298865":"Then, set <0>Trade type to Up/Down > Rise/Fall.","-1834358537":"For <0>Default candle interval, set it to 1 minute","-1940971254":"For <0>Trade options, set it as below:","-512839354":"<0>Stake: USD 10 (min: 0.35 - max: 50000)","-753745278":"Step 2 :","-1056713679":"Then, set the <0>Purchase conditions block.","-245497823":"<0>2. Purchase conditions:","-916770284":"<0>Purchase: Rise","-758077259":"Step 3 :","-677396944":"Step 4 :","-295975118":"Next, go to <0>Utility tab under the Blocks menu. Tap the drop-down arrow and hit <0>Loops.","-698493945":"Step 5 :","-1992994687":"Now, tap the <0>Analysis drop-down arrow and hit <0>Contract.","-1844492873":"Go to the <0>Last trade result block and click + icon to add the <0>Result is Win block to the workspace.","-1547091772":"Then, drag the <0>Result is win into the empty slot next to <0>repeat until block.","-736400802":"Step 6 :","-732067680":"Finally, drag and add the whole <0>Repeat block to the <0>Restart trading conditions block.","-1411787252":"Step 1","-65900463":"Get started on DBot","-1447398448":"Import a bot from your mobile device or from Google drive, see a preview in the bot builder, and start trading by running the bot, or choose from our pre-made Quick Strategies. ","-1109191651":"Must be a number higher than 0","-689786738":"Minimum duration: {{ min }}","-184183432":"Maximum duration: {{ max }}","-1494924808":"The value must be equal to or greater than 2.","-1823621139":"Quick Strategy","-1455277971":"Exit Tour","-1999747212":"Want to retake the tour?","-358288026":"Note: You can also find this tutorial in the <0>Tutorials tab.","-683790172":"Now, <0>run the bot to test out the strategy.","-129587613":"Got it, thanks!","-1519425996":"No results found \"{{ faq_search_value }}\"","-155173714":"Let’s build a bot!","-468571681":"DBot is a web-based strategy builder for trading digital options. It’s a platform where you can build your own automated trading bot using drag-and-drop 'blocks'.","-1919212468":"3. You can also search for the blocks you want using the search bar above the categories.","-1520558271":"For more info, check out this blog post on the basics of building a trading bot.","-980360663":"3. Choose the block you want and drag it to the workspace.","-1493168314":"What is a quick strategy?","-364223277":"A quick strategy is a ready-made strategy that you can use in DBot. There are 3 quick strategies you can choose from: Martingale, D'Alembert, and Oscar's Grind.","-1680391945":"Using a quick strategy","-1177914473":"How do I save my strategy?","-271986909":"In Bot Builder, hit Save on the toolbar at the top to download your bot. Give your bot a name, and choose to download your bot to your device or Google Drive. Your bot will be downloaded as an XML file.","-1778742142":"How do I import my own trading bot into DBot?","-1149045595":"1. After hitting Import, select Local and click Continue.","-288041546":"2. Select your XML file and hit Open.","-2127548288":"3. Your bot will be loaded accordingly.","-1311297611":"1. After hitting Import, select Google Drive and click Continue.","-1549564044":"How do I reset the workspace?","-1127331928":"In Bot Builder, hit Reset on the toolbar at the top. This will clear the workspace. Please note that any unsaved changes will be lost.","-1366572293":"How do I control my losses with DBot?","-1394160761":"There are several ways to control your losses with DBot. Here’s a simple example of how you can implement loss control in your strategy:","-986689483":"1. Create the following variables:","-79649010":"- currentStake: Use this variable to store the stake amount used in the last contract. You can assign any amount you want, but it must be a positive number.","-1931732247":"- tradeAgain: Use this variable to stop trading when your loss limit is reached. Set the initial value to true.","-1574002530":"2. Use a logic block to check if currentPL exceeds maximumLoss. If it does, set tradeAgain to false to prevent the bot from running another cycle.","-1672069217":"3. Update currentPL with the profit from the last contract. If the last contract was lost, the value of currentPL will be negative.","-241469384":"Can I run DBot on multiple tabs in my web browser?","-90192474":"Yes, you can. However, there are limits on your account, such as maximum number of open positions and maximum aggregate payouts on open positions. So, just keep these limits in mind when opening multiple positions. You can find more info about these limits at Settings > Account limits.","-1353036415":"No, we don't. However, you'll find quick strategies on DBot that'll help you build your own trading bot for free.","-1084736225":"In which countries is DBot available?","-210651060":"If I close my web browser, will DBot continue to run?","-352345777":"What are the most popular strategies for automated trading?","-597923989":"Watch this video to learn how to build a trading bot on DBot. Also, check out this blog post on building a trading bot.","-418247251":"Download your journal.","-870004399":"<0>Bought: {{longcode}} (ID: {{transaction_id}})","-1211474415":"Filters","-186972150":"There are no messages to display","-999254545":"All messages are filtered out","-1121028020":"or, if you prefer...","-254025477":"Select an XML file from your device","-1131095838":"Please upload an XML file","-523928088":"Create one or upload one from your local drive or Google Drive.","-1684205190":"Why can't I see my recent bots?","-2050879370":"1. Logged in from a different device","-811857220":"3. Cleared your browser cache","-625024929":"Leaving already?","-584289785":"No, I'll stay","-1435060006":"If you leave, your current contract will be completed, but your bot will stop running immediately.","-24780060":"When you’re ready to trade, hit ","-2147110353":". You’ll be able to track your bot’s performance here.","-1717650468":"Online","-1825471709":"A whole new trading experience on a powerful yet easy to use platform.","-981017278":"Automated trading at your fingertips. No coding needed.","-1309011360":"Open positions","-1597214874":"Trade table","-883103549":"Account deactivated","-821418875":"Trader","-679102561":"Contract Details","-430118939":"Complaints policy","-568280383":"Deriv Gaming","-895331276":"Complete your proof of address","-782679300":"Complete your proof of identity","-579984289":"Derived Demo","-1596515467":"Derived BVI","-222394569":"Derived Vanuatu","-533935232":"Financial BVI","-565431857":"Financial Labuan","-1290112064":"Deriv EZ","-291535132":"Swap-Free Demo","-1472945832":"Swap-Free SVG","-1669418686":"AUD/CAD","-1548588249":"AUD/CHF","-1552890620":"AUD/JPY","-681231560":"AUD/PLN","-64938413":"AUD/USD","-1430522808":"EUR/AUD","-2020477069":"EUR/CAD","-1201853162":"EUR/CHF","-1318070255":"EUR/GBP","-1197505739":"EUR/JPY","-405907358":"EUR/USD","-1536293064":"NZD/JPY","-79700881":"NZD/USD","-642323838":"USD/CAD","-428199705":"USD/CHF","-424108348":"USD/JPY","-548255282":"USD/NOK","-1834131208":"USD/PLN","-524302516":"Silver/USD","-764731776":"Platinum/USD","-853582174":"France 40","-1096386695":"UK 100","-617646862":"Germany 40","-2077690248":"Japan 225","-512194910":"US Tech 100","-381746202":"US 500","-1935463381":"Swiss 20","-1941767726":"Euro 50","-1925264914":"Volatility 25 Index","-708579504":"Volatility 50 Index","-975255670":"Volatility 75 Index","-1736314513":"Crash 300 Index","-342128411":"Crash 500 Index","-9704319":"Crash 1000 Index","-465860988":"Bull Market Index","-390528194":"Step Index","-280323742":"EUR Basket","-563812039":"Volatility 10 (1s) Index","-764111252":"Volatility 100 (1s) Index","-816110209":"Volatility 150 (1s) Index","-1374309449":"Volatility 200 (1s) Index","-1288044380":"Volatility 250 (1s) Index","-1164978320":"Jump 10 Index","-575272887":"BCH/USD","-295406873":"BTC/ETH","-1713556301":"ZMR/USD","-2046638412":"XRP/USD","-1263203461":"BTC/USD","-1112522776":"DSH/USD","-460689370":"LTC/USD","-841561409":"Put Spread","-137444201":"Buy","-1500514644":"Accumulator","-144803045":"Only numbers and these special characters are allowed: {{permitted_characters}}","-1450516268":"Only letters, numbers, space, hyphen, period, and apostrophe are allowed.","-1966032552":"The length of token should be 8.","-2128137611":"Should start with letter or number, and may contain hyphen and underscore.","-1590869353":"Up to {{decimal_count}} decimal places are allowed.","-2061307421":"Should be more than {{min_value}}","-1099941162":"Should be less than {{max_value}}","-1528188268":"Straight rows of keys are easy to guess","-1339903234":"Short keyboard patterns are easy to guess","-23980798":"Repeats like \"aaa\" are easy to guess","-235760680":"Avoid repeated words and characters","-1568933154":"Sequences like abc or 6543 are easy to guess","-725663701":"Avoid sequences","-1450768475":"Recent years are easy to guess","-1804838610":"Avoid years that are associated with you","-64849469":"Dates are often easy to guess","-2006915194":"Avoid dates and years that are associated with you","-2124205211":"A word by itself is easy to guess","-1095202689":"All-uppercase is almost as easy to guess as all-lowercase","-2137856661":"Reversed words aren't much harder to guess","-1885413063":"Predictable substitutions like '@' instead of 'a' don't help very much","-369258265":"This password is on the blacklist","-681468758":"Your web browser is out of date and may affect your trading experience. Please <0>update your browser.","-577777971":"You have reached the rate limit of requests per second. Please try later.","-206321775":"Fiat","-522767852":"DEMO","-433761292":"Switching to default account.","-405439829":"Sorry, you can't view this contract because it doesn't belong to this account.","-1590712279":"Gaming","-16448469":"Virtual","-540474806":"Your Options account is scheduled to be closed","-618539786":"Your account is scheduled to be closed","-945275490":"Withdraw all funds from your Options account.","-2093768906":"{{name}} has released your funds.
Would you like to give your feedback?","-705744796":"Your demo account balance has reached the maximum limit, and you will not be able to place new trades. Reset your balance to continue trading from your demo account.","-2063700253":"disabled","-800774345":"Power up your Financial trades with intuitive tools from Acuity.","-279582236":"Learn More","-1211460378":"Power up your trades with Acuity","-703292251":"Download intuitive trading tools to keep track of market events. The Acuity suite is only available for Windows, and is most recommended for financial assets.","-1585069798":"Please click the following link to complete your Appropriateness Test.","-1287141934":"Find out more","-367759751":"Your account has not been verified","-596690079":"Enjoy using Deriv?","-265932467":"We’d love to hear your thoughts","-1815573792":"Drop your review on Trustpilot.","-823349637":"Go to Trustpilot","-1204063440":"Set my account currency","-1601813176":"Would you like to increase your daily limits to {{max_daily_buy}} {{currency}} (buy) and {{max_daily_sell}} {{currency}} (sell)?","-1751632759":"Get a faster mobile trading experience with the <0>{{platform_name_go}} app!","-1164554246":"You submitted expired identification documents","-219846634":"Let’s verify your ID","-529038107":"Install","-1738575826":"Please switch to your real account or create one to access the cashier.","-1329329028":"You’ve not set your 30-day turnover limit","-132893998":"Your access to the cashier has been temporarily disabled as you have not set your 30-day turnover limit. Please go to Self-exclusion and set the limit.","-1852207910":"MT5 withdrawal disabled","-764323310":"MT5 withdrawals have been disabled on your account. Please check your email for more details.","-1902997828":"Refresh now","-753791937":"A new version of Deriv is available","-1775108444":"This page will automatically refresh in 5 minutes to load the latest version.","-1175685940":"Please contact us via live chat to enable withdrawals.","-1125797291":"Password updated.","-157145612":"Please log in with your updated password.","-1728185398":"Resubmit proof of address","-612396514":"Please resubmit your proof of address.","-1519764694":"Your proof of address is verified.","-1961967032":"Resubmit proof of identity","-117048458":"Please submit your proof of identity.","-1196422502":"Your proof of identity is verified.","-136292383":"Your proof of address verification is pending","-386909054":"Your proof of address verification has failed","-430041639":"Your proof of address did not pass our verification checks, and we’ve placed some restrictions on your account. Please resubmit your proof of address.","-87177461":"Please go to your account settings and complete your personal details to enable deposits.","-904632610":"Reset your balance","-470018967":"Reset balance","-156611181":"Please complete the financial assessment in your account settings to unlock it.","-1925176811":"Unable to process withdrawals in the moment","-980696193":"Withdrawals are temporarily unavailable due to system maintenance. You can make withdrawals when the maintenance is complete.","-1647226944":"Unable to process deposit in the moment","-488032975":"Deposits are temporarily unavailable due to system maintenance. You can make deposits when the maintenance is complete.","-67021419":"Our cashier is temporarily down due to system maintenance. You can access the cashier in a few minutes when the maintenance is complete.","-849587074":"You have not provided your tax identification number","-47462430":"This information is necessary for legal and regulatory requirements. Please go to your account settings, and fill in your latest tax identification number.","-2067423661":"Stronger security for your Deriv account","-1719731099":"With two-factor authentication, you’ll protect your account with both your password and your phone - so only you can access your account, even if someone knows your password.","-949074612":"Please contact us via live chat.","-2087822170":"You are offline","-1669693571":"Check your connection.","-1706642239":"<0>Proof of ownership <1>required","-553262593":"<0><1>Your account is currently locked <2><3>Please upload your proof of <4>ownership to unlock your account. <5>","-1834929362":"Upload my document","-1043638404":"<0>Proof of ownership <1>verification failed","-1766760306":"<0><1>Please upload your document <2>with the correct details. <3>","-8892474":"Start assessment","-1330929685":"Please submit your proof of identity and proof of address to verify your account and continue trading.","-99461057":"Please submit your proof of address to verify your account and continue trading.","-577279362":"Please submit your proof of identity to verify your account and continue trading.","-197134911":"Your proof of identity is expired","-152823394":"Your proof of identity has expired. Please submit a new proof of identity to verify your account and continue trading.","-2142540205":"It appears that the address in your document doesn’t match the address in your Deriv profile. Please update your personal details now with the correct address.","-482715448":"Go to Personal details","-2072411961":"Your proof of address has been verified","-384887227":"Update the address in your profile.","-448961363":"non-EU","-1998049070":"If you agree to our use of cookies, click on Accept. For more information, <0>see our policy.","-2061807537":"Something’s not right","-402093392":"Add Deriv Account","-277547429":"A Deriv account will allow you to fund (and withdraw from) your MT5 account(s).","-1721181859":"You’ll need a {{deriv_account}} account","-1989074395":"Please add a {{deriv_account}} account first before adding a {{dmt5_account}} account. Deposits and withdrawals for your {{dmt5_label}} account are done by transferring funds to and from your {{deriv_label}} account.","-689237734":"Proceed","-1642457320":"Help centre","-1966944392":"Network status: {{status}}","-594209315":"Synthetic indices in the EU are offered by {{legal_entity_name}}, W Business Centre, Level 3, Triq Dun Karm, Birkirkara BKR 9033, Malta, licensed and regulated by the Malta Gaming Authority (<0>licence no. MGA/B2C/102/2000) and by the Revenue Commissioners for clients in Ireland (<2>licence no. 1010285).","-181484419":"Responsible trading","-650505513":"Full screen","-1823504435":"View notifications","-1954045170":"No currency assigned","-583559763":"Menu","-1591792668":"Account Limits","-34495732":"Regulatory information","-1496158755":"Go to Deriv.com","-1396326507":"Unfortunately, {{website_name}} is not available in your country.","-1019903756":"Synthetic","-288996254":"Unavailable","-735306327":"Manage accounts","-1310654342":"As part of the changes in our product line-up, we will be closing Gaming accounts belonging to our UK clients.","-626152766":"As part of the changes in our product line-up, we are closing Options accounts belonging to our clients in Europe.","-490100162":"As part of the changes in our product line-up, we will be closing accounts belonging to our Isle of Man clients.","-1208958060":"You can no longer trade digital options on any of our platforms. You also can’t deposit funds into your account.<0/><1/>Any open positions on digital options have been closed with full payout.","-2050417883":"You’ll lose access to your Gaming account when it gets closed, so make sure to withdraw your funds as soon as possible.","-1950045402":"Withdraw all your funds","-168971942":"What this means for you","-905560792":"OK, I understand","-1308593541":"You will lose access to your account when it gets closed, so be sure to withdraw all your funds.","-2024365882":"Explore","-1197864059":"Create free demo account","-1813972756":"Account creation paused for 24 hours","-366030582":"Sorry, you're unable to create an account at this time. As you declined our previous risk warnings, we need you to wait for 24 hours after your first account creation attempt before you can proceed.<0/><0/>","-534047566":"Thank you for your understanding. You can create your account on {{real_account_unblock_date}} or later.","-399816343":"Trading Experience Assessment<0/>","-1822498621":"As per our regulatory obligations, we are required to assess your trading knowledge and experience.<0/><0/>Please click ‘OK’ to continue","-71049153":"Keep your account secure with a password","-1861974537":"Strong passwords contain at least 8 characters, combine uppercase and lowercase letters, numbers, and symbols.","-1485242688":"Step {{step}}: {{step_title}} ({{step}} of {{steps}})","-1829842622":"You can open an account for each cryptocurrency.","-987221110":"Choose a currency you would like to trade with.","-1066574182":"Choose a currency","-1914534236":"Choose your currency","-200560194":"Please switch to your {{fiat_currency}} account to change currencies.","-1829493739":"Choose the currency you would like to trade with.","-1814647553":"Add a new","-1269362917":"Add new","-650480777":"crypto account","-175638343":"Choose an account or add a new one","-1768223277":"Your account is ready","-1215717784":"<0>You have successfully changed your currency to {{currency}}.<0>Make a deposit now to start trading.","-786091297":"Trade on demo","-228099749":"Please verify your identity and address","-1041852744":"We're processing your personal information","-1775006840":"Make a deposit now to start trading.","-983734304":"We need proof of your identity and address before you can start trading.","-917733293":"To get trading, please confirm where you live.","-1282628163":"You'll be able to get trading as soon as verification is complete.","-952649119":"Log In","-3815578":"Sign Up","-1456176427":"Set a currency for your real account","-1557011219":"Add a real Deriv Options account","-241733171":"Add a Deriv Financial account","-1329687645":"Create a cryptocurrency account","-1429178373":"Create a new account","-1740162250":"Manage account","-1016775979":"Choose an account","-1362081438":"Adding more real accounts has been restricted for your country.","-1602122812":"24-hour Cool Down Warning","-1519791480":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the risk of losing your money. <0/><0/>\n As you have declined our previous warning, you would need to wait 24 hours before you can proceed further.","-1010875436":"CFDs and other financial instruments come with a high risk of losing money rapidly due to leverage. You should consider whether you understand how CFDs and other financial instruments work and whether you can afford to take the high risk of losing your money. <0/><0/> To continue, kindly note that you would need to wait 24 hours before you can proceed further.","-1725418054":"By clicking ‘Accept’ and proceeding with the account opening, you should note that you may be exposing yourself to risks. These risks, which may be significant, include the risk of losing the entire sum invested, and you may not have the knowledge and experience to properly assess or mitigate them.","-1369294608":"Already signed up?","-730377053":"You can’t add another real account","-2100785339":"Invalid inputs","-617844567":"An account with your details already exists.","-292363402":"Trading statistics report","-1656860130":"Options trading can become a real addiction, as can any other activity pushed to its limits. To avoid the danger of such an addiction, we provide a reality-check that gives you a summary of your trades and accounts on a regular basis.","-28080461":"Would like to check your statement first? <0>Check Statement","-611059051":"Please specify your preferred interval reality check in minutes:","-1876891031":"Currency","-11615110":"Turnover","-1370419052":"Profit / Loss","-437320982":"Session duration:","-3959715":"Current time:","-1534648620":"Your password has been changed","-596199727":"We will now redirect you to the login page.","-310434518":"The email input should not be empty.","-437918412":"No currency assigned to your account","-1193651304":"Country of residence","-707550055":"We need this to make sure our service complies with laws and regulations in your country.","-280139767":"Set residence","-601615681":"Select theme","-1152511291":"Dark","-1428458509":"Light","-1976089791":"Your Deriv account has been unlinked from your {{social_identity_provider}} account. You can now log in to Deriv using your new email address and password.","-505449293":"Enter a new password for your Deriv account.","-1728963310":"Stop creating an account?","-703818088":"Only log in to your account at this secure link, never elsewhere.","-1235799308":"Fake links often contain the word that looks like \"Deriv\" but look out for these differences.","-2102997229":"Examples","-82488190":"I've read the above carefully.","-97775019":"Do not trust and give away your credentials on fake websites, ads or emails.","-2142491494":"OK, got it","-611136817":"Beware of fake links.","-1787820992":"Platforms","-1793883644":"Trade FX and CFDs on a customisable, easy-to-use trading platform.","-184713104":"Earn fixed payouts with options, or trade multipliers to amplify your gains with limited risk.","-1571775875":"Our flagship options and multipliers trading platform.","-895091803":"If you're looking for CFDs","-1447215751":"Not sure? Try this","-2338797":"<0>Maximise returns by <0>risking more than you put in.","-1682067341":"Earn <0>fixed returns by <0>risking only what you put in.","-1744351732":"Not sure where to start?","-943710774":"This complaints policy, which may change from time to time, applies to your account registered with {{legal_entity_name}}, having its registered office address at First Floor, Millennium House, Victoria Road, Douglas, Isle of Man, IM2 4RW, licensed and regulated respectively by (1) the Gambling Supervision Commission in the Isle of Man (current <0>licence issued on 31 August 2017) and (2) the Gambling Commission in the UK (<1>licence no. 39172).","-255056078":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name}}, having its registered office address at W Business Centre, Level 3, Triq Dun Karm, Birkirkara, BKR 9033, Malta, licensed and regulated by the Malta Gaming Authority in Malta for gambling products only, <0>licence no. MGA/B2C/102/2000, and for clients residing in the UK by the UK Gambling Commission (account number 39495).","-1941013000":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}}, {{legal_entity_name_fx}}, and {{legal_entity_name_v}}.","-594812204":"This complaints policy, which may change from time to time, applies to your account(s) registered with {{legal_entity_name_svg}}.","-813256361":"We are committed to treating our clients fairly and providing them with excellent service.<0/><1/>We would love to hear from you on how we can improve our services to you. Any information you provide will be treated in the strictest confidence. Rest assured that you will be heard, valued, and always treated fairly.","-1622847732":"If you have an inquiry regarding your trading account with {{legal_entity_name}}, you can contact us through our <0>Help centre or by chatting with a representative via <1>Live Chat.<2/><3/>We are committed to resolving your query in the quickest time possible and appreciate your patience in allowing us time to resolve the matter.<4/><5/>We strive to provide the best possible service and support to our customers. However, in the event that we are unable to resolve your query or if you feel that our response is unsatisfactory, we want to hear from you. We welcome and encourage you to submit an official complaint to us so that we can review your concerns and work towards a resolution.","-1639808836":"If you are not satisfied with the outcome, you can escalate your complaint to the <0>Independent Betting Adjudication Service (IBAS) by filling the IBAS adjudication form. Please note that IBAS only deals with disputes that result from transactions.","-1505742956":"<0/><1/>You can also refer your dispute to the Malta Gaming Authority via the <2>Player Support Unit.","-1406192787":"If you are not satisfied with the outcome, you can escalate your complaint to the <0>Financial Commission.","-1776547326":"<0/><1/>If you reside in the UK and you are unhappy with our response you may escalate your complaint to the <2>Financial Ombudsman Service.","-2115348800":"1. Introduction","-744009523":"2. Fair treatment","-866831420":"3.1. Submission of a complaint","-1102904026":"3.2. Handling your complaint","-603378979":"3.3. Resolving your complaint","-697569974":"3.4. Your decision","-1280998762":"4. Complaints","-1886635232":"A complaint is any expression of dissatisfaction by a client regarding our products or services that requires a formal response.<0/><1/>If what you submit does not fall within the scope of a complaint, we may reclassify it as a query and forward it to the relevant department for handling. However, if you believe that your query should be classified as a complaint due to its relevance to the investment services provided by {{legal_entity_name}}, you may request that we reclassify it accordingly.","-1771496016":"To submit a complaint, please send an email to <0>complaints@deriv.com, providing as much detail as possible. To help us investigate and resolve your complaint more efficiently, please include the following information:","-1197243525":"<0>•A clear and detailed description of your complaint, including any relevant dates, times, and transactions","-1795134892":"<0>•Any relevant screenshots or supporting documentation that will assist us in understanding the issue","-2053887036":"4.4. Handling your complaint","-717170429":"Once we have received the details of your complaint, we shall review it carefully and keep you updated on the handling process. We might request further information or clarifications to facilitate the resolution of the complaint.","-1841922393":"4.5. Resolving your complaint","-1327119795":"4.6. Your decision","-2019654103":"If we are unable to resolve your complaint or you are not satisfied with the outcome, you can escalate your complaint to the Office of the Arbiter for Financial Services.<0/><1/><2>Filing complaints with the Office of the Arbiter for Financial Services","-687172857":"<0>•You may file a complaint with the Arbiter for Financial Services only if you are not satisfied with our decision or the decision wasn’t made within 15 business days.","-262934706":"<0>•If the complaint is accepted by the Arbiter, you will receive another email with further details relating to the payment of the €25 complaint fee and the processes that follow.","-993572476":"<0>b.The Financial Commission has 5 days to acknowledge that your complaint was received and 14 days to answer the complaint through our Internal Dispute Resolution (IDR) procedure.","-1769159081":"<0>c.You will be able to file a complaint with the Financial Commission only if you are not satisfied with our decision or the decision wasn’t made within 14 days.","-58307244":"3. Determination phase","-356618087":"<0>b.The DRC may request additional information from you or us, who must then provide the requested information within 7 days.","-945718602":"<0>b.If you agree with a DRC decision, you will need to accept it within 14 days. If you do not respond to the DRC decision within 14 days, the complaint is considered closed.","-1500907666":"<0>d.If the decision is made in our favour, you must provide a release for us within 7 days of when the decision is made, and the complaint will be considered closed.","-429248139":"5. Disclaimer","-818926350":"The Financial Commission accepts appeals for 45 days following the date of the incident and only after the trader has tried to resolve the issue with the company directly.","-358055541":"Power up your trades with cool new tools","-29496115":"We've partnered with Acuity to give you a suite of intuitive trading tools for MT5 so you can keep track of market events and trends, free of charge!<0/><0/>","-648669944":"Download the Acuity suite and take advantage of the <1>Macroeconomic Calendar, Market Alerts, Research Terminal, and <1>Signal Centre Trade Ideas without leaving your MT5 terminal.<0/><0/>","-794294380":"This suite is only available for Windows, and is most recommended for financial assets.","-922510206":"Need help using Acuity?","-815070480":"Disclaimer: The trading services and information provided by Acuity should not be construed as a solicitation to invest and/or trade. Deriv does not offer investment advice. The past is not a guide to future performance, and strategies that have worked in the past may not work in the future.","-2111521813":"Download Acuity","-941870889":"The cashier is for real accounts only","-352838513":"It looks like you don’t have a real {{regulation}} account. To use the cashier, switch to your {{active_real_regulation}} real account, or get an {{regulation}} real account.","-1858915164":"Ready to deposit and trade for real?","-162753510":"Add real account","-1208519001":"You need a real Deriv account to access the cashier.","-175369516":"Welcome to Deriv X","-939154994":"Welcome to Deriv MT5 dashboard","-1667427537":"Run Deriv X on your browser or download the mobile app","-305915794":"Run MT5 from your browser or download the MT5 app for your devices","-404375367":"Trade forex, basket indices, commodities, and cryptocurrencies with high leverage.","-243985555":"Trade CFDs on forex, stocks, stock indices, synthetic indices, cryptocurrencies, and commodities with leverage.","-2030107144":"Trade CFDs on forex, stocks & stock indices, commodities, and crypto.","-705682181":"Malta","-409563066":"Regulator","-1302404116":"Maximum leverage","-2098459063":"British Virgin Islands","-1510474851":"British Virgin Islands Financial Services Commission (licence no. SIBA/L/18/1114)","-761250329":"Labuan Financial Services Authority (Licence no. MB/18/0024)","-1264604378":"Up to 1:1000","-1686150678":"Up to 1:100","-637908996":"100%","-1420548257":"20+","-1344709651":"40+","-1373949478":"50+","-1382029900":"70+","-1493055298":"90+","-1835174654":"1:30","-1647612934":"Spreads from","-1587894214":"about verifications needed.","-466784048":"Regulator/EDR","-1326848138":"British Virgin Islands Financial Services Commission (License no. SIBA/L/18/1114)","-777580328":"Forex, Stocks, Stock indices, Commodities, and Cryptocurrencies","-1372141447":"Straight-through processing","-1969608084":"Forex and Cryptocurrencies","-800771713":"Labuan Financial Services Authority (licence no. MB/18/0024)","-1497128311":"80+","-1501230046":"0.6 pips","-1689815930":"You will need to submit proof of identity and address once you reach certain thresholds.","-1175785439":"Deriv (SVG) LLC (company no. 273 LLC 2020)","-235833244":"Synthetics, Forex, Stocks, Stock Indices, Cryptocurrencies, and ETFs","-139026353":"A selfie of yourself.","-70314394":"A recent utility bill (electricity, water or gas) or recent bank statement or government-issued letter with your name and address.","-435524000":"Verification failed. Resubmit during account creation.","-1385099152":"Your document is verified.","-1434036215":"Demo Financial","-1416247163":"Financial STP","-1637969571":"Demo Swap-Free","-1882063886":"Demo CFDs","-1347908717":"Demo Financial SVG","-1780324582":"SVG","-785625598":"Use these credentials to log in to your {{platform}} account on the website and mobile apps.","-997127433":"Change Password","-1300381594":"Get Acuity trading tools","-860609405":"Password","-742647506":"Fund transfer","-1972393174":"Trade CFDs on our synthetics, baskets, and derived FX.","-1357917360":"Web terminal","-1454896285":"The MT5 desktop app is not supported by Windows XP, Windows 2003, and Windows Vista.","-810388996":"Download the Deriv X mobile app","-1727991510":"Scan the QR code to download the Deriv X Mobile App","-511301450":"Indicates the availability of cryptocurrency trading on a particular account.","-1647569139":"Synthetics, Baskets, Derived FX, Forex: standard/micro, Stocks, Stock indices, Commodities, Cryptocurrencies","-2102641225":"At bank rollover, liquidity in the forex markets is reduced and may increase the spread and processing time for client orders. This happens around 21:00 GMT during daylight saving time, and 22:00 GMT non-daylight saving time.","-495364248":"Margin call and stop out level will change from time to time based on market condition.","-536189739":"To protect your portfolio from adverse market movements due to the market opening gap, we reserve the right to decrease leverage on all offered symbols for financial accounts before market close and increase it again after market open. Please make sure that you have enough funds available in your {{platform}} account to support your positions at all times.","-712681566":"Peer-to-peer exchange","-1267880283":"{{field_name}} is required","-2084509650":"{{field_name}} is not properly formatted.","-1779241732":"First line of address is not in a proper format.","-188222339":"This should not exceed {{max_number}} characters.","-1673422138":"State/Province is not in a proper format.","-1580554423":"Trade CFDs on our synthetic indices that simulate real-world market movements.","-1385484963":"Confirm to change your {{platform}} password","-1990902270":"This will change the password to all of your {{platform}} accounts.","-673424733":"Demo account","-1986258847":"Server maintenance starts at 01:00 GMT every Sunday, and this process may take up to 2 hours to complete. Service may be disrupted during this time.","-1199152768":"Please explore our other platforms.","-205020823":"Explore {{platform_name_trader}}","-1982499699":"Explore {{platform_name_dbot}}","-1567989247":"Submit your proof of identity and address","-184453418":"Enter your {{platform}} password","-393388362":"We’re reviewing your documents. This should take about 1 to 3 days.","-790488576":"Forgot password?","-535365199":"Enter your {{platform}} password to add a {{platform_name}} {{account}} account.","-2057918502":"Hint: You may have entered your Deriv password, which is different from your {{platform}} password.","-1769158315":"real","-700260448":"demo","-1936102840":"Congratulations, you have successfully created your {{category}} <0>{{platform}} <1>{{type}} {{jurisdiction_selected_shortcode}} account. ","-1928229820":"Reset Deriv X investor password","-1087845020":"main","-1950683866":"investor","-1874242353":"Fund top up","-89838213":"You can top up your demo account with an additional <0> if your balance is <1> or less.","-1211122723":"{{ platform }} {{ account_title }} account","-78895143":"Current balance","-149993085":"New current balance","-490244964":"Forex, stocks, stock indices, cryptocurrencies","-1368041210":", synthetic indices","-877064208":"EUR","-1284221303":"You’ll get a warning, known as margin call, if your account balance drops down close to the stop out level.","-1848799829":"To understand stop out, first you need to learn about margin level, which is the ratio of your equity (the total balance you would have if you close all your positions at that point) to the margin you're using at the moment. If your margin level drops below our stop out level, your positions may be closed automatically to protect you from further losses.","-224051432":"24/7","-70716111":"FX-majors (standard/micro lots), FX-minors, basket indices, commodities, cryptocurrencies, and stocks and stock indices","-1041629137":"FX-majors, FX-minors, FX-exotics, and cryptocurrencies","-287097947":"FX-majors (standard/micro lots), FX-minors, Commodities, Cryptocurrencies (except UK)","-2016975615":"Deriv MT5 CFDs real account","-1207265427":"Compare CFDs real accounts","-1225160479":"Compare available accounts","-266701451":"derivX wordmark","-2145356061":"Download Deriv X on your phone to trade with the Deriv X account","-251202291":"Broker","-81650212":"MetaTrader 5 web","-2123571162":"Download","-941636117":"MetaTrader 5 Linux app","-637537305":"Download {{ platform }} on your phone to trade with the {{ platform }} {{ account }} account","-2042845290":"Your investor password has been changed.","-1882295407":"Your password has been changed.","-254497873":"Use this password to grant viewing access to another user. While they may view your trading account, they will not be able to trade or take any other actions.","-161656683":"Current investor password","-374736923":"New investor password","-1793894323":"Create or reset investor password","-2026018074":"Add your Deriv MT5 <0>{{account_type_name}} account under Deriv (SVG) LLC (company no. 273 LLC 2020).","-162320753":"Add your Deriv MT5 <0>{{account_type_name}} account under Deriv (BVI) Ltd, regulated by the British Virgin Islands Financial Services Commission (License no. SIBA/L/18/1114).","-2125860351":"Choose a jurisdiction for your Deriv MT5 CFDs account","-479119833":"Choose a jurisdiction for your Deriv MT5 {{account_type}} account","-450424792":"You need a real account (fiat currency or cryptocurrency) in Deriv to create a real Deriv MT5 account.","-1760596315":"Create a Deriv account","-648956272":"Use this password to log in to your Deriv X accounts on the web and mobile apps.","-1814308691":"Please click on the link in the email to change your {{platform}} password.","-1282933308":"Not {{barrier}}","-968190634":"Equals {{barrier}}","-1747377543":"Under {{barrier}}","-1694314813":"Contract value:","-442488432":"day","-337314714":"days","-1763848396":"Put","-1572548510":"Ups & Downs","-71301554":"Ins & Outs","-952298801":"Look Backs","-763273340":"Digits","-993480898":"Accumulators","-1790089996":"NEW!","-1386326276":"Barrier is a required field.","-1418742026":"Higher barrier must be higher than lower barrier.","-92007689":"Lower barrier must be lower than higher barrier.","-1095538960":"Please enter the start time in the format \"HH:MM\".","-1975910372":"Minute must be between 0 and 59.","-866277689":"Expiry time cannot be in the past.","-1455298001":"Now","-256210543":"Trading is unavailable at this time.","-28115241":"{{platform_name_trader}} is not available for this account","-453920758":"Go to {{platform_name_mt5}} dashboard","-402175529":"History","-902712434":"Deal cancellation","-988484646":"Deal cancellation (executed)","-444882676":"Deal cancellation (active)","-13423018":"Reference ID","-1551639437":"No history","-1214703885":"You have yet to update either take profit or stop loss","-880722426":"Market is closed","-504849554":"It will reopen at","-59803288":"In the meantime, try our synthetic indices. They simulate real-market volatility and are open 24/7.","-1278109940":"See open markets","-694105443":"This market is closed","-439389714":"We’re working on it","-770929448":"Go to {{platform_name_smarttrader}}","-138538812":"Log in or create a free account to place a trade.","-2036388794":"Create free account","-1813736037":"No further trading is allowed on this contract type for the current trading session. For more info, refer to our <0>terms and conditions.","-590131162":"Stay on {{website_domain}}","-1444663817":"Go to Binary.com","-1526466612":"You’ve selected a trade type that is currently unsupported, but we’re working on it.","-1043795232":"Recent positions","-1572796316":"Purchase price:","-153220091":"{{display_value}} Tick","-802374032":"Hour","-2039780875":"Purchase confirmation","-1672470173":"Require confirmation before purchasing a contract","-1342661765":"Lock contract purchase buttons","-504410042":"When you open a position, barriers will be created around the asset price. For each new tick, the upper and lower barriers are automatically calculated based on the asset and accumulator value you choose. You will earn a profit if you close your position before the asset price hits either of the barriers.","-1907770956":"As long as the price change for each tick is within the barrier, your payout will grow at every tick, based on the accumulator value you’ve selected.","-997670083":"Maximum ticks","-1392065699":"If you select \"Rise\", you win the payout if the exit spot is strictly higher than the entry spot.","-1762566006":"If you select \"Fall\", you win the payout if the exit spot is strictly lower than the entry spot.","-1435306976":"If you select \"Allow equals\", you win the payout if exit spot is higher than or equal to entry spot for \"Rise\". Similarly, you win the payout if exit spot is lower than or equal to entry spot for \"Fall\".","-1959473569":"If you select \"Lower\", you win the payout if the exit spot is strictly lower than the barrier.","-1350745673":"If the exit spot is equal to the barrier, you don't win the payout.","-2089488446":"If you select \"Ends Between\", you win the payout if the exit spot is strictly higher than the Low barrier AND strictly lower than the High barrier.","-1876950330":"If you select \"Ends Outside\", you win the payout if the exit spot is EITHER strictly higher than the High barrier, OR strictly lower than the Low barrier.","-546460677":"If the exit spot is equal to either the Low barrier or the High barrier, you don't win the payout.","-1812957362":"If you select \"Stays Between\", you win the payout if the market stays between (does not touch) either the High barrier or the Low barrier at any time during the contract period","-220379757":"If you select \"Goes Outside\", you win the payout if the market touches either the High barrier or the Low barrier at any time during the contract period.","-1281286610":"If you select \"Matches\", you will win the payout if the last digit of the last tick is the same as your prediction.","-1929209278":"If you select \"Even\", you will win the payout if the last digit of the last tick is an even number (i.e., 2, 4, 6, 8, or 0).","-2038865615":"If you select \"Odd\", you will win the payout if the last digit of the last tick is an odd number (i.e., 1, 3, 5, 7, or 9).","-1416078023":"If you select \"Touch\", you win the payout if the market touches the barrier at any time during the contract period.","-1272255095":"If the exit spot is equal to the barrier or the new barrier (if a reset occurs), you don't win the payout.","-231957809":"Win maximum payout if the exit spot is higher than or equal to the upper barrier.","-464144986":"Win maximum payout if the exit spot is lower than or equal to the lower barrier.","-1031456093":"Win up to maximum payout if exit spot is between lower and upper barrier, in proportion to the difference between upper barrier and exit spot.","-968162707":"No payout if exit spot is above or equal to the upper barrier.","-299450697":"If you select \"High Tick\", you win the payout if the selected tick is the highest among the next five ticks.","-705681870":"By purchasing the \"High-to-Low\" contract, you'll win the multiplier times the difference between the high and low over the duration of the contract.","-420387848":"The high is the highest point ever reached by the market during the contract period.","-1666375348":"By purchasing the \"High-to-Close\" contract, you'll win the multiplier times the difference between the high and close over the duration of the contract.","-2024955268":"If you select “Up”, you will earn a profit by closing your position when the market price is higher than the entry spot.","-1598433845":"If you select “Down”, you will earn a profit by closing your position when the market price is lower than the entry spot.","-1092777202":"The Stop-out level on the chart indicates the price at which your potential loss equals your entire stake. When the market price reaches this level, your position will be closed automatically. This ensures that your loss does not exceed the amount you paid to purchase the contract.","-885323297":"These are optional parameters for each position that you open:","-584696680":"If you select “Take profit” and specify an amount that you’d like to earn, your position will be closed automatically when your profit is more than or equals to this amount. Your profit may be more than the amount you entered depending on the market price at closing.","-178096090":"“Take profit” cannot be updated. You may update it only when “Deal cancellation” expires.","-206909651":"The entry spot is the market price when your contract is processed by our servers.","-1139774694":"<0>For Put:<1/>You will get a payout if the market price is lower than the strike price at the expiry time. Your payout will grow proportionally to the distance between the market and strike prices. You will start making a profit when the payout is higher than your stake. If the market price is equal to or above the strike price at the expiry time, there won’t be a payout.","-351875097":"Number of ticks","-138599872":"<0>For {{contract_type}}: Get a payout if {{index_name}} is {{strike_status}} than the strike price at the expiry time. Your payout is zero if the market is {{market_status}} or equal to the strike price at the expiry time. You will start making a profit when the payout is higher than your stake.","-2014059656":"higher","-149836494":"Your transaction reference number is {{transaction_id}}","-1382749084":"Go back to trading","-1231210510":"Tick","-1239477911":"second","-1585766960":"min","-1652791614":"mins","-1977959027":"hours","-8998663":"Digit: {{last_digit}} ","-1435392215":"About deal cancellation","-2017825013":"Got it","-1280319153":"Cancel your trade anytime within a chosen time-frame. Triggered automatically if your trade reaches the stop out level within the chosen time-frame.","-471757681":"Risk management","-843831637":"Stop loss","-771725194":"Deal Cancellation","-621128676":"Trade type","-45873457":"NEW","-127118348":"Choose {{contract_type}}","-543478618":"Try checking your spelling or use a different term","-338707425":"Minimum duration is 1 day","-1003473648":"Duration: {{duration}} day","-700280380":"Deal cancel. fee","-194424366":"above","-1527492178":"Purchase Locked","-725375562":"You can lock/unlock the purchase button from the Settings menu","-2131851017":"Growth rate","-1358367903":"Stake","-542594338":"Max. payout","-690963898":"Your contract will be automatically closed when your payout reaches this amount.","-511541916":"Your contract will be automatically closed upon reaching this number of ticks.","-1918235233":"Min. stake","-1935239381":"Max. stake","-1930565757":"Your stake is a non-refundable one-time premium to purchase this contract. Your total profit/loss equals the contract value minus your stake.","-434270664":"Current Price","-1956787775":"Barrier Price:","-1513281069":"Barrier 2","-390994177":"Should be between {{min}} and {{max}}","-2055106024":"Toggle between advanced and simple duration settings","-1012793015":"End time","-2037881712":"Your contract will be closed automatically at the next available asset price on <0>.","-629549519":"Commission <0/>","-2131859340":"Stop out <0/>","-1686280757":"<0>{{commission_percentage}}% of (<1/> * {{multiplier}})","-1043117679":"When your current loss equals or exceeds {{stop_out_percentage}}% of your stake, your contract will be closed at the nearest available asset price.","-339236213":"Multiplier","-857660728":"Strike Prices","-119134980":"<0>{{trade_type}}: You will get a payout if the market price is {{payout_status}} this price <0>at the expiry time. Otherwise, your payout will be zero.","-243332856":"Last digit stats for latest 1000 ticks for {{ underlying_name }}","-1900883796":"<0>{{trade_type}}: You will get a payout if the market is {{payout_status}} this price <0>at the expiry time. Otherwise, your payout will be zero.","-347156282":"Submit Proof","-1738427539":"Purchase","-461955353":"purchase price","-172348735":"profit","-1624674721":"contract type","-1644154369":"entry spot time","-510792478":"entry spot price","-1974651308":"exit spot time","-1600267387":"exit spot price","-514917720":"barrier","-2004386410":"Win","-1072292603":"No Change","-1631669591":"string","-1768939692":"number","-795152863":"green","-1640576332":"blue","-804983649":"yellow","-94281841":"red","-1242470654":"Earned money","-1429914047":"Low","-1893628957":"Open Time","-1896106455":"10 minutes","-999492762":"15 minutes","-1978767852":"30 minutes","-293628675":"1 hour","-385604445":"2 hours","-1965813351":"4 hours","-525321833":"1 day","-1691868913":"Touch/No Touch","-151151292":"Asians","-1048378719":"Reset Call/Reset Put","-1282312809":"High/Low Ticks","-1237186896":"Only Ups/Only Downs","-529846150":"Seconds","-2035315547":"Low barrier","-1635771697":"middle","-1529389221":"Histogram","-1819860668":"MACD","-1750896349":"D'Alembert","-102980621":"The Oscar's Grind Strategy is a low-risk positive progression strategy that first appeared in 1965. By using this strategy, the size of your contract will increase after successful trades, but remains unchanged after unsuccessful trades.","-2002533437":"Custom function","-215053350":"with:","-1257232389":"Specify a parameter name:","-1885742588":"with: ","-188442606":"function {{ function_name }} {{ function_params }} {{ dummy }}","-313112159":"This block is similar to the one above, except that this returns a value. The returned value can be assigned to a variable of your choice.","-1783320173":"Prematurely returns a value within a function","-1485521724":"Conditional return","-1482801393":"return","-46453136":"get","-1838027177":"first","-1182568049":"Get list item","-1675454867":"This block gives you the value of a specific item in a list, given the position of the item. It can also remove the item from the list.","-381501912":"This block creates a list of items from an existing list, using specific item positions.","-426766796":"Get sub-list","-1679267387":"in list {{ input_list }} find {{ first_or_last }} occurence of item {{ input_value }}","-2087996855":"This block gives you the position of an item in a given list.","-422008824":"Checks if a given list is empty","-1343887675":"This block checks if a given list is empty. It returns “True” if the list is empty, “False” if otherwise.","-1548407578":"length of {{ input_list }}","-1786976254":"This block gives you the total number of items in a given list.","-2113424060":"create list with item {{ input_item }} repeated {{ number }} times","-1955149944":"Repeat an item","-434887204":"set","-197957473":"as","-851591741":"Set list item","-1874774866":"ascending","-1457178757":"Sorts the items in a given list","-350986785":"Sort list","-324118987":"make text from list","-155065324":"This block creates a list from a given string of text, splitting it with the given delimiter. It can also join items in a list into a string of text.","-459051222":"Create list from text","-977241741":"List Statement","-451425933":"{{ break_or_continue }} of loop","-323735484":"continue with next iteration","-1592513697":"Break out/continue","-713658317":"for each item {{ variable }} in list {{ input_list }}","-1825658540":"Iterates through a given list","-952264826":"repeat {{ number }} times","-887757135":"Repeat (2)","-1608672233":"This block is similar to the block above, except that the number of times it repeats is determined by a given variable.","-533154446":"Repeat (1)","-1059826179":"while","-1893063293":"until","-279445533":"Repeat While/Until","-1003706492":"User-defined variable","-359097473":"set {{ variable }} to {{ value }}","-1588521055":"Sets variable value","-980448436":"Set variable","-1538570345":"Get the last trade information and result, then trade again.","-222725327":"Here is where you can decide if your bot should continue trading.","-1638446329":"Result is {{ win_or_loss }}","-1968029988":"Last trade result","-1588406981":"You can check the result of the last trade with this block.","-1459154781":"Contract Details: {{ contract_detail }}","-1652241017":"Reads a selected property from contract details list","-2082345383":"These blocks transfer control to the Purchase conditions block.","-172574065":"This block will transfer the control back to the Purchase conditions block, enabling you to purchase another contract.","-403103225":"restart","-837044282":"Ask Price {{ contract_type }}","-1033917049":"This block returns the purchase price for the selected trade type.","-1863737684":"2. Purchase conditions","-228133740":"Specify contract type and purchase conditions.","-1291088318":"Purchase conditions","-1098726473":"This block is mandatory. Only one copy of this block is allowed. You can place the Purchase block (see below) here as well as conditional blocks to define your purchase conditions.","-1777988407":"Payout {{ contract_type }}","-511116341":"This block returns the potential payout for the selected trade type","-1943211857":"Potential payout","-813464969":"buy","-53668380":"True if active contract can be sold before expiration at current market price","-43337012":"Sell profit/loss","-2112866691":"Returns the profit/loss from selling at market price","-2132417588":"This block gives you the potential profit or loss if you decide to sell your contract.","-1360483055":"set {{ variable }} to Bollinger Bands {{ band_type }} {{ dummy }}","-20542296":"Calculates Bollinger Bands (BB) from a list with a period","-1951109427":"Bollinger Bands (BB)","-857226052":"BB is a technical analysis indicator that’s commonly used by traders. The idea behind BB is that the market price stays within the upper and lower bands for 95% of the time. The bands are the standard deviations of the market price, while the line in the middle is a simple moving average line. If the price reaches either the upper or lower band, there’s a possibility of a trend reversal.","-325196350":"set {{ variable }} to Bollinger Bands Array {{ band_type }} {{ dummy }}","-199689794":"Similar to BB. This block gives you a choice of returning the values of either the lower band, higher band, or the SMA line in the middle.","-920690791":"Calculates Exponential Moving Average (EMA) from a list with a period","-960641587":"EMA is a type of moving average that places more significance on the most recent data points. It’s also known as the exponentially weighted moving average. EMA is different from SMA in that it reacts more significantly to recent price changes.","-1557584784":"set {{ variable }} to Exponential Moving Average Array {{ dummy }}","-32333344":"Calculates Moving Average Convergence Divergence (MACD) from a list","-628573413":"MACD is calculated by subtracting the long-term EMA (26 periods) from the short-term EMA (12 periods). If the short-term EMA is greater or lower than the long-term EMA than there’s a possibility of a trend reversal.","-1133676960":"Fast EMA Period {{ input_number }}","-883166598":"Period {{ input_period }}","-450311772":"set {{ variable }} to Relative Strength Index {{ dummy }}","-1861493523":"Calculates Relative Strength Index (RSI) list from a list of values with a period","-880048629":"Calculates Simple Moving Average (SMA) from a list with a period","-1150972084":"Market direction","-276935417":"This block is used to determine if the market price moves in the selected direction or not. It gives you a value of “True” or “False”.","-764931948":"in candle list get # from end {{ input_number }}","-924607337":"Returns the last digit of the latest tick","-560033550":"Returns the list of last digits of 1000 recent tick values","-74062476":"Make a List of {{ candle_property }} values in candles list with interval: {{ candle_interval_type }}","-1556495906":"Returns a list of specific values from a candle list according to selected time interval","-166816850":"Create a list of candle values (1)","-1261436901":"Candles List","-1174859923":"Read the selected candle value","-1972165119":"Read candle value (1)","-1956100732":"You can use this block to analyze the ticks, regardless of your trades","-443243232":"The content of this block is called on every tick. Place this block outside of any root block.","-641399277":"Last Tick","-1628954567":"Returns the value of the last tick","-1332756793":"This block gives you the value of the last tick.","-2134440920":"Last Tick String","-1466340125":"Tick value","-467913286":"Tick value Description","-785831237":"This block gives you a list of the last 1000 tick values.","-1546430304":"Tick List String Description","-1788626968":"Returns \"True\" if the given candle is black","-436010611":"Make a list of {{ candle_property }} values from candles list {{ candle_list }}","-1384340453":"Returns a list of specific values from a given candle list","-584859539":"Create a list of candle values (2)","-2010558323":"Read {{ candle_property }} value in candle {{ input_candle }}","-2846417":"This block gives you the selected candle value.","-1587644990":"Read candle value (2)","-1202212732":"This block returns account balance","-1737837036":"Account balance","-1963883840":"Put your blocks in here to prevent them from being removed","-1284013334":"Use this block if you want some instructions to be ignored when your bot runs. Instructions within this block won’t be executed.","-1217253851":"Log","-1987568069":"Warn","-104925654":"Console","-1956819233":"This block displays messages in the developer's console with an input that can be either a string of text, a number, boolean, or an array of data.","-1450461842":"Load block from URL: {{ input_url }}","-1088614441":"Loads blocks from URL","-1747943728":"Loads from URL","-2105753391":"Notify Telegram {{ dummy }} Access Token: {{ input_access_token }} Chat ID: {{ input_chat_id }} Message: {{ input_message }}","-1008209188":"Sends a message to Telegram","-1218671372":"Displays a notification and optionally play selected sound","-2099284639":"This block gives you the total profit/loss of your trading strategy since your bot started running. You can reset this by clicking “Clear stats” on the Transaction Stats window, or by refreshing this page in your browser.","-683825404":"Total Profit String","-718220730":"Total Profit String Description","-1861858493":"Number of runs","-264195345":"Returns the number of runs","-303451917":"This block gives you the total number of times your bot has run. You can reset this by clicking “Clear stats” on the Transaction Stats window, or by refreshing this page in your browser.","-2132861129":"Conversion Helper Block","-74095551":"Seconds Since Epoch","-15528039":"Returns the number of seconds since January 1st, 1970","-729807788":"This block returns the number of seconds since January 1st, 1970.","-1370107306":"{{ dummy }} {{ stack_input }} Run after {{ number }} second(s)","-558838192":"Delayed run","-1975250999":"This block converts the number of seconds since the Unix Epoch (1 January 1970) into a string of text representing the date and time.","-702370957":"Convert to date/time","-982729677":"Convert to timestamp","-311268215":"This block converts a string of text that represents the date and time into seconds since the Unix Epoch (1 January 1970). The time and time zone offset are optional. Example: 2019-01-01 21:03:45 GMT+0800 will be converted to 1546347825.","-1797602591":"Stop Loss: {{ currency }} {{ stop_loss }}","-1214929127":"Stop loss must be a positive number.","-780745489":"If the contract type is “Both”, then the Purchase Conditions should include both Rise and Fall using the “Conditional Block\"","-2142851225":"Multiplier trade options","-625636913":"Amount must be a positive number.","-1466383897":"Duration: {{ duration_unit }} {{ duration_value }}","-440702280":"Trade options","-1193894978":"Define your trade options such as duration and stake. Some options are only applicable for certain trade types.","-46523443":"Duration value is not allowed. To run the bot, please enter a value between {{min}} to {{max}}.","-1483427522":"Trade Type: {{ trade_type_category }} > {{ trade_type }}","-323348124":"1. Trade parameters","-1671903503":"Run once at start:","-783173909":"Trade options:","-376956832":"Here is where you define the parameters of your contract.","-1244007240":"if {{ condition }} then","-1577206704":"else if","-33796979":"true","-1434883449":"This is a single block that returns a boolean value, either true or false.","-1946404450":"Compares two values","-979918560":"This block converts the boolean value (true or false) to its opposite.","-2047257743":"Null","-1274387519":"Performs selected logic operation","-766386234":"This block performs the \"AND\" or the \"OR\" logic operation.","-790995537":"test {{ condition }}","-1860211657":"if false {{ return_value }}","-1643760249":"This block tests if a given value is true or false and returns “True” or “False” accordingly.","-1551875333":"Test value","-52486882":"Arithmetical operations","-1010436425":"This block adds the given number to the selected variable","-999773703":"Change variable","-1272091683":"Mathematical constants","-1396629894":"constrain {{ number }} low {{ low_number }} high {{ high_number }}","-425224412":"This block constrains a given number so that it is within a set range.","-2072551067":"Constrain within a range","-43523220":"remainder of {{ number1 }} ÷ {{ number2 }}","-1291857083":"Returns the remainder after a division","-592154850":"Remainder after division","-736665095":"Returns the remainder after the division of the given numbers.","-1266992960":"Math Number Description","-77191651":"{{ number }} is {{ type }}","-817881230":"even","-142319891":"odd","-1000789681":"whole","-1735674752":"Test a number","-1017805068":"This block tests a given number according to the selection and it returns a value of “True” or “False”. Available options: Even, Odd, Prime, Whole, Positive, Negative, Divisible","-1858332062":"Number","-1053492479":"Enter an integer or fractional number into this block. Please use `.` as a decimal separator for fractional numbers.","-927097011":"sum","-1653202295":"max","-1555878023":"average","-1748351061":"mode","-992067330":"Aggregate operations","-1691561447":"This block gives you a random fraction between 0.0 to 1.0","-523625686":"Random fraction number","-933024508":"Rounds a given number to an integer","-1656927862":"This block rounds a given number according to the selection: round, round up, round down.","-1495304618":"absolute","-61210477":"Operations on a given number","-181644914":"This block performs the selected operations to a given number.","-840732999":"to {{ variable }} append text {{ input_text }}","-1469497908":"Appends a given text to a variable","-1851366276":"Text Append","-1666316828":"Appends a given text to a variable.","-1902332770":"Transform {{ input_text }} to {{ transform_type }}","-1489004405":"Title Case","-904432685":"Changes text case accordingly","-882381096":"letter #","-1027605069":"letter # from end","-2066990284":"random letter","-337089610":"in text {{ input_text1 }} find {{ first_or_last }} occurence of text {{ input_text2 }}","-1966694141":"Searches through a string of text for a specific occurrence of a given character or word, and returns the position.","-697543841":"Text join","-141160667":"length of {{ input_text }}","-1133072029":"Text String Length","-1109723338":"print {{ input_text }}","-736668830":"Print","-1821552998":"trim spaces from {{ side }} of {{ input_text }}","-801766026":"right side","-474779821":"Trims spaces","-1219239717":"One or more mandatory blocks are missing from your workspace. Please add the required block(s) and then try again.","-250761331":"One or more mandatory blocks are disabled in your workspace. Please enable the required block(s) and then try again.","-1687036846":"Download block","-1266781295":"Expand","-894560707":"function","-1867119688":"Duplicate","-610728049":"Rearrange Vertically","-2033146714":"Collapse All Blocks","-958601558":"Delete Block","-1193267384":"Detach Block","-1750478127":"New variable name","-1061878051":"Y","-2047029150":"Unable to load the block file.","-1410769167":"Target must be an XML file","-609157479":"This URL is already loaded","-241945454":"Proposals are not ready","-1087890592":"Maximum loss amount reached","-1030545878":"You are rate limited for: {{ message_type }}, retrying in {{ delay }}s (ID: {{ request }})","-490766438":"You are disconnected, retrying in {{ delay }}s","-1389975609":"unknown","-1900515692":"Duration must be a positive integer","-245297595":"Please login","-1445046468":"Given candle is not valid","-1891622945":"{{hourPast}}h ago","-538215347":"Net deposits","-280147477":"All transactions","-130601012":"Please select duration","-232254547":"Custom","-1577570698":"Start date","-1251526905":"Last 7 days","-1904030160":"Transaction performed by (App ID: {{app_id}})","-513103225":"Transaction time","-2066666313":"Credit/Debit","-2140412463":"Buy price","-1981004241":"Sell time","-600828210":"Indicative profit/loss","-706219815":"Indicative price","-3423966":"Take profit<0 />Stop loss","-2082644096":"Current stake","-1131753095":"The {{trade_type_name}} contract details aren't currently available. We're working on making them available soon.","-360975483":"You've made no transactions of this type during this period.","-740395276":"I don’t have any of these","-2092611555":"Sorry, this app is unavailable in your current location.","-1488537825":"If you have an account, log in to continue.","-555592125":"Unfortunately, trading options isn't possible in your country","-1571816573":"Sorry, trading is unavailable in your current location.","-1603581277":"minutes","-922253974":"Rise/Fall","-1361254291":"Higher/Lower","-335816381":"Ends In/Ends Out","-1789807039":"Asian Up/Asian Down","-330437517":"Matches/Differs","-657360193":"Over/Under","-558031309":"High Tick/Low Tick","-123659792":"Vanillas","-1714959941":"This chart display is not ideal for tick contracts","-1254554534":"Please change the chart duration to tick for a better trading experience.","-1658230823":"Contract was sold for <0 />.","-1905867404":"Contract cancelled"} \ No newline at end of file diff --git a/packages/translations/src/translations/ach.json b/packages/translations/src/translations/ach.json index bc4f5a08a421..b33787fe69d6 100644 --- a/packages/translations/src/translations/ach.json +++ b/packages/translations/src/translations/ach.json @@ -317,7 +317,6 @@ "379523479": "crwdns1259503:0crwdne1259503:0", "380606668": "crwdns1259507:0crwdne1259507:0", "380694312": "crwdns1259509:0crwdne1259509:0", - "382781785": "crwdns1259511:0crwdne1259511:0", "384303768": "crwdns1259513:0crwdne1259513:0", "386191140": "crwdns1719363:0crwdne1719363:0", "386278304": "crwdns1259515:0{{platform_name_trader}}crwdne1259515:0", @@ -371,6 +370,7 @@ "437904704": "crwdns1259593:0crwdne1259593:0", "438067535": "crwdns1259595:0crwdne1259595:0", "442520703": "crwdns1259597:0crwdne1259597:0", + "443203714": "crwdns2225567:0crwdne2225567:0", "443559872": "crwdns1259599:0crwdne1259599:0", "444484637": "crwdns1259601:0crwdne1259601:0", "445419365": "crwdns1335107:0crwdne1335107:0", @@ -455,6 +455,7 @@ "545476424": "crwdns1259739:0crwdne1259739:0", "546534357": "crwdns1259741:0crwdne1259741:0", "549479175": "crwdns1259743:0crwdne1259743:0", + "550589723": "crwdns2225569:0{{growth_rate}}crwdnd2225569:0{{tick_size_barrier}}crwdne2225569:0", "551569133": "crwdns1259745:0crwdne1259745:0", "554135844": "crwdns2101755:0crwdne2101755:0", "554410233": "crwdns1259747:0crwdne1259747:0", @@ -524,6 +525,7 @@ "627814558": "crwdns1259859:0crwdne1259859:0", "628193133": "crwdns1445483:0crwdne1445483:0", "629145209": "crwdns1259861:0crwdne1259861:0", + "629395043": "crwdns2225571:0crwdne2225571:0", "632398049": "crwdns1259865:0crwdne1259865:0", "634219491": "crwdns1259867:0crwdne1259867:0", "636219628": "crwdns1259869:0crwdne1259869:0", @@ -674,6 +676,7 @@ "802438383": "crwdns1260137:0crwdne1260137:0", "802556390": "crwdns1260139:0crwdne1260139:0", "802989607": "crwdns1260141:0crwdne1260141:0", + "803500173": "crwdns2225573:0crwdne2225573:0", "806165583": "crwdns1781113:0crwdne1781113:0", "807499069": "crwdns1260145:0crwdne1260145:0", "808323704": "crwdns1260147:0crwdne1260147:0", @@ -1093,6 +1096,7 @@ "1264842111": "crwdns1719395:0crwdne1719395:0", "1265704976": "crwdns1260849:0crwdne1260849:0", "1270581106": "crwdns1260851:0crwdne1260851:0", + "1271461759": "crwdns2225575:0crwdne2225575:0", "1272012156": "crwdns1260853:0crwdne1260853:0", "1272337240": "crwdns1260855:0crwdne1260855:0", "1272681097": "crwdns1260857:0crwdne1260857:0", @@ -1430,7 +1434,6 @@ "1641395634": "crwdns1261437:0crwdne1261437:0", "1641635657": "crwdns1261439:0crwdne1261439:0", "1641980662": "crwdns1261441:0crwdne1261441:0", - "1642645912": "crwdns1822827:0crwdne1822827:0", "1644703962": "crwdns1925315:0crwdne1925315:0", "1644864436": "crwdns1787789:0crwdne1787789:0", "1644908559": "crwdns1261443:0crwdne1261443:0", @@ -1588,6 +1591,7 @@ "1803338729": "crwdns1261695:0crwdne1261695:0", "1804620701": "crwdns1261697:0crwdne1261697:0", "1804789128": "crwdns1261699:0{{display_value}}crwdne1261699:0", + "1806017862": "crwdns2225577:0crwdne2225577:0", "1806355993": "crwdns1261701:0crwdne1261701:0", "1806503050": "crwdns1261703:0crwdne1261703:0", "1808058682": "crwdns1261705:0crwdne1261705:0", @@ -2629,6 +2633,7 @@ "-1511825574": "crwdns70276:0crwdne70276:0", "-726626679": "crwdns70278:0crwdne70278:0", "-338379841": "crwdns70280:0crwdne70280:0", + "-2027409966": "crwdns2225579:0crwdne2225579:0", "-1525144993": "crwdns156874:0crwdne156874:0", "-1167474366": "crwdns156876:0crwdne156876:0", "-555886064": "crwdns70286:0crwdne70286:0", @@ -3441,7 +3446,6 @@ "-2039780875": "crwdns81169:0crwdne81169:0", "-1672470173": "crwdns81171:0crwdne81171:0", "-1342661765": "crwdns81173:0crwdne81173:0", - "-1738427539": "crwdns69912:0crwdne69912:0", "-504410042": "crwdns1822837:0crwdne1822837:0", "-1907770956": "crwdns1822839:0crwdne1822839:0", "-997670083": "crwdns1822841:0crwdne1822841:0", @@ -3503,9 +3507,11 @@ "-194424366": "crwdns1781095:0crwdne1781095:0", "-1527492178": "crwdns81417:0crwdne81417:0", "-725375562": "crwdns81419:0crwdne81419:0", - "-601992465": "crwdns1822845:0crwdne1822845:0", - "-30171993": "crwdns1822847:0{{growth_rate}}crwdnd1822847:0{{tick_size_barrier}}crwdne1822847:0", + "-2131851017": "crwdns2225581:0crwdne2225581:0", "-1358367903": "crwdns69662:0crwdne69662:0", + "-542594338": "crwdns2225583:0crwdne2225583:0", + "-690963898": "crwdns2225585:0crwdne2225585:0", + "-511541916": "crwdns2225587:0crwdne2225587:0", "-1918235233": "crwdns1781097:0crwdne1781097:0", "-1935239381": "crwdns1781099:0crwdne1781099:0", "-1930565757": "crwdns1781101:0crwdne1781101:0", @@ -3520,14 +3526,13 @@ "-2131859340": "crwdns158214:0crwdne158214:0", "-1686280757": "crwdns121916:0{{commission_percentage}}crwdnd121916:0{{multiplier}}crwdne121916:0", "-1043117679": "crwdns158216:0{{stop_out_percentage}}crwdne158216:0", - "-477998532": "crwdns89654:0crwdne89654:0", - "-2008947191": "crwdns1822849:0crwdne1822849:0", "-339236213": "crwdns81045:0crwdne81045:0", "-857660728": "crwdns1781103:0crwdne1781103:0", "-119134980": "crwdns1781105:0{{trade_type}}crwdnd1781105:0{{payout_status}}crwdne1781105:0", "-243332856": "crwdns117904:0{{ underlying_name }}crwdne117904:0", "-1900883796": "crwdns1781107:0{{trade_type}}crwdnd1781107:0{{payout_status}}crwdne1781107:0", "-347156282": "crwdns1807479:0crwdne1807479:0", + "-1738427539": "crwdns69912:0crwdne69912:0", "-461955353": "crwdns69664:0crwdne69664:0", "-172348735": "crwdns69666:0crwdne69666:0", "-1624674721": "crwdns69668:0crwdne69668:0", diff --git a/packages/translations/src/translations/ar.json b/packages/translations/src/translations/ar.json index f76aa3c31e7b..1e70897bc0df 100644 --- a/packages/translations/src/translations/ar.json +++ b/packages/translations/src/translations/ar.json @@ -317,7 +317,6 @@ "379523479": "لتجنب خسارة الأموال، لا تشارك الرموز المميزة مع نطاق الإدارة مع أطراف غير مصرح بها.", "380606668": "علامة", "380694312": "الحد الأقصى للتداولات المتتالية", - "382781785": "يتم إغلاق عقدك تلقائيًا عندما يكون ربحك أكثر من أو يساوي هذا المبلغ.", "384303768": "تُرجع هذه الكتلة «True» إذا كانت الشمعة الأخيرة سوداء. يمكن وضعها في أي مكان على اللوحة باستثناء الكتلة الجذرية لمعايير التجارة.", "386191140": "يمكنك الاختيار بين حسابات تداول CFD أو حسابات الخيارات والمضاعفات", "386278304": "قم بتثبيت تطبيق الويب {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "الحد الأقصى للصفقات المفتوحة", "438067535": "أكثر من 500,000 دولار", "442520703": "250,001 دولار - 500,000 دولار", + "443203714": "سيتم إغلاق عقدك تلقائيًا إذا وصلت خسارتك إلى هذا المبلغ.", "443559872": "SVG المالي", "444484637": "نفي المنطق", "445419365": "1 - 2 سنوات", @@ -455,6 +455,7 @@ "545476424": "إجمالي عمليات السحب", "546534357": "إذا اخترت «إلغاء الصفقة»، فستتمكن من إلغاء تداولك في غضون إطار زمني محدد إذا تحرك السوق عكس صالحك. سوف نفرض رسومًا بسيطة مقابل ذلك، لكننا سنعيد مبلغ حصتك دون ربح أو خسارة. إذا تم الوصول إلى مبلغ الإيقاف قبل انتهاء صلاحية إلغاء الصفقة، فسيتم إلغاء مركزك تلقائيًا وسنعيد مبلغ حصتك دون ربح أو خسارة. عندما يكون «إلغاء الصفقة» نشطًا:", "549479175": "المضاعفات من Deriv", + "550589723": "ستنمو حصتك بنسبة {{growth_rate}}% لكل علامة طالما ظل السعر الفوري الحالي في حدود ±{{tick_size_barrier}} من السعر الفوري السابق.", "551569133": "تعرف على المزيد حول حدود التداول", "554135844": "تعديل", "554410233": "هذه هي أفضل 10 كلمات مرور شائعة", @@ -524,6 +525,7 @@ "627814558": "تقوم هذه الكتلة بإرجاع قيمة عندما يكون الشرط صحيحًا. استخدم هذه الكتلة داخل أي من كتل الوظائف أعلاه.", "628193133": "معرف الحساب", "629145209": "في حالة تحديد عملية «AND»، تقوم الكتلة بإرجاع «True» فقط إذا كانت القيمتان المعينتين «True»", + "629395043": "جميع معدلات النمو", "632398049": "تقوم هذه الكتلة بتعيين قيمة فارغة لعنصر أو بيان.", "634219491": "لم تقدم رَقَم التعريف الضريبي الخاص بك. هذه المعلومات ضرورية للمتطلبات القانونية والتنظيمية. يرجى الانتقال إلى <0>التفاصيل الشخصية في إعدادات حسابك، و أملأ أحدث رَقَم تعريف ضريبي.", "636219628": "<0>ج. إذا لم يتم العثور على فرصة للتسوية، ستنتقل الشكوى إلى مرحلة التحديد الذي ستتعامل معها لجنة فض المنازعات", @@ -674,6 +676,7 @@ "802438383": "مطلوب اثبات جديد على العنوان", "802556390": "ثواني", "802989607": "اسحب ملف XML الخاص بك هنا", + "803500173": "الحصة الأولية", "806165583": "أستراليا ٢٠٠", "807499069": "إجراءات شكاوى الهيئة المالية", "808323704": "يمكنك أيضًا استخدام كتل «المقارنة» و «التشغيل المنطقي» لعمل متغيرات الاختبار.", @@ -1093,6 +1096,7 @@ "1264842111": "يمكنك التبديل بين الحسابات الحقيقية والتجريبية.", "1265704976": "", "1270581106": "إذا اخترت «No Touch»، فستفوز بالدفع إذا لم يلمس السوق الحاجز مطلقًا في أي وقت خلال فترة العقد.", + "1271461759": "سيتم إغلاق عقدك تلقائيًا إذا وصل ربحك إلى هذا المبلغ.", "1272012156": "جنيه إسترليني/فرنك سويسري", "1272337240": "أيام", "1272681097": "ساعات", @@ -1430,7 +1434,6 @@ "1641395634": "قائمة الأرقام الأخيرة", "1641635657": "مطلوب وثيقة إثبات هوية جديدة", "1641980662": "التحية مطلوبة.", - "1642645912": "جميع الأسعار", "1644703962": "هل تبحث عن حسابات عقود الفروقات/CFD ؟ الانتقال إلى Trader's Hub", "1644864436": "ستحتاج إلى توثيق حسابك قبل أن تطلب أن تصبح عميلًا محترفًا. <0>قم بمصادقة حسابي", "1644908559": "رمز الرقم مطلوب.", @@ -1588,6 +1591,7 @@ "1803338729": "اختر نوع العقد الذي تريد تداوله. على سبيل المثال، بالنسبة لنوع تداول Rise/Fall، يمكنك اختيار أحد الخيارات الثلاثة: الارتفاع أو السقوط أو كلاهما. سيحدد الخيار المحدد الخيارات المتاحة لمجموعة الشراء.", "1804620701": "انتهاء الصلاحية", "1804789128": "{{display_value}} علامة", + "1806017862": "الحد الأقصى للقراد", "1806355993": "بدون عمولة", "1806503050": "يرجى ملاحظة أن بعض طرق الدفع قد لا تكون متاحة في بلدك.", "1808058682": "تم تحميل الكتل بنجاح", @@ -2095,7 +2099,7 @@ "-629011256": "لا تقم بتحديث هذه الصفحة", "-1005231905": "بمجرد الانتهاء، سنأخذك إلى الخطوة التالية", "-542134805": "قم بتحميل الصورة", - "-1462975230": "مثال المستند", + "-1462975230": "مثال على المستند", "-1472844935": "يجب أن تعرض الصورة المستند الخاص بك بوضوح", "-189310067": "تم إغلاق الحساب", "-849320995": "التقييمات", @@ -2104,7 +2108,7 @@ "-1498206510": "حدود الحساب", "-241588481": "سجل تسجيل الدخول", "-966136867": "تطبيقات متصلة", - "-213009361": "مصادقة ثنائية", + "-213009361": "المصادقة الثنائية (2FA)", "-1214803297": "مسار لوحة التحكم فقط", "-526636259": "خطأ 404", "-1030759620": "مسؤولون حكوميون", @@ -2235,7 +2239,7 @@ "-536187647": "تأكيد إلغاء الوصول؟", "-1357606534": "الإذن", "-570222048": "إلغاء الوصول", - "-1076138910": "التجارة", + "-1076138910": "التداول", "-488597603": "معلومات التداول", "-1666909852": "عمليات الدفع", "-1725454783": "فشلت", @@ -2245,14 +2249,14 @@ "-2143208677": "انقر فوق زر <0>تغيير كلمة المرور لتغيير كلمة مرور Deriv MT5.", "-9570380": "استخدم كلمة المرور {{platform_name_dxtrade}} لتسجيل الدخول إلى حسابات {{platform_name_dxtrade}} الخاصة بك على الويب وتطبيقات الهاتف المحمول.", "-2131200819": "تعطيل", - "-200487676": "تمكين", + "-200487676": "تفعيل", "-1840392236": "هذا ليس الرمز الصحيح. يرجى المحاولة مرة أخرى.", - "-2067796458": "رمز المصادقة", + "-2067796458": "رمز التوثيق", "-790444493": "قم بحماية حسابك باستخدام 2FA. في كل مرة تقوم فيها بتسجيل الدخول إلى حسابك، ستحتاج إلى إدخال كلمة المرور ورمز المصادقة الذي تم إنشاؤه بواسطة تطبيق 2FA على هاتفك الذكي.", "-368010540": "لقد قمت بتمكين 2FA لحساب Deriv الخاص بك.", "-403552929": "لتعطيل 2FA، يرجى إدخال رمز المصادقة المكون من ستة أرقام الذي تم إنشاؤه بواسطة تطبيق 2FA أدناه:", "-752939584": "كيفية إعداد 2FA لحساب Deriv الخاص بك", - "-90649785": "انقر هنا لنسخ المفتاح", + "-90649785": "انقر هنا لنسخ الرمز", "-206376148": "تم نسخ المفتاح!", "-650175948": "كشف حساب مصرفي حديث أو خطاب صادر عن جهة حكومية مع اسمك وعنوانك.", "-2006895756": "1. عنوان", @@ -2298,11 +2302,11 @@ "-1662154767": "فاتورة مرافق حديثة (مثل الكهرباء أو الماء أو الغاز أو الهاتف الأرضي أو الإنترنت) أو كشف حساب مصرفي أو خطاب صادر عن جهة حكومية باسمك وهذا العنوان.", "-223216785": "السطر الثاني من العنوان*", "-594456225": "السطر الثاني من العنوان", - "-1940457555": "الرمز البريدي/البريدي*", - "-1964954030": "الرمز البريدي/البريدي", + "-1940457555": "الرمز البريدي*", + "-1964954030": "الرمز البريدي", "-516397235": "كن حذرًا مع من تشارك هذا الرمز المميز. يمكن لأي شخص لديه هذا الرمز تنفيذ الإجراءات التالية نيابة عن حسابك", "-989216986": "إضافة حسابات", - "-617480265": "حذف الرمز المميز", + "-617480265": "حذف الرمز", "-316749685": "هل تريد بالتأكيد حذف هذا الرمز المميز؟", "-786372363": "تعرف على المزيد حول رمز API", "-55560916": "للوصول إلى تطبيقات الأجهزة المحمولة وتطبيقات الطرف الثالث الأخرى، ستحتاج أولاً إلى إنشاء رمز API.", @@ -2322,7 +2326,7 @@ "-1117963487": "قم بتسمية الرمز المميز الخاص بك وانقر على «إنشاء» لإنشاء الرمز المميز الخاص بك.", "-2005211699": "ابتكر", "-2115275974": "عقود الفروقات", - "-1879666853": "مشتق من MT5", + "-1879666853": "ديريف MT5", "-460645791": "أنت مقيد بحساب فيات واحد. لن تتمكن من تغيير عملة حسابك إذا كنت قد قمت بالفعل بإيداعك الأول أو إنشاء حساب {{dmt5_label}} حقيقي.", "-1146960797": "العملات الورقية", "-1959484303": "العملات المشفرة", @@ -2629,6 +2633,7 @@ "-1511825574": "الربح/الخسارة:", "-726626679": "الربح/الخسارة المحتملة:", "-338379841": "السعر الإرشادي:", + "-2027409966": "الحصة الأولية:", "-1525144993": "حد الدفع:", "-1167474366": "ضع علامة ", "-555886064": "فاز", @@ -3441,7 +3446,6 @@ "-2039780875": "تأكيد الشراء", "-1672470173": "طلب التأكيد قبل شراء العقد", "-1342661765": "أزرار شراء عقد القفل", - "-1738427539": "شراء", "-504410042": "عندما تفتح مركزًا، سيتم إنشاء حواجز حول سعر الأصل. بالنسبة لكل علامة جديدة، يتم حساب الحواجز العلوية والسفلية تلقائيًا استنادًا إلى الأصل والقيمة التراكمية التي تختارها. سوف تكسب ربحًا إذا أغلقت مركزك قبل أن يصل سعر الأصل إلى أي من الحواجز.", "-1907770956": "طالما كان تغير السعر لكل علامة داخل الحاجز، فسوف تنمو عائداتك عند كل علامة، بناءً على القيمة التراكمية التي حددتها.", "-997670083": "الحد الأقصى للقراد", @@ -3503,9 +3507,11 @@ "-194424366": "فوق", "-1527492178": "تم تأمين عملية الشراء", "-725375562": "يمكنك قفل/إلغاء قفل زر الشراء من قائمة الإعدادات", - "-601992465": "يتراكم", - "-30171993": "ستنمو حصتك بنسبة {{growth_rate}}% عند كل علامة بدءًا من العلامة الثانية، طالما ظل السعر ضمن نطاق ±{{tick_size_barrier}} من سعر التجزئة السابق.", + "-2131851017": "معدل النمو", "-1358367903": "حصة", + "-542594338": "الحد الأقصى للدفع", + "-690963898": "سيتم إغلاق عقدك تلقائيًا عندما يصل العائد إلى هذا المبلغ.", + "-511541916": "سيتم إغلاق عقدك تلقائيًا عند الوصول إلى هذا العدد من العلامات.", "-1918235233": "الحد الأدنى للحصة", "-1935239381": "الحد الأقصى للحصة", "-1930565757": "حصتك عبارة عن قسط غير قابل للاسترداد لمرة واحدة لشراء هذا العقد. إجمالي الربح/الخسارة يساوي قيمة العقد مطروحًا منها حصتك.", @@ -3520,14 +3526,13 @@ "-2131859340": "ستوب أوت<0/>", "-1686280757": "<0>{{commission_percentage}}% من (<1/>* {{multiplier}})", "-1043117679": "عندما تساوي خسارتك الحالية أو تتجاوز {{stop_out_percentage}}٪ من حصتك، سيتم إغلاق عقدك بأقرب سعر أصل متاح.", - "-477998532": "يتم إغلاق عقدك تلقائيًا عندما تكون خسارتك أكثر من أو تساوي هذا المبلغ.", - "-2008947191": "يتم إغلاق عقدك تلقائيًا عندما يكون ربحك أكثر من أو يساوي هذا المبلغ.", "-339236213": "المضاعف", "-857660728": "أسعار الإضراب", "-119134980": "<0>{{trade_type}}: ستحصل على عائد إذا كان سعر السوق هو {{payout_status}} هذا السعر <0>في وقت انتهاء الصلاحية، وإلا فإن عائدك سيكون صفرًا.", "-243332856": "إحصائيات الرقم الأخير لأحدث 1000 علامة لـ {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: ستحصل على عائد إذا كان السوق هو {{payout_status}} هذا السعر <0>في وقت انتهاء الصلاحية، وإلا فإن عائدك سيكون صفرًا.", "-347156282": "إرسال إثبات", + "-1738427539": "شراء", "-461955353": "سعر الشراء", "-172348735": "ربح", "-1624674721": "نوع العقد", diff --git a/packages/translations/src/translations/bn.json b/packages/translations/src/translations/bn.json index 6766f2c4bc2b..d4dc0b716257 100644 --- a/packages/translations/src/translations/bn.json +++ b/packages/translations/src/translations/bn.json @@ -317,7 +317,6 @@ "379523479": "তহবিলের ক্ষতি এড়াতে, অননুমোদিত দলগুলির সাথে অ্যাডমিন সুযোগের সাথে টোকেন ভাগ করবেন না।", "380606668": "টিক্ টিক্ শব্দ", "380694312": "পরপর সর্বোচ্চ ট্রেড", - "382781785": "আপনার মুনাফা এই পরিমাণের চেয়ে বেশি বা সমান হলে আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।", "384303768": "শেষ মোমবাতি কালো হলে এই ব্লকটি “True” ফেরত দেয়। এটি ট্রেড প্যারামিটার রুট ব্লক ব্যতীত ক্যানভাসে যে কোন জায়গায় স্থাপন করা যেতে পারে।", "386191140": "আপনি CFD ট্রেডিং অ্যাকাউন্ট বা অপশন এবং মাল্টিপ্লেয়ার অ্যাকাউন্টের মধ্যে একটি বেছে নিতে পারেন", "386278304": "{{platform_name_trader}} ওয়েব অ্যাপটি ইন্সটল করুন", @@ -371,6 +370,7 @@ "437904704": "সর্বাধিক ওপেন পজিশন", "438067535": "৫০০,০০০ মার্কিন ডলারেরও বেশি", "442520703": "$250,001 - $500,000", + "443203714": "আপনার ক্ষতি এই পরিমাণ পৌঁছে যদি আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।", "443559872": "আর্থিক SVG", "444484637": "যুক্তিবাদী অস্বীকার", "445419365": "1 - 2 বছর", @@ -455,6 +455,7 @@ "545476424": "মোট অর্থ উত্তোলন", "546534357": "আপনি যদি “ডিল বাতিলকরণ” নির্বাচন করেন, তাহলে মার্কেট যদি আপনার অনুকূলে চলে যায় তাহলে আপনি আপনার ট্রেড বাতিল করতে পারবেন। আমরা এই জন্য একটি ছোট ফি চার্জ করব, কিন্তু আমরা মুনাফা বা ক্ষতি ছাড়া আপনার পণ পরিমাণ ফেরত দেব। চুক্তি বাতিলের মেয়াদ শেষ হওয়ার আগে স্টপ-আউট পরিমাণ পৌঁছে গেলে, আপনার পজিশন স্বয়ংক্রিয়ভাবে বাতিল হয়ে যাবে এবং আমরা মুনাফা বা ক্ষতি ছাড়া আপনার স্টক পরিমাণ ফেরত দেব। “চুক্তি বাতিলকরণ” সক্রিয় থাকলেও:", "549479175": "ডেরিভ মাল্টিপ্লেয়ার", + "550589723": "যতক্ষণ বর্তমান স্পট মূল্য আগের স্পট মূল্য থেকে ±{{tick_size_barrier}} এর মধ্যে থাকবে ততক্ষণ আপনার স্টক প্রতি টিকটিকিতে {{growth_rate}}% বৃদ্ধি পাবে।", "551569133": "ট্রেডিং সীমা সম্পর্কে আরও জানুন", "554135844": "সম্পাদনা", "554410233": "এটি একটি টপ-১০ সাধারণ পাসওয়ার্ড", @@ -524,6 +525,7 @@ "627814558": "একটি শর্ত সত্য হলে এই ব্লকটি একটি মান প্রদান করে। উপরের ফাংশন ব্লকগুলির মধ্যে এই ব্লকটি ব্যবহার করুন।", "628193133": "অ্যাকাউন্ট আইডি", "629145209": "যদি “এবং” অপারেশন নির্বাচন করা হয়, তবে ব্লক “সত্য” ফেরত দেয় যদি উভয় প্রদত্ত মান “সত্য” হয়", + "629395043": "সকল বৃদ্ধির হার", "632398049": "এই ব্লক একটি আইটেম বা বিবৃতি একটি নাল মান নির্ধারণ করে।", "634219491": "আপনি আপনার ট্যাক্স সনাক্তকরণ নম্বর প্রদান করেননি। এই তথ্য আইনি এবং নিয়ন্ত্রক প্রয়োজনীয়তা জন্য প্রয়োজনীয়। অনুগ্রহ করে আপনার অ্যাকাউন্ট সেটিংসে <0>ব্যক্তিগত বিবরণে যান, এবং আপনার সর্বশেষ কর সনাক্তকরণ নম্বর পূরণ করুন।", "636219628": "<0>গ) নিষ্পত্তির সুযোগ না পাওয়া গেলে অভিযোগটি ডিআরসি কর্তৃক পরিচালিত সংকল্প পর্যায়ে অগ্রসর হবে।", @@ -674,6 +676,7 @@ "802438383": "ঠিকানার নতুন প্রমাণ প্রয়োজন", "802556390": "সেকেন্ড", "802989607": "আপনার XML ফাইলটি এখানে টেনে আনুন", + "803500173": "প্রাথমিক অংশীদারির", "806165583": "অস্ট্রেলিয়া ২০০", "807499069": "আর্থিক কমিশন অভিযোগ পদ্ধতি", "808323704": "পরীক্ষার ভেরিয়েবল তৈরি করতে আপনি “তুলনা করুন” এবং “লজিক অপারেশন” ব্লক ব্যবহার করতে পারেন।", @@ -1093,6 +1096,7 @@ "1264842111": "আপনি বাস্তব এবং ডেমো অ্যাকাউন্টের মধ্যে স্যুইচ করতে পারেন।", "1265704976": "", "1270581106": "যদি আপনি “নো টাচ” নির্বাচন করেন, তাহলে আপনি পেউটি জিতবেন যদি বাজার চুক্তির সময়কালে যে কোন সময় বাধা স্পর্শ না করে।", + "1271461759": "আপনার মুনাফা এই পরিমাণ পৌঁছে গেলে আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।", "1272012156": "GBP/সিএইচএফ", "1272337240": "দিনগুলো", "1272681097": "ঘন্টা", @@ -1430,7 +1434,6 @@ "1641395634": "শেষ সংখ্যার তালিকা", "1641635657": "পরিচয় দস্তাবেজের নতুন প্রমাণ প্রয়োজন", "1641980662": "অভিবাদন প্রয়োজন।", - "1642645912": "সকল হার", "1644703962": "CFD অ্যাকাউন্ট খুঁজছেন? ট্রেডার'স হাব এ যান", "1644864436": "পেশাদার ক্লায়েন্ট হবার অনুরোধ করার আগে আপনাকে আপনার অ্যাকাউন্ট <0>প্রমাণীকরণ করতে হবে।", "1644908559": "ডিজিট কোড প্রয়োজন।", @@ -1588,6 +1591,7 @@ "1803338729": "আপনি কোন ধরনের কন্ট্রাক্ট ট্রেড করতে চান তা চয়ন করুন। উদাহরণস্বরূপ, রাইজ/পতনের ট্রেডের জন্য আপনি তিনটি বিকল্পগুলির মধ্যে একটি বেছে নিতে পারেন: রাইজ, পতন, বা উভয়। নির্বাচিত বিকল্প ক্রয় ব্লকের জন্য উপলব্ধ বিকল্পগুলি নির্ধারণ করবে।", "1804620701": "মেয়াদ", "1804789128": "{{display_value}} Ticks", + "1806017862": "সর্বোচ্চ। টিকটিকি", "1806355993": "কোন কমিশন নেই", "1806503050": "দয়া করে মনে রাখবেন যে কিছু পেমেন্ট পদ্ধতি আপনার দেশে উপলব্ধ নাও হতে পারে।", "1808058682": "ব্লক সফলভাবে লোড করা হয়েছে", @@ -2629,6 +2633,7 @@ "-1511825574": "মুনাফা/ক্ষতি:", "-726626679": "সম্ভাব্য মুনাফা/ক্ষতি:", "-338379841": "নির্দেশক মূল্য:", + "-2027409966": "প্রাথমিক অংশীদারির:", "-1525144993": "পরিশোধ সীমা:", "-1167474366": "টিক ", "-555886064": "ওন", @@ -3441,7 +3446,6 @@ "-2039780875": "ক্রয় নিশ্চিতকরণ", "-1672470173": "একটি চুক্তি ক্রয় করার আগে নিশ্চিতকরণ প্রয়োজন", "-1342661765": "চুক্তি ক্রয় বোতাম লক করুন", - "-1738427539": "ক্রয়", "-504410042": "যখন আপনি একটি পজিশন খুলবেন, তখন অ্যাসেট প্রাইসের চারপাশে বাধা সৃষ্টি হবে। প্রতিটি নতুন টিক জন্য, উপরের এবং নিম্ন বাধা স্বয়ংক্রিয়ভাবে আপনার চয়ন সম্পদ এবং সংযোজক মান উপর ভিত্তি করে গণনা করা হয়। আপনি যদি আপনার পজিশন বন্ধ করেন তবে অ্যাসেট প্রাইস কোন বাধাগুলির মধ্যে আঘাত হানার আগে আপনি মুনাফা অর্জন করবেন।", "-1907770956": "যতক্ষণ পর্যন্ত প্রতিটি টিকের দাম পরিবর্তন বাধাগুলির মধ্যে থাকে, আপনার পেউটি আপনার নির্বাচিত সংযোজক মূল্যের উপর ভিত্তি করে প্রতিটি টিকটিতে বৃদ্ধি পাবে।", "-997670083": "সর্বোচ্চ টিকটিকি", @@ -3503,9 +3507,11 @@ "-194424366": "উপরে", "-1527492178": "ক্রয় লকড", "-725375562": "আপনি সেটিংস মেনু থেকে ক্রয় বোতামটি লক/আনলক করতে পারেন", - "-601992465": "স্তূপাকার করা", - "-30171993": "দ্বিতীয় টিক থেকে শুরু করে প্রতিটি টিকটিতে আপনার স্টক {{growth_rate}}% বৃদ্ধি পাবে, যতক্ষণ মূল্য আগের টিক মূল্য থেকে ±{{tick_size_barrier}} এর মধ্যে থাকে।", + "-2131851017": "বৃদ্ধির হার", "-1358367903": "পণ", + "-542594338": "সর্বোচ্চ পরিশোধ", + "-690963898": "আপনার পেমেন্ট এই পরিমাণ পৌঁছে যখন আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে।", + "-511541916": "আপনার চুক্তি স্বয়ংক্রিয়ভাবে ticks এই সংখ্যা পৌঁছানোর পরে বন্ধ করা হবে।", "-1918235233": "ন্যূনতম পণ", "-1935239381": "সর্বোচ্চ। পণ", "-1930565757": "আপনার অংশীদারিত্ব এই চুক্তি ক্রয় একটি অ ফেরতযোগ্য এক সময় প্রিমিয়াম হয়। আপনার মোট মুনাফা/ক্ষতি চুক্তি মূল্য আপনার পণ বিয়োগ সমান।", @@ -3520,14 +3526,13 @@ "-2131859340": "বন্ধ করো<0/>", "-1686280757": "<0>{{commission_percentage}}এর% (<1/>* {{multiplier}})", "-1043117679": "যখন আপনার বর্তমান ক্ষতি আপনার শেকের {{stop_out_percentage}}% এর সমান বা অতিক্রম করে, আপনার চুক্তি নিকটতম উপলব্ধ সম্পত্তির মূল্যে বন্ধ হয়ে যাবে।", - "-477998532": "আপনার ক্ষতি এই পরিমাণের চেয়ে বেশি বা সমান হলে আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।", - "-2008947191": "আপনার মুনাফা এই পরিমাণের চেয়ে বেশি বা সমান হলে আপনার চুক্তি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।", "-339236213": "গুণক", "-857660728": "স্ট্রাইক দাম", "-119134980": "<0>{{trade_type}}: <0>মেয়াদ শেষের সময়ে যদি মার্কেট প্রাইস {{payout_status}} হয় তাহলে আপনি একটি পেআউট পাবেন।", "-243332856": "{{ underlying_name }}এর জন্য সর্বশেষ ১০০০ টিকটিকির সর্বশেষ অঙ্কের পরিসংখ্যান", "-1900883796": "<0>{{trade_type}}: যদি বাজার {{payout_status}} হয় তবে মেয়াদ শেষ হওয়ার সময় এই মূল্যটি <0> হলে আপনি একটি অর্থ প্রদান <> অন্যথায়, আপনার পেমেন্ট শূন্য হবে।", "-347156282": "প্রমাণ জমা দিন", + "-1738427539": "ক্রয়", "-461955353": "ক্রয় মূল্য", "-172348735": "মুনাফা", "-1624674721": "চুক্তির ধরন", diff --git a/packages/translations/src/translations/de.json b/packages/translations/src/translations/de.json index 3471689aa5bb..c25be316a5c6 100644 --- a/packages/translations/src/translations/de.json +++ b/packages/translations/src/translations/de.json @@ -317,7 +317,6 @@ "379523479": "Um den Verlust von Geldern zu vermeiden, sollten Sie Tokens mit dem Admin-Bereich nicht mit Unbefugten teilen.", "380606668": "Tick", "380694312": "Maximale Anzahl aufeinanderfolgender Trades", - "382781785": "Ihr Vertrag wird automatisch geschlossen, wenn Ihr Gewinn diesen Betrag übersteigt oder diesem Betrag entspricht.", "384303768": "Dieser Block gibt „True“ zurück, wenn die letzte Kerze schwarz ist. Es kann an einer beliebigen Stelle auf der Leinwand platziert werden, außer im Rootblock der Handelsparameter.", "386191140": "Sie können zwischen CFD-Handelskonten oder Options- und Multiplikatorkonten wählen", "386278304": "Installieren Sie die {{platform_name_trader}} Web-App", @@ -371,6 +370,7 @@ "437904704": "Maximale Anzahl offener Stellen", "438067535": "Über 500.000$", "442520703": "250.001$ - 500.000$", + "443203714": "Ihr Vertrag wird automatisch geschlossen, wenn Ihr Verlust diesen Betrag erreicht.", "443559872": "Finanzielles SVG", "444484637": "Logische Negation", "445419365": "1—2 Jahre", @@ -455,6 +455,7 @@ "545476424": "Auszahlungen insgesamt", "546534357": "Wenn Sie „Stornierung des Deals“ wählen, können Sie Ihren Handel innerhalb eines bestimmten Zeitrahmens stornieren, falls sich der Markt gegen Ihre Gunsten bewegt. Wir erheben dafür eine geringe Gebühr, aber wir geben Ihren Einsatzbetrag ohne Gewinn oder Verlust zurück. Wenn der Stop-Out-Betrag erreicht wird, bevor die Stornierung des Deals abläuft, wird Ihre Position automatisch storniert und wir geben Ihren Einsatzbetrag ohne Gewinn oder Verlust zurück. Solange „Deal storniert“ aktiv ist:", "549479175": "Multiplikatoren ableiten", + "550589723": "Ihr Einsatz steigt um {{growth_rate}}% pro Tick, solange der aktuelle Kassakurs innerhalb von ±{{tick_size_barrier}} gegenüber dem vorherigen Kassakurs bleibt.", "551569133": "Erfahren Sie mehr über Handelslimits", "554135844": "Bearbeiten", "554410233": "Dies ist ein der 10 häufigsten Passwörter", @@ -524,6 +525,7 @@ "627814558": "Dieser Block gibt einen Wert zurück, wenn eine Bedingung erfüllt ist. Verwenden Sie diesen Block in einem der obigen Funktionsblöcke.", "628193133": "Konto-ID", "629145209": "Falls die Operation „UND“ ausgewählt ist, gibt der Block nur dann „True“ zurück, wenn beide angegebenen Werte „True“ sind", + "629395043": "Alle Wachstumsraten", "632398049": "Dieser Block weist einem Element oder einer Anweisung einen Nullwert zu.", "634219491": "Sie haben Ihre Steueridentifikationsnummer nicht angegeben. Diese Informationen sind für gesetzliche und regulatorische Anforderungen erforderlich. Bitte gehen Sie in Ihren Kontoeinstellungen zu <0>Persönliche Daten und geben Sie Ihre letzte Steueridentifikationsnummer ein.", "636219628": "<0>c. Wenn keine Möglichkeit zur Beilegung gefunden werden kann, wird die Beschwerde in die Erledigungsphase überführt, die von der Demokratischen Republik Kongo bearbeitet wird.", @@ -674,6 +676,7 @@ "802438383": "Ein neuer Adressnachweis ist erforderlich", "802556390": "Sekunden", "802989607": "Ziehe deine XML-Datei hierher", + "803500173": "Anfänglicher Einsatz", "806165583": "Australien 200", "807499069": "Beschwerdeverfahren der Finanzkommission", "808323704": "Sie können auch die Blöcke „Compare“ und „Logic Operation“ verwenden, um Testvariablen zu erstellen.", @@ -1093,6 +1096,7 @@ "1264842111": "Sie können zwischen Real- und Demo-Konten wechseln.", "1265704976": "", "1270581106": "Wenn Sie „No Touch“ wählen, gewinnen Sie die Auszahlung, wenn der Markt zu keinem Zeitpunkt während der Vertragslaufzeit die Barriere erreicht.", + "1271461759": "Ihr Vertrag wird automatisch geschlossen, wenn Ihr Gewinn diesen Betrag erreicht.", "1272012156": "GBP/CHF", "1272337240": "Tage", "1272681097": "Stunden", @@ -1430,7 +1434,6 @@ "1641395634": "Liste der letzten Ziffern", "1641635657": "Neues Ausweisdokument erforderlich", "1641980662": "Anrede ist erforderlich.", - "1642645912": "Alle Tarife", "1644703962": "Suchen Sie nach CFD-Konten? Gehe zum Trader's Hub", "1644864436": "Sie müssen Ihr Konto authentifizieren, bevor Sie ein professioneller Kunde werden können. <0>Authentifizieren Sie mein Konto", "1644908559": "Ein Zifferncode ist erforderlich.", @@ -1588,6 +1591,7 @@ "1803338729": "Wählen Sie, welche Art von Kontrakt Sie handeln möchten. Für den Handelstyp Rise/Fall können Sie beispielsweise eine von drei Optionen wählen: Anstieg, Fall oder Beide. Die gewählte Option bestimmt die verfügbaren Optionen für den Kaufblock.", "1804620701": "Ablauf", "1804789128": "{{display_value}} Zecken", + "1806017862": "Max. Zecken", "1806355993": "Keine Provision", "1806503050": "Bitte beachten Sie, dass einige Zahlungsmethoden in Ihrem Land möglicherweise nicht verfügbar sind.", "1808058682": "Blöcke wurden erfolgreich geladen", @@ -2629,6 +2633,7 @@ "-1511825574": "Gewinn/Verlust:", "-726626679": "Potenzieller Gewinn/Verlust:", "-338379841": "Richtpreis:", + "-2027409966": "Anfänglicher Einsatz:", "-1525144993": "Auszahlungslimit:", "-1167474366": "Zecke ", "-555886064": "Gewonnen", @@ -3441,7 +3446,6 @@ "-2039780875": "Bestätigung des Kaufs", "-1672470173": "Vor dem Kauf eines Vertrags eine Bestätigung anfordern", "-1342661765": "Schaltflächen für Vertragskauf sperren", - "-1738427539": "Kauf", "-504410042": "Wenn Sie eine Position eröffnen, entstehen Barrieren rund um den Vermögenspreis. Für jedes neue Häkchen werden die oberen und unteren Barrieren automatisch auf der Grundlage des von Ihnen ausgewählten Vermögens- und Akkumulatorwerts berechnet. Sie werden einen Gewinn erzielen, wenn Sie Ihre Position schließen, bevor der Vermögenspreis eine der Barrieren erreicht.", "-1907770956": "Solange die Kursänderung für jeden Tick innerhalb der Barriere liegt, steigt Ihre Auszahlung mit jedem Tick, basierend auf dem von Ihnen ausgewählten Akkumulatorwert.", "-997670083": "Maximale Anzahl an Zecken", @@ -3503,9 +3507,11 @@ "-194424366": "über", "-1527492178": "Kauf gesperrt", "-725375562": "Sie können die Kaufschaltfläche im Einstellungsmenü sperren/entsperren", - "-601992465": "Anhäufen", - "-30171993": "Ihr Einsatz steigt mit jedem Tick ab dem zweiten Tick um {{growth_rate}}%, solange der Preis innerhalb einer Spanne von ±{{tick_size_barrier}} gegenüber dem vorherigen Tick-Preis bleibt.", + "-2131851017": "Wachstumsrate", "-1358367903": "Pfahl", + "-542594338": "Max. Auszahlung", + "-690963898": "Ihr Vertrag wird automatisch geschlossen, wenn Ihre Auszahlung diesen Betrag erreicht.", + "-511541916": "Ihr Vertrag wird automatisch geschlossen, sobald diese Anzahl von Ticks erreicht ist.", "-1918235233": "Mindesteinsatz", "-1935239381": "Max. Einsatz", "-1930565757": "Ihr Einsatz ist eine nicht erstattungsfähige einmalige Prämie für den Kauf dieses Vertrags. Ihr Gesamtgewinn/-verlust entspricht dem Kontraktwert abzüglich Ihres Einsatzes.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stopp<0/>", "-1686280757": "<0>{{commission_percentage}}% von (<1/>* {{multiplier}})", "-1043117679": "Wenn Ihr aktueller Verlust {{stop_out_percentage}}% Ihres Einsatzes entspricht oder diesen übersteigt, wird Ihr Kontrakt zum nächstgelegenen verfügbaren Vermögenspreis geschlossen.", - "-477998532": "Ihr Vertrag wird automatisch geschlossen, wenn Ihr Verlust diesen Betrag übersteigt oder ihm entspricht.", - "-2008947191": "Ihr Vertrag wird automatisch geschlossen, wenn Ihr Gewinn diesen Betrag übersteigt oder entspricht.", "-339236213": "Multiplikator", "-857660728": "Basispreise", "-119134980": "<0>{{trade_type}}: Sie erhalten eine Auszahlung, wenn der Marktpreis zum <0>Ablaufzeitpunkt {{payout_status}} für diesen Preis beträgt. Andernfalls ist Ihre Auszahlung Null.", "-243332856": "Statistiken der letzten Ziffern für die letzten 1000 Ticks für {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Sie erhalten eine Auszahlung, wenn der Markt zu diesem <0>Preis zum Ablaufzeitpunkt {{payout_status}} ist. Andernfalls ist Ihre Auszahlung Null.", "-347156282": "Nachweis einreichen", + "-1738427539": "Kauf", "-461955353": "Kaufpreis", "-172348735": "profitieren", "-1624674721": "Art des Kontrakts", diff --git a/packages/translations/src/translations/es.json b/packages/translations/src/translations/es.json index a60592114621..44f20e31faaf 100644 --- a/packages/translations/src/translations/es.json +++ b/packages/translations/src/translations/es.json @@ -317,7 +317,6 @@ "379523479": "Para evitar pérdidas de fondos, no comparta los tokens con el ámbito de la Administración con personas no autorizadas.", "380606668": "tick", "380694312": "El máximo de operaciones consecutivas", - "382781785": "Su contrato se cierra automáticamente cuando su ganancia es mayor o igual a esta cantidad.", "384303768": "Este bloque devuelve \"Verdadero\" si la última vela es negra. Se puede colocar en cualquier lugar del lienzo, excepto dentro del bloque raíz Parámetros comerciales.", "386191140": "Puede elegir entre cuentas de trading de CFD o cuentas de opciones y multiplicadores", "386278304": "Instale la aplicación web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Posiciones máximas abiertas", "438067535": "Más de 500.000 $", "442520703": "250.001 $ - 500.000 $", + "443203714": "Su contrato se cerrará automáticamente si su pérdida alcanza esta cantidad.", "443559872": "Financiera SVG", "444484637": "Negación lógica", "445419365": "1 - 2 años", @@ -455,6 +455,7 @@ "545476424": "Total de retiros", "546534357": "Si selecciona \"Cancelación del contrato\", podrá cancelar su operación dentro de un período de tiempo elegido si el mercado se mueve en su contra. Le cobraremos una pequeña comisión por esto, pero le devolveremos el importe de su inversión sin pérdidas o ganancias. Si alcanza el nivel de stop out antes que la cancelación del contrato expire, su posición será cancelada automáticamente y le devolveremos su inversión inicial sin pérdidas o ganancias. Mientras la \"Cancelación del contrato\" está activa:", "549479175": "Multiplicadores de Deriv", + "550589723": "Su apuesta aumentará un {{growth_rate}}% por tictac siempre y cuando el precio spot actual se mantenga dentro de ±{{tick_size_barrier}} con respecto al precio spot anterior.", "551569133": "Aprenda más sobre los límites de trading", "554135844": "Editar", "554410233": "Esta es una de las 10 contraseñas más comunes", @@ -524,6 +525,7 @@ "627814558": "Este bloque devuelve un valor cuando una condición es verdadera. Use este bloque dentro de cualquiera de los bloques de funciones anteriores.", "628193133": "ID de cuenta", "629145209": "En caso que se seleccione la operación \"Y\", el bloque devuelve \"Verdadero\" solo si ambos valores dados son \"Verdaderos\"", + "629395043": "Todas las tasas de crecimiento", "632398049": "Este bloque asigna un valor nulo a un elemento o afirmación.", "634219491": "No ha proporcionado su número de identificación fiscal. Esta información es necesaria para los requisitos legales y reglamentarios. Vaya a <0>Detalles personales en la configuración de su cuenta y complete su número de identificación fiscal más reciente.", "636219628": "<0>c. Si no se encuentra una oportunidad de solución, la queja pasará a la fase de determinación que será manejada por el DRC.", @@ -674,6 +676,7 @@ "802438383": "Se necesita una nueva prueba de domicilio", "802556390": "segundos", "802989607": "Arrastre su archivo XML aquí", + "803500173": "Inversión inicial", "806165583": "Australia 200", "807499069": "Procedimiento de quejas a Comisión financiera", "808323704": "También puede usar los bloques \"Comparar\" y \"Operación lógica\" para crear variables de prueba.", @@ -1093,6 +1096,7 @@ "1264842111": "Puede cambiar entre cuenta real y cuenta demo.", "1265704976": "", "1270581106": "Si selecciona \"No toca\", ganará el pago si el mercado jamás toca la barrera de precio especificada durante el plazo del contrato.", + "1271461759": "Su contrato se cerrará automáticamente si sus ganancias alcanzan esta cantidad.", "1272012156": "GBP/CHF", "1272337240": "Días", "1272681097": "Horas", @@ -1430,7 +1434,6 @@ "1641395634": "Lista de los últimos dígitos", "1641635657": "Se necesita un nuevo documento de identidad", "1641980662": "Se requiere saludo.", - "1642645912": "Todas las tarifas", "1644703962": "¿Busca cuentas de CFD? Diríjase al Trader's Hub", "1644864436": "Deberá autenticar su cuenta antes de solicitar convertirse en cliente profesional. <0>Autenticar mi cuenta", "1644908559": "Se requiere un código de dígitos.", @@ -1588,6 +1591,7 @@ "1803338729": "Elija qué tipo de contrato desea operar. Por ejemplo, para el tipo Alza/Baja puede elegir entre una de las tres opciones: Alza, Baja o Ambos. La opción seleccionada determinará las opciones disponibles para el bloque de Compra.", "1804620701": "Vencimiento", "1804789128": "{{display_value}} Ticks", + "1806017862": "Máximo de garrapatas", "1806355993": "Sin comisiones", "1806503050": "Tenga en cuenta que es posible que algunos métodos de pago no estén disponibles en su país.", "1808058682": "Los bloques fueron cargados con éxito", @@ -2629,6 +2633,7 @@ "-1511825574": "Ganancia/Pérdida:", "-726626679": "Ganancia/pérdida potencial:", "-338379841": "Precio indicativo:", + "-2027409966": "Inversión inicial:", "-1525144993": "Límite de pago:", "-1167474366": "Tick ", "-555886064": "Ganado", @@ -3441,7 +3446,6 @@ "-2039780875": "Confirmación de compra", "-1672470173": "Requerir confirmación antes de comprar un contrato", "-1342661765": "Bloquear botones de compra de contrato", - "-1738427539": "Comprar", "-504410042": "Cuando abra una posición, se crearán barreras en torno al precio del activo. Para cada nuevo tick, las barreras superior e inferior se calculan automáticamente en función del activo y del valor del acumulador que elija. Obtendrá ganancias si cierra su posición antes de que el precio del activo alcance cualquiera de las barreras.", "-1907770956": "Mientras el cambio de precio de cada tick se mantenga dentro de la barrera, su pago aumentará con cada tick, en función del valor del acumulador que haya seleccionado.", "-997670083": "Máximo de ticks", @@ -3503,9 +3507,11 @@ "-194424366": "por encima", "-1527492178": "Compra bloqueada", "-725375562": "Puede bloquear / desbloquear el botón de compra desde el menú Configuración", - "-601992465": "Acumular", - "-30171993": "Su inversión aumentará en {{growth_rate}}% con cada tick a partir del segundo tick, siempre y cuando el precio se mantenga dentro de un rango de ±{{tick_size_barrier}} con respecto al precio del tick anterior.", + "-2131851017": "Tasa de crecimiento", "-1358367903": "Inversión", + "-542594338": "Pago máximo", + "-690963898": "Su contrato se cerrará automáticamente cuando su pago alcance esta cantidad.", + "-511541916": "Su contrato se cerrará automáticamente al alcanzar este número de clics.", "-1918235233": "Inversión mínima", "-1935239381": "Inversión máxima", "-1930565757": "Su inversión es una prima única no reembolsable para comprar este contrato. Su ganancia/pérdida total es igual al valor del contrato menos su inversión.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stop out <0/>", "-1686280757": "<0>{{commission_percentage}}% de (<1/> * {{multiplier}})", "-1043117679": "Cuando su pérdida actual es igual a o exceda el {{stop_out_percentage}}% de su inversión, su contrato se cerrará al precio de activo disponible más cercano.", - "-477998532": "Su contrato se cierra automáticamente cuando su pérdida es superior o igual a esta cantidad.", - "-2008947191": "Su contrato se cierra automáticamente cuando sus ganancias son mayores o iguales a esta cantidad.", "-339236213": "Multiplicador", "-857660728": "Precio de ejecución", "-119134980": "<0>{{trade_type}}: Obtendrá un pago si el precio de mercado es {{payout_status}} este precio <0>en el momento del vencimiento. De lo contrario, su pago será cero.", "-243332856": "Estadísticas del último dígito para los últimos 1000 ticks para {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Obtendrá un pago si el mercado es {{payout_status}} este precio <0>en el momento del vencimiento. De lo contrario, su pago será cero.", "-347156282": "Enviar prueba", + "-1738427539": "Comprar", "-461955353": "precio de compra", "-172348735": "ganancias", "-1624674721": "tipo de contrato", diff --git a/packages/translations/src/translations/fr.json b/packages/translations/src/translations/fr.json index 6f9fee5c0287..1978b36f82b4 100644 --- a/packages/translations/src/translations/fr.json +++ b/packages/translations/src/translations/fr.json @@ -4,7 +4,7 @@ "1485191": "1:1000", "3125515": "Votre mot de passe Deriv MT5 sert à vous connecter à vos comptes Deriv MT5 sur les applications de bureau, web et mobile.", "3215342": "30 derniers jours", - "3420069": "Pour éviter les retards, indiquez votre <0>nom et <0>date de naissance exactement tels qu'ils figurent sur votre document d'identité.", + "3420069": "Pour éviter tout retard, entrez votre <0>nom et votre <0>date de naissance exactement tels qu'ils apparaissent sur votre document d'identité.", "7100308": "L' horaire doit se situer entre 0 et 23.", "11539750": "définir {{ variable }} sur le tableau d'index de force relative {{ dummy }}", "11872052": "Oui, je reviendrai plus tard", @@ -33,7 +33,7 @@ "49963458": "Choisissez une option", "50200731": "Les devises majeures (lots standard/micro), les devises mineures, les indices, les matières premières et les crypto-monnaies", "53801223": "Hong Kong 50", - "53964766": "5. Cliquez sur Enregistrer pour télécharger votre bot. Vous pouvez choisir de télécharger votre bot sur votre appareil ou sur votre Google Drive.", + "53964766": "5. Cliquez sur Enregistrer pour télécharger votre bot. Vous pouvez choisir de télécharger votre bot sur votre appareil ou sur Google Drive.", "54185751": "Moins de $100 000", "55340304": "Garder votre contrat actuel?", "55916349": "Tout", @@ -69,7 +69,7 @@ "89062902": "Tradez sur MT5", "90266322": "2. Lancez une conversation avec votre nouveau robot Telegram et assurez-vous de lui envoyer des messages avant de passer à l'étape suivante. (par exemple, Bonjour Bot!)", "91993812": "La stratégie de Martingale est une technique de trading classique utilisée depuis plus de cent ans, popularisée par le mathématicien français Paul Pierre Levy au XVIIIe siècle.", - "93154671": "1. Appuyez sur Réinitialiser en bas du panneau des statistiques.", + "93154671": "1. Cliquez sur Réinitialiser en bas du panneau des statistiques.", "96381225": "La vérification de l'identité a échoué", "98473502": "Nous ne sommes pas obligés d’effectuer un test de pertinence, ni de vous fournir des avertissements concernant les risques.", "98972777": "élément aléatoire", @@ -114,7 +114,7 @@ "152524253": "Tradez les marchés mondiaux sur notre plateforme simple et renommée.", "154545319": "Le pays de résidence est le pays où vous vivez actuellement.", "157593038": "entier aléatoire de {{ start_number }} à {{ end_number }}", - "158373715": "Exit la visite", + "158373715": "Arrêter la visite", "160746023": "Tether en tant que jeton Omni (USDT) est une version de Tether qui est hébergée sur la couche Omni de la blockchain Bitcoin.", "160863687": "Caméra non détectée", "162080773": "Pour Put", @@ -317,7 +317,6 @@ "379523479": "Pour éviter toute perte de fonds, ne partagez pas de jetons avec relevant de l'Admin avec des personnes non autorisées.", "380606668": "tick", "380694312": "Nombre maximum de trades consécutifs", - "382781785": "Votre contrat est clôturé automatiquement lorsque votre bénéfice est supérieur ou égal à ce montant.", "384303768": "Ce bloc renvoie \"True\" si la dernière bougie est noire. Il peut être placé n'importe où sur le canevas, sauf dans le bloc racine des paramètres commerciaux.", "386191140": "Vous pouvez choisir entre des comptes de trading CFD ou des comptes Options et Multiplicateurs", "386278304": "Installez l'application web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Maximum de positions ouvertes", "438067535": "Plus de 500 000 $", "442520703": "$250,000 - $500,000", + "443203714": "Votre contrat sera clôturé automatiquement si votre perte atteint ce montant.", "443559872": "Financier SVG", "444484637": "Négation logique", "445419365": "1-2 ans", @@ -455,6 +455,7 @@ "545476424": "Retraits Totaux", "546534357": "Si vous sélectionnez \"Option annulation\", vous pourrez annuler votre transaction dans un délai choisi si le marché évolue contre votre faveur. Nous facturons une somme modique pour cela, mais nous vous rembourserons le montant de votre mise sans profit ni perte. Si le montant de l'arrêt est atteint avant l'expiration de l'annulation de l'accord, votre position sera automatiquement annulée et nous vous rembourserons le montant de votre mise sans profit ni perte. Pendant que «Option annulation» est active:", "549479175": "Multiplicateurs Deriv", + "550589723": "Votre mise augmentera de {{growth_rate}}% par tick tant que le cours au comptant actuel reste inférieur de ±{{tick_size_barrier}} au cours au comptant précédent.", "551569133": "En savoir plus sur les limites de trading", "554135844": "Édition", "554410233": "Ceci est un mot de passe commun parmi les 10 premiers", @@ -524,6 +525,7 @@ "627814558": "Ce bloc renvoie une valeur lorsqu'une condition est vraie. Utilisez ce bloc dans l'un des blocs fonction ci-dessus.", "628193133": "ID du compte", "629145209": "Dans le cas où si l'opération \"ET\" est sélectionnée, le bloc ne renvoie \"Vrai\" que si les deux valeurs données sont \"Vrai\"", + "629395043": "Tous les taux de croissance", "632398049": "Ce bloc attribue une valeur nulle à un élément ou une instruction.", "634219491": "Vous n'avez pas fourni votre numéro d'identification fiscale. Cette information est nécessaire pour les exigences légales et réglementaires. Veuillez vous rendre dans <0>Personal details dans les paramètres de votre compte et renseigner votre dernier numéro d'identification fiscale.", "636219628": "<0>c. Si aucune opportunité de règlement n'est trouvée, la plainte passera à la phase de détermination qui sera traitée par la DRC.", @@ -674,6 +676,7 @@ "802438383": "Une nouvelle preuve d'adresse est nécessaire", "802556390": "secondes", "802989607": "Faites glisser votre fichier XML ici", + "803500173": "Mise initiale", "806165583": "Australia 200", "807499069": "Procédure de réclamation de la commission financière", "808323704": "Vous pouvez également utiliser les blocs \"Comparer\" et \"Opération logique\" pour créer des variables de test.", @@ -1093,6 +1096,7 @@ "1264842111": "Vous pouvez passer d'un compte réel à un compte de démonstration.", "1265704976": "", "1270581106": "Si vous sélectionnez «Ne touche pas», vous gagnez le paiement si le marché ne touche jamais la barrière à tout moment pendant la durée du contrat.", + "1271461759": "Votre contrat sera clôturé automatiquement si vos bénéfices atteignent ce montant.", "1272012156": "GBP/CHF", "1272337240": "Jours", "1272681097": "Heures", @@ -1430,7 +1434,6 @@ "1641395634": "Liste des derniers chiffres", "1641635657": "Nouvelle preuve d'identité requise", "1641980662": "La civilité est requise (M. ou Mme).", - "1642645912": "Tous les tarifs", "1644703962": "Vous recherchez des comptes CFD ? Accédez au Trader's Hub", "1644864436": "Vous devrez authentifier votre compte avant de demander à devenir un client professionnel. <0>Authentifier mon compte", "1644908559": "Un code numérique est requis.", @@ -1588,6 +1591,7 @@ "1803338729": "Choisissez le type de contrat que vous souhaitez négocier. Par exemple, pour le type de transaction Rise / Fall, vous pouvez choisir une de ces trois options: Rise, Fall ou Both. L'option sélectionnée déterminera les options disponibles pour le bloc d'achat.", "1804620701": "Echéance", "1804789128": "{{display_value}} Ticks", + "1806017862": "Nombre max. de tiques", "1806355993": "Pas de commission", "1806503050": "Veuillez noter que certains moyens de paiement peuvent ne pas être disponibles dans votre pays.", "1808058682": "Les blocs ont bien été chargés", @@ -2629,6 +2633,7 @@ "-1511825574": "Profits/pertes:", "-726626679": "Bénéfice/Perte Potentielle:", "-338379841": "Prix indicatif:", + "-2027409966": "Mise initiale:", "-1525144993": "Limite de paiement:", "-1167474366": "Tick ", "-555886064": "Gagné", @@ -3441,7 +3446,6 @@ "-2039780875": "Confirmation d'achat", "-1672470173": "Exiger une confirmation avant d'acheter un contrat", "-1342661765": "Verrouiller les boutons d'achat de contrat", - "-1738427539": "Acheter", "-504410042": "Lorsque vous ouvrez une position, des obstacles se créent autour du prix de l'actif. Pour chaque nouvelle tick, les barrières supérieure et inférieure sont automatiquement calculées en fonction de la valeur de l'actif et de l'accumulateur que vous avez choisis. Vous réaliserez un bénéfice si vous fermez votre position avant que le prix de l'actif n'atteigne l'une ou l'autre des barrières.", "-1907770956": "Tant que la variation du prix pour chaque tick se situe dans la barrière, votre paiement augmentera à chaque tick, sur la base de la valeur de l'accumulateur que vous avez sélectionné.", "-997670083": "Nombre maximal de ticks", @@ -3503,9 +3507,11 @@ "-194424366": "au-dessus", "-1527492178": "Achat bloqué", "-725375562": "Vous pouvez verrouiller/déverrouiller le bouton d'achat à partir du menu Paramètres", - "-601992465": "Accumuler", - "-30171993": "Votre mise augmentera à {{growth_rate}} pour chaque tick à partir du deuxième tick, tant que le prix reste dans une fourchette de ±{{tick_size_barrier}} par rapport au prix du tick précédent.", + "-2131851017": "Taux de croissance", "-1358367903": "Mise", + "-542594338": "Paiement Maximum", + "-690963898": "Votre contrat sera automatiquement clôturé lorsque votre versement atteindra ce montant.", + "-511541916": "Votre contrat sera automatiquement clôturé lorsque ce nombre de ticks sera atteint.", "-1918235233": "La mise minimale", "-1935239381": "La mise maximale", "-1930565757": "Votre mise est un premier paiement, qui est payé une seule fois et n'est pas remboursable, pour acheter ce contrat. Votre profit/perte total(e) est égal(e) à la valeur du contrat moins votre mise.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stop out <0/>", "-1686280757": "<0>{{commission_percentage}}% de (<1/> * {{multiplier}})", "-1043117679": "Lorsque votre perte actuelle est égale ou supérieure à {{stop_out_percentage}}% de votre Equité, votre contrat sera clôturé au prix d'actif disponible le plus proche.", - "-477998532": "Votre contrat est automatiquement clôturé lorsque votre perte est supérieure ou égale à ce montant.", - "-2008947191": "Votre contrat est fermé automatiquement lorsque votre bénéfice est supérieur ou égal à ce montant.", "-339236213": "Multiplicateur", "-857660728": "Le prix d'exercice", "-119134980": "<0>{{trade_type}}: Vous recevrez un paiement de gain si le prix du marché est plus {{payout_status}} que ce prix <0>à l'heure d'expiration. Sinon, votre paiement de gain sera nul.", "-243332856": "Statistiques du dernier chiffre pour les 1000 derniers ticks pour {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Vous recevrez un paiement de gain si le marché est plus {{payout_status}} que ce prix <0>à l'heure d'expiration. Sinon, votre paiement de gain sera nul.", "-347156282": "Soumettre une preuve", + "-1738427539": "Acheter", "-461955353": "prix d’achat", "-172348735": "profit", "-1624674721": "type de contrat", diff --git a/packages/translations/src/translations/id.json b/packages/translations/src/translations/id.json index 01f061870806..64de80831ccb 100644 --- a/packages/translations/src/translations/id.json +++ b/packages/translations/src/translations/id.json @@ -317,7 +317,6 @@ "379523479": "Untuk mengamankan akun Anda, mohon untuk tidak berbagi token dengan akses Admin pada pihak lain.", "380606668": "tik", "380694312": "Maksimum trading berurutan", - "382781785": "Kontrak Anda ditutup secara otomatis ketika keuntungan Anda lebih dari atau sama dengan jumlah ini.", "384303768": "Blok ini akan menampilkan \"benar\" jika candle terakhir berwarna hitam. Dapat ditempatkan di mana saja pada kanvas kecuali dalam blok trading parameter root.", "386191140": "Anda dapat memilih antara akun trading CFD atau akun Opsi dan Multiplier", "386278304": "Instal aplikasi web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Maksimum posisi berjalan", "438067535": "Lebih dari $500.000", "442520703": "$250.001 - $500.000", + "443203714": "Kontrak Anda akan ditutup secara otomatis jika kerugian Anda mencapai jumlah ini.", "443559872": "Finansial SVG", "444484637": "Negasi logika", "445419365": "1 - 2 tahun", @@ -455,6 +455,7 @@ "545476424": "Total penarikan", "546534357": "Jika Anda memilih \"Pembatalan transaksi\", Anda akan dapat membatalkan trading sesuai dengan jangka waktu yang Anda pilih jika pasar bergerak berlawanan arah dengan analisa Anda. Kami akan mengenakan biaya kecil untuk fasilitas ini, namun kami akan mengembalikan harga kontrak yang telah Anda bayarkan tanpa keuntungan atau kerugian. Jika jumlah batas henti tercapai sebelum pembatalan transaksi berakhir, maka kontrak Anda akan dibatalkan secara otomatis dan kami akan mengembalikan jumlah harga pembelian kontrak tanpa keuntungan atau kerugian. Sementara \"pembatalan transaksi\" aktif:", "549479175": "Multiplier Deriv", + "550589723": "Saham Anda akan tumbuh sebesar {{growth_rate}}% per tick selama harga spot saat ini tetap dalam ±{{tick_size_barrier}} dari harga spot sebelumnya.", "551569133": "Pelajari lebih lanjut tentang batasan trading", "554135844": "Edit", "554410233": "Ini adalah 10 kata sandi umum teratas", @@ -524,6 +525,7 @@ "627814558": "Blok ini akan menampilkan nilai ketika kondisi adalah benar. Gunakan blok ini pada salah satu blok fungsi di atas.", "628193133": "Akun ID", "629145209": "Jika pengoperasian \"DAN\" dipilih, maka blok hanya akan menampilkan \"Benar\" jika kedua nilai yang diberikan adalah \"Benar\"", + "629395043": "Semua tingkat pertumbuhan", "632398049": "Blok ini menetapkan nilai nol pada item atau pernyataan.", "634219491": "Anda belum menginformasikan nomer NPWP Anda. Informasi ini diperlukan untuk memenuhi persyaratan hukum dan peraturan yang berlaku. Akses <0>Detail pribadi pada bagian pengaturan akun Anda, dan isi nomor NPWP terbaru.", "636219628": "<0>c. Jika tidak terdapat penyelesaian dari pengaduan Anda maka pengaduan tersebut akan dilanjutkan ke tahap penentuan yang akan ditangani oleh DRC.", @@ -674,6 +676,7 @@ "802438383": "Bukti alamat baru diperlukan", "802556390": "detik", "802989607": "Tarik file XML Anda di sini", + "803500173": "Modal awal", "806165583": "Australia 200", "807499069": "Prosedur pengaduan komisi keuangan", "808323704": "Anda juga dapat menggunakan blok \"Bandingkan\" dan \"Operasi Logika\" untuk membuat variabel uji.", @@ -1093,6 +1096,7 @@ "1264842111": "Anda bisa berpindah antara akun riil dan akun demo.", "1265704976": "", "1270581106": "Jika Anda memilih \"No Touch\", Anda memperoleh hasil jika pasar tidak pernah menyentuh barrier kapan saja selama periode kontrak.", + "1271461759": "Kontrak Anda akan ditutup secara otomatis jika keuntungan Anda mencapai jumlah ini.", "1272012156": "GBP/CHF", "1272337240": "Hari", "1272681097": "Jam", @@ -1430,7 +1434,6 @@ "1641395634": "Daftar digit terakhir", "1641635657": "Bukti identitas baru dibutuhkan", "1641980662": "Gelar diperlukan.", - "1642645912": "Semua harga", "1644703962": "Mencari akun CFD? Kunjungi Trader's Hub", "1644864436": "Anda harus mengautentikasi akun sebelum mengajukan permohonan menjadi klien profesional. <0>Autentikasi akun saya", "1644908559": "Kode digit diperlukan.", @@ -1588,6 +1591,7 @@ "1803338729": "Pilih jenis kontrak yang Anda ingin tradingkan. Misalnya, untuk jenis trading Rise/Fall Anda dapat memilih salah satu dari tiga pilihan: Rise, Fall, atau Keduanya. Pilihan yang dipilih akan menentukan pilihan yang tersedia pada blok Pembelian.", "1804620701": "Waktu berakhir", "1804789128": "{{display_value}} Tik", + "1806017862": "Max. kutu", "1806355993": "Tanpa komisi", "1806503050": "Mohon ketahui bahwa beberapa metode pembayaran tidak tersedia di negara Anda.", "1808058682": "Blok berhasil dimuat", @@ -2629,6 +2633,7 @@ "-1511825574": "Untung/Rugi:", "-726626679": "Potensi untung/rugi:", "-338379841": "Harga indikatif:", + "-2027409966": "Modal awal:", "-1525144993": "Limit hasil:", "-1167474366": "Tik ", "-555886064": "Untung", @@ -3441,7 +3446,6 @@ "-2039780875": "Konfirmasi pembelian", "-1672470173": "Memerlukan konfirmasi sebelum pembelian kontrak", "-1342661765": "Tombol penguncian pembelian kontrak", - "-1738427539": "Beli", "-504410042": "Ketika Anda membuka posisi, batasan akan dibuat di sekitar harga aset. Untuk setiap tik baru, barrier atas dan bawah secara otomatis dihitung berdasarkan nilai aset dan akumulator yang Anda pilih. Anda akan mendapat profit jika Anda menutup posisi sebelum harga aset menyentuh salah satu barrier.", "-1907770956": "Selama perubahan harga untuk setiap tick berada dalam batas, pembayaran uang Anda akan tumbuh di setiap tick, berdasarkan nilai akumulator yang Anda pilih.", "-997670083": "Maksimum tik", @@ -3503,9 +3507,11 @@ "-194424366": "di atas", "-1527492178": "Pembelian dikunci", "-725375562": "Anda dapat mengunci/membuka kunci tombol pembelian dari menu pengaturan", - "-601992465": "Akumulasi", - "-30171993": "Taruhan Anda akan tumbuh sebesar {{growth_rate}}% pada setiap tick mulai dari tick kedua, selama harga tetap dalam kisaran ±{{tick_size_barrier}} dari harga tick sebelumnya.", + "-2131851017": "Tingkat pertumbuhan", "-1358367903": "Modal", + "-542594338": "Hasil Maksimum", + "-690963898": "Kontrak Anda akan ditutup secara otomatis ketika pembayaran Anda mencapai jumlah ini.", + "-511541916": "Kontrak Anda akan ditutup secara otomatis setelah mencapai jumlah tick ini.", "-1918235233": "Modal min.", "-1935239381": "Modal maks.", "-1930565757": "Modal adalah jumlah yang Anda bayarkan untuk membeli kontrak ini. Jumlah keuntungan/kerugian bersih Anda adalah nilai kontrak dikurangi modal.", @@ -3520,14 +3526,13 @@ "-2131859340": "Batas keluar <0/>", "-1686280757": "<0>{{commission_percentage}}% of (<1/> * {{multiplier}})", "-1043117679": "Ketika kerugian Anda saat ini sama atau melebihi {{stop_out_percentage}}% dari modal, kontrak Anda akan ditutup pada harga aset terdekat yang tersedia.", - "-477998532": "Kontrak Anda ditutup secara otomatis ketika kerugian Anda lebih dari atau sama dengan jumlah berikut.", - "-2008947191": "Kontrak Anda ditutup secara otomatis ketika keuntungan Anda lebih dari atau sama dengan jumlah ini.", "-339236213": "Multiplier", "-857660728": "Harga Strike", "-119134980": "<0>{{trade_type}}: Anda akan memperoleh hasil jika harga pasar adalah {{payout_status}} dari harga ini <0>pada saat kontrak berakhir. Jika tidak, maka kontrak tidak menghasilkan keuntungan.", "-243332856": "Statistik digit terakhir pada 1000 tik terkini {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Anda akan memperoleh hasil jika harga pasar adalah {{payout_status}} harga ini <0>pada saat kontrak berakhir. Jika tidak, maka kontrak tidak menghasilkan keuntungan.", "-347156282": "Kirim Bukti", + "-1738427539": "Beli", "-461955353": "harga beli", "-172348735": "untung", "-1624674721": "jenis kontrak", diff --git a/packages/translations/src/translations/it.json b/packages/translations/src/translations/it.json index 6c0185d0c9ee..2529f4b3f786 100644 --- a/packages/translations/src/translations/it.json +++ b/packages/translations/src/translations/it.json @@ -317,7 +317,6 @@ "379523479": "Per evitare la perdita dei fondi, non condividere i token con l'Admin con persone non autorizzate.", "380606668": "tick", "380694312": "Numero massimo di trade consecutivi", - "382781785": "Il contratto viene chiuso automaticamente quando il profitto è maggiore o uguale a questo importo.", "384303768": "Questo blocco torna \"Vero\" se l'ultima candela è nera. Può essere posizionato in qualunque punto dell'area di disegno tranne entro il blocco principale dei parametri di trading.", "386191140": "Puoi scegliere tra conti di trading su CFD, opzioni e moltiplicatori", "386278304": "Installa l'app web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Limite di posizioni aperte", "438067535": "Più di 500.000 $", "442520703": "250.001 $ - 500.000 $", + "443203714": "Il contratto verrà chiuso automaticamente se la perdita raggiunge tale importo.", "443559872": "Finanziario SVG", "444484637": "Negazione logica", "445419365": "1 - 2 anni", @@ -455,6 +455,7 @@ "545476424": "Prelievi totali", "546534357": "Se selezioni \"Cancellazione\", potrai cancellare il tuo trade entro un orario stabilito nel caso il mercato si muovesse a tuo sfavore. Per farlo, applicheremo una piccola commissione, salvo restituirti poi l'importo della puntata senza profitti o perdite. Se si raggiunge l'importo di stop-out prima del termine della cancellazione, la posizione verrà cancellata automaticamente e ti restituiremo l'importo della puntata senza profitti o perdite. Mentre la cancellazione è attiva:", "549479175": "Moltiplicatori su Deriv", + "550589723": "La tua puntata aumenterà dello {{growth_rate}}% per tick purché il prezzo spot corrente rimanga entro ±{{tick_size_barrier}} dal prezzo spot precedente.", "551569133": "Scopri di più sui limiti relativi ai trade", "554135844": "Modifica", "554410233": "Questa è una delle 10 password più usate", @@ -524,6 +525,7 @@ "627814558": "Questo blocco restituisce un valore quando la condizione è vera. Utilizzalo all'interno di uno dei blocchi di funzione sopra riportati.", "628193133": "ID del conto", "629145209": "Se è stata selezionata l'operazione \"E\", il blocco torna \"Vero\" solo se entrambi i valori sono \"Veri\"", + "629395043": "Tutti i tassi di crescita", "632398049": "Questo blocco attribuisce un valore nullo a un elemento o una dichiarazione.", "634219491": "Non hai verificato il numero di identificazione fiscale: questo dato è fondamentale per questioni legali e normative. Vai su <0>dati personali nelle impostazioni del conto e inserisci il numero di identificazione fiscale aggiornato.", "636219628": "<0>c.Se non è possibile raggiungere la risoluzione del reclamo, quest'ultimo passerà alla fase di determinazione condotta dalla DRC.", @@ -674,6 +676,7 @@ "802438383": "È necessaria una nuova prova a verifica dell'indirizzo", "802556390": "secondi", "802989607": "Trascina qui il file XML", + "803500173": "Puntata iniziale", "806165583": "Australia 200", "807499069": "Procedura per i reclami presso la commissione finanziaria", "808323704": "Puoi usare i blocchi \"Confronta\" e \"Operazione logica\" per creare variabili di testo.", @@ -1093,6 +1096,7 @@ "1264842111": "Puoi passare da un conto reale a uno demo e viceversa.", "1265704976": "", "1270581106": "Selezionando \"Non tocca\", vinci il payout se il mercato non tocca mai la barriera in qualsiasi momento durante la durata del contratto.", + "1271461759": "Il contratto verrà chiuso automaticamente se il profitto raggiunge tale importo.", "1272012156": "GBP/CHF", "1272337240": "Giorni", "1272681097": "Ore", @@ -1430,7 +1434,6 @@ "1641395634": "Elenco delle ultime cifre", "1641635657": "È necessario un nuovo documento a verifica dell'identità", "1641980662": "Intestazione obbligatoria.", - "1642645912": "Tutti i tassi", "1644703962": "Stai cercando conti CFD? Vai al Trader's Hub", "1644864436": "Dovrai autenticare il tuo conto prima di richiedere di diventare un cliente professionale. <0>Autentica il mio conto", "1644908559": "Il codice è necessario.", @@ -1588,6 +1591,7 @@ "1803338729": "Selezione la tipologia di contratto con cui fare trading. Ad esempio, per la tipologia Rialzo/Ribasso puoi scegliere una di tre opzioni: Rialzo, Ribasso o entrambe. L'opzione selezionata determinerà le opzioni disponibili per il blocco Acquisti.", "1804620701": "Scadenza", "1804789128": "{{display_value}} tick", + "1806017862": "Numero massimo di zecche", "1806355993": "Nessuna commissione", "1806503050": "Alcune modalità di pagamento potrebbero non essere disponibili nel tuo Paese.", "1808058682": "I blocchi sono stati caricati", @@ -2629,6 +2633,7 @@ "-1511825574": "Profitto/Perdita:", "-726626679": "Profitto/perdita potenziale:", "-338379841": "Prezzo indicativo:", + "-2027409966": "Puntata iniziale:", "-1525144993": "Limite del payout:", "-1167474366": "Tick ", "-555886064": "Vinto", @@ -3441,7 +3446,6 @@ "-2039780875": "Conferma acquisto", "-1672470173": "Richiedi conferma prima di procedere all'acquisto di un contratto", "-1342661765": "Pulsanti di blocco dell'acquisto di contratti", - "-1738427539": "Acquisto", "-504410042": "Quando si apre una posizione, si creano barriere attorno al prezzo dell'asset. Per ogni nuovo tick, le barriere superiore e inferiore vengono calcolate automaticamente in base al valore dell'asset e dell'accumulatore scelto. Guadagnerai un profitto se chiudi la posizione prima che il prezzo dell'asset raggiunga una delle barriere.", "-1907770956": "Finché la variazione di prezzo per ogni tick rientra nei limiti consentiti, la tua vincita crescerà ad ogni tick in base al valore dell'accumulatore che hai selezionato.", "-997670083": "Numero massimo di tick", @@ -3503,9 +3507,11 @@ "-194424366": "superiore", "-1527492178": "Acquisto bloccato", "-725375562": "Puoi bloccare/sbloccare il pulsante di acquisto dal menu Impostazioni", - "-601992465": "Accumula", - "-30171993": "La tua puntata aumenterà del {{growth_rate}}% ad ogni tick a partire dal secondo tick, sempre che il prezzo rimanga nell'intervallo ±{{tick_size_barrier}} rispetto al tick precedente.", + "-2131851017": "Tasso di crescita", "-1358367903": "Puntata", + "-542594338": "Payout massimo", + "-690963898": "Il contratto verrà chiuso automaticamente quando il pagamento raggiunge questo importo.", + "-511541916": "Il contratto verrà chiuso automaticamente al raggiungimento di questo numero di segni di spunta.", "-1918235233": "Puntata min.", "-1935239381": "Puntata max.", "-1930565757": "La tua puntata è un premio una tantum non rimborsabile per l'acquisto di questo contratto. Il profitto o perdita totali sono pari al valore del contratto meno la tua puntata.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stop out <0/>", "-1686280757": "<0>{{commission_percentage}}% di (<1/> * {{multiplier}})", "-1043117679": "Quando le perdite correnti sono pari o maggiori al {{stop_out_percentage}}% della puntata, il contratto viene chiuso al prezzo dell'asset disponibile più vicino.", - "-477998532": "Il contratto viene chiuso automaticamente quando la perdita è maggiore o pari a questo importo.", - "-2008947191": "Il contratto viene chiuso automaticamente quando il profitto è superiore o uguale a tale importo.", "-339236213": "Moltiplicatore", "-857660728": "Prezzo della puntata", "-119134980": "<0>{{trade_type}}: Riceverai un pagamento se il prezzo di mercato è {{payout_status}} a questo <0>prezzo alla scadenza, altrimenti il pagamento sarà pari a zero.", "-243332856": "Statistiche dell'ultima cifra per gli ultimi 1000 tick per {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Riceverai un pagamento se il prezzo del mercato è pari a {{payout_status}} questo <0>prezzo alla scadenza, altrimenti il pagamento sarà pari a zero.", "-347156282": "Invia documento di verifica", + "-1738427539": "Acquisto", "-461955353": "prezzo d'acquisto", "-172348735": "profitto", "-1624674721": "tipologia di contratto", diff --git a/packages/translations/src/translations/ko.json b/packages/translations/src/translations/ko.json index 3acff21fa4d8..ca06f9a3f19e 100644 --- a/packages/translations/src/translations/ko.json +++ b/packages/translations/src/translations/ko.json @@ -229,7 +229,7 @@ "283986166": "웹사이트에서의 자가 제한은 오직 귀하의 {{brand_website_name}} 계좌에만 적용되며 다른 회사 또는 웹사이트는 포함하지 않습니다.", "284527272": "반최빈값", "284772879": "계약", - "284809500": "파이낸셜 데모", + "284809500": "파이낸셜 데모 (Financial Demo)", "287934290": "정말 이 거래를 취소하시겠습니까?", "289898640": "이용 약관", "291744889": "<0>1.거래 매개 변수: <0>", @@ -317,7 +317,6 @@ "379523479": "자금 손실을 방지하기 위해서, 관리자 범위의 토큰을 승인되지 않은 당사자와 공유하지 마세요.", "380606668": "틱", "380694312": "최대 연속 거래", - "382781785": "귀하의 수익이 이 금액과 같거나 또는 더 많으면 귀하의 계약이 자동으로 종료됩니다.", "384303768": "이 블록은 만약 바로 이전의 캔들이 검은색이면 \"참\"을 불러옵니다. 이 블록은 거래 매개변수 루트 블록 내를 제외하고 캔버스의 어느 곳에나 위치할 수 있습니다.", "386191140": "CFD 거래 계정 또는 옵션 및 승수 계정 중에서 선택하실 수 있습니다", "386278304": "{{platform_name_trader}} 웹 앱 설치", @@ -371,6 +370,7 @@ "437904704": "최대 오픈 포지션", "438067535": "$500,000 이상", "442520703": "$250,001 - $500,000", + "443203714": "손실이 이 금액에 도달하면 계약이 자동으로 종료됩니다.", "443559872": "Financial SVG", "444484637": "논리 부정", "445419365": "1 - 2년", @@ -455,6 +455,7 @@ "545476424": "인출 합계", "546534357": "“거래 취소”를 선택하시면 시장이 귀하에게 유리하지 않게 움직일 경우, 선택된 시간 내에 거래를 취소하실 수 있습니다. 이에 대하여 소정의 수수료가 청구되지만 귀하의 지분 금액을 손익 없이 돌려 드립니다. 거래 취소가 만료되기 이전에 스톱아웃 금액에 도달하면 귀하의 포지션은 자동으로 취소되며 손익 없이 지분 금액을 돌려 드립니다. “거래 취소”가 활성화되어 있는 동안에는:", "549479175": "Deriv Multipliers", + "550589723": "현재 현물 가격이 이전 현물 가격에서 ±{{tick_size_barrier}} 이내로 유지되는 한, 귀하의 지분은 틱당 {{growth_rate}}% 씩 증가합니다.", "551569133": "거래 한도에 대해 더 알아보세요", "554135844": "편집", "554410233": "이 비밀번호는 가장 흔한 비밀번호 상위 10위에 들어가는 흔한 비밀번호입니다", @@ -524,6 +525,7 @@ "627814558": "이 블록은 조건이 참일 경우에 값을 불러옵니다. 상기 함수 블록 중 한 가지에서 이 블록을 사용하세요.", "628193133": "계정 아이디 (ID)", "629145209": "만약 \"AND\" 연산이 선택된 경우, 주어진 값들이 \"True\"일 경우에만 \"True\"을 불러옵니다", + "629395043": "모든 성장률", "632398049": "이 블록은 항목 또는 명령문에 널 값을 할당합니다.", "634219491": "귀하께서는 세금 식별 번호를 제공하지 않으셨습니다. 이 정보는 법적 및 규제적 요구사항에 따라 필요한 정보입니다. 계정 설정의 <0>개인 세부정보 로 이동하여 귀하의 가장 최근 세금 식별 번호를 입력해 주시기 바랍니다.", "636219628": "<0>c.합의 기회가 없는 경우, 해당 불만은 결정 단계로 진행되어 DRC에서 처리됩니다.", @@ -674,6 +676,7 @@ "802438383": "새로운 주소증명이 필요합니다", "802556390": "초", "802989607": "귀하의 XML 파일을 여기로 끌어주세요", + "803500173": "초기 지분", "806165583": "호주 200 (Australia 200)", "807499069": "금융 수수료 불만사항 처리 절차", "808323704": "귀하께서는 \"비교하기\" 및 \"논리 연산\" 블록을 또한 사용하셔서 시험 변수를 만드실 수 있습니다.", @@ -1093,6 +1096,7 @@ "1264842111": "실제 계정과 데모 계정 간에 전환할 수 있습니다.", "1265704976": "", "1270581106": "귀하께서 만약 \"노 터치\"를 선택하시면, 해당 계약 기간의 그 어느때라도 해당 시장이 장벽을 닿지 않으면 귀하께서 지불금을 받게 됩니다.", + "1271461759": "수익이 이 금액에 도달하면 계약이 자동으로 종료됩니다.", "1272012156": "GBP/CHF", "1272337240": "일", "1272681097": "시간", @@ -1430,7 +1434,6 @@ "1641395634": "마지막 숫자 목록", "1641635657": "새로운 신분증명문서가 필요합니다", "1641980662": "경칭의 입력이 요구됩니다.", - "1642645912": "모든 비용", "1644703962": "CFD 계정을 찾으시나요? 트레이더 허브로 이동하세요", "1644864436": "전문가 고객이 되기 위해서는 먼저 귀하의 계정을 인증해야 합니다. <0>내 계정 인증하기", "1644908559": "숫자 코드가 요구됩니다.", @@ -1588,6 +1591,7 @@ "1803338729": "귀하께서 거래를 희망하시는 계약의 종류를 선택하세요. 예를 들면, 거래 종류 상승/하락에 대해서는 세가지 옵션 중 한가지를 선택하실 수 있습니다: 상승, 하락 또는 두가지 모두. 선택되어진 옵션은 구매 블록에 대하여 가능한 옵션을 결정할 것입니다.", "1804620701": "만료", "1804789128": "{{display_value}} 틱", + "1806017862": "최대 틱", "1806355993": "수수료는 없습니다", "1806503050": "몇몇 지불 방식들은 귀하의 국가에서 이용가능하지 않을 수도 있다는 것을 아시기 바랍니다.", "1808058682": "블록들이 성공적으로 로드되었습니다", @@ -2629,6 +2633,7 @@ "-1511825574": "이윤/손실:", "-726626679": "잠재적인 이윤/손실:", "-338379841": "참고 가격:", + "-2027409966": "초기 지분:", "-1525144993": "지불 제한:", "-1167474366": "틱 ", "-555886064": "획득", @@ -3441,7 +3446,6 @@ "-2039780875": "구매 확인", "-1672470173": "계약을 구매하기 이전에 확인이 요구됩니다", "-1342661765": "계약 구매 버튼들을 잠그기", - "-1738427539": "구매", "-504410042": "포지션을 열 때, 자산 가격 주변으로 장벽이 생성됩니다. 각 새 틱마다, 상위 및 하위 장벽은 귀하께서 선택하신 어큐뮬레이터 값과 자산에 따라 자동으로 계산됩니다. 해당 자산 가격이 이 두 장벽 중 어떤것에라도 도달하기 이전에 포지션을 닫는 경우 수익이 발생합니다.", "-1907770956": "매 틱에 대한 가격 변동이 해당 장벽 내로 유지되는 한, 귀하의 지불금은 매 틱마다 늘어날 것이며 이는 귀하께서 선택하신 어큐뮬레이터 값에 따라 다릅니다.", "-997670083": "최대 틱", @@ -3503,9 +3507,11 @@ "-194424366": "이상", "-1527492178": "구매가 차단되었습니다", "-725375562": "귀하께서는 설정 메뉴에서 구매 버튼을 잠금/잠금해제 하실 수 있습니다", - "-601992465": "어큐뮬레이트", - "-30171993": "해당 가격이 이전의 틱 가격으로부터 ±{{tick_size_barrier}} 범위 내에 유지되는 한, 귀하의 지분은 두 번째 틱에서 시작하는 매 틱마다 {{growth_rate}}%만큼 증가합니다.", + "-2131851017": "성장률", "-1358367903": "지분", + "-542594338": "최대 지급액", + "-690963898": "지급액이 이 금액에 도달하면 계약이 자동으로 종료됩니다.", + "-511541916": "이 틱 수에 도달하면 계약이 자동으로 종료됩니다.", "-1918235233": "최소 판돈", "-1935239381": "최대 판돈", "-1930565757": "귀하의 판돈은 본 계약을 구매하기 위한 환불되지 않는 일회성 프리미엄입니다.총 수익/손실은 계약 금액에서 지분을 뺀 금액과 같습니다.", @@ -3520,14 +3526,13 @@ "-2131859340": "스탑아웃 <0/>", "-1686280757": "(<1/> * {{multiplier}}) 의 <0>{{commission_percentage}}%", "-1043117679": "귀하의 현재 손실이 귀하의 지분의 {{stop_out_percentage}}%과 같거나 또는 이를 초과하면, 귀하의 계약은 가능한 가장 근접한 자산 가격으로 종료될 것입니다.", - "-477998532": "귀하의 손실이 이 금액과 같거나 또는 더 많을 때에 귀하의 계약은 자동적으로 종료됩니다.", - "-2008947191": "귀하의 수익이 이 금액 이상일때 계약은 자동으로 종료됩니다.", "-339236213": "승수", "-857660728": "행사 가격", "-119134980": "<0>{{trade_type}}: <0>만기시에 이 가격에 대하여 시장이 {{payout_status}} 인 경우 지불금을 받습니다. 그렇지 않으면, 지불금은 없습니다.", "-243332856": "{{ underlying_name }} 에 대하여 최근 1000 틱들에 대한 마지막 숫자 스탯", "-1900883796": "<0>{{trade_type}}: <0>만기시에 이 가격에 대하여 시장이 {{payout_status}} 인 경우 지불금을 받습니다. 그렇지 않으면, 지불금은 없습니다.", "-347156282": "증명 제출", + "-1738427539": "구매", "-461955353": "매입 가격", "-172348735": "이익", "-1624674721": "계약 종류", diff --git a/packages/translations/src/translations/pl.json b/packages/translations/src/translations/pl.json index 57fd9c882ec1..ea8c77c16a73 100644 --- a/packages/translations/src/translations/pl.json +++ b/packages/translations/src/translations/pl.json @@ -317,7 +317,6 @@ "379523479": "Aby zapobiec utracie środków, nie udostępniaj tokenów z zakresem administratora nieuprawnionym stronom.", "380606668": "najmniejsza zmiana ceny", "380694312": "Maksymalna liczba zakładów następujących po sobie", - "382781785": "Twój kontrakt zostanie automatycznie zamknięty, gdy Twój zysk będzie równy tej kwocie lub wyższy od niej.", "384303768": "Ten blok zwraca wartość „Prawda”, jeśli ostatnia świeca jest czarna. Można go umieścić w dowolnym miejscu w kanwie z wyjątkiem Parametrów zakładu bloku źródłowego.", "386191140": "Możesz wybierać między kontami handlowymi CFD lub kontami Opcji i Mnożników", "386278304": "Zainstaluj aplikację internetową {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Maksymalna liczba otwartych pozycji", "438067535": "Ponad 500 000 $", "442520703": "250 001$ - 500 000 $", + "443203714": "Twoja umowa zostanie automatycznie zamknięta, jeśli Twoja strata osiągnie tę kwotę.", "443559872": "Finansowe SVG", "444484637": "Zaprzeczenie logiczne", "445419365": "1-2 lata", @@ -455,6 +455,7 @@ "545476424": "Wszystkie wypłaty", "546534357": "Jeśli wybierzesz opcję „Anulowanie transakcji” będzie możliwe anulowanie zakładu w określonym czasie, jeśli zmiany na rynku będą dla Ciebie niekorzystne. Pobierzemy za to małą opłatę, ale zwrócimy kwotę stawki bez zysku ani straty. Jeśli poziom stop out osiągnie określoną wcześniej kwotę przed wygaśnięciem opcji anulowania transakcji, Twoja pozycja zostanie automatycznie anulowana i zwrócimy Ci kwotę Twojej stawki bez zysku i straty. Gdy opcja „Anulowanie transakcji” jest aktywna:", "549479175": "Mnożniki Deriv", + "550589723": "Twoja stawka wzrośnie do {{growth_rate}}% za kleszcz, o ile aktualna cena spot pozostanie w granicach ±{{tick_size_barrier}} od poprzedniej ceny spot.", "551569133": "Dowiedz się więcej o limitach handlowych", "554135844": "Edytuj", "554410233": "To hasło jest wśród 10 najpopularniejszych", @@ -524,6 +525,7 @@ "627814558": "Ten blok zwraca wartość, kiedy warunek jest prawdziwy. Użyj tego bloku w ramach powyższych bloków funkcji.", "628193133": "ID konta", "629145209": "Jeśli zostanie wybrane działanie „ORAZ”, blok zwróci wartość „Prawda”, tylko jeśli obie określone wartości będą miały wartość „Prawda”", + "629395043": "Wszystkie stopy wzrostu", "632398049": "Ten blok przydziela wartość zerową dla elementu lub twierdzenia.", "634219491": "Nie podano numeru identyfikacji podatkowej. Jest on wymagany z powodów prawnych i regulacyjnych. Przejdź do sekcji <0>Dane osobowe w ustawieniach swojego konta i podaj swój najnowszy numer identyfikacji podatkowej.", "636219628": "<0>c.Jeżeli nie będzie możliwe dojście do porozumienia, skarga zostanie skierowana do fazy rozstrzygania prowadzonej przez DRC.", @@ -674,6 +676,7 @@ "802438383": "Potrzebny jest nowy dokument potwierdzający adres", "802556390": "sekundy", "802989607": "Przeciągnij Twój plik XML tutaj", + "803500173": "Początkowa stawka", "806165583": "Australia 200", "807499069": "Procedura składania skarg do Komisji Finansowej", "808323704": "Aby utworzyć zmienne testowe, możesz użyć bloków „Porównaj” i „Działanie logiczne”.", @@ -1093,6 +1096,7 @@ "1264842111": "Możesz przełączać się między kontami rzeczywistymi i demo.", "1265704976": "", "1270581106": "Jeśli wybierzesz „Nie osiągnie”, zdobędziesz wypłatę, jeśli cena rynkowa nie osiągnie limitu w żadnym momencie w trakcie trwania umowy.", + "1271461759": "Twoja umowa zostanie zamknięta automatycznie, jeśli Twój zysk osiągnie tę kwotę.", "1272012156": "GBP/CHF", "1272337240": "Dni", "1272681097": "Godziny", @@ -1430,7 +1434,6 @@ "1641395634": "Lista ostatnich cyfr", "1641635657": "Potrzebny jest nowy dokument potwierdzający tożsamość", "1641980662": "Wymagane jest podanie zwrotu grzecznościowego.", - "1642645912": "Wszystkie stawki", "1644703962": "Szukasz kont CFD? Przejdź do Centrum Handlowego", "1644864436": "<0>Musisz uwierzytelnić swoje konto, zanim zażądasz zostania klientem profesjonalnym.", "1644908559": "Wymagany jest kod cyfrowy.", @@ -1588,6 +1591,7 @@ "1803338729": "Wybierz, jakim rodzajem kontraktu chcesz handlować. Na przykład w przypadku kontraktu Wzrost/Spadek możesz wybrać jedną z trzech opcji: Wzrost, Spadek lub obie z nich. Wybrana opcja określi dostępne opcje dla bloku Zakup.", "1804620701": "Wygaśnięcie", "1804789128": "Ticki: {{display_value}}", + "1806017862": "Maks. kleszcze", "1806355993": "Brak prowizji", "1806503050": "Niektóre z metod płatności mogą być niedostępne dla Twojej waluty.", "1808058682": "Załadowano bloki", @@ -2629,6 +2633,7 @@ "-1511825574": "Zysk/strata:", "-726626679": "Potencjalny zysk/strata:", "-338379841": "Cena orientacyjna:", + "-2027409966": "Początkowa stawka:", "-1525144993": "Limit wypłat:", "-1167474366": "Najmniejsza zmiana ceny ", "-555886064": "Wygrał", @@ -3441,7 +3446,6 @@ "-2039780875": "Potwierdzenie zakupu", "-1672470173": "Przed zakupem kontraktu wymagane jest potwierdzenie", "-1342661765": "Przyciski blokowania zakupu kontraktu", - "-1738427539": "Zakup", "-504410042": "Po otwarciu pozycji zostaną utworzone bariery wokół ceny aktywów. Dla każdego nowego znacznika górna i dolna bariery są obliczane automatycznie na podstawie wybranej wartości zasobu i akumulatora. Zarobisz zysk, jeśli zamkniesz swoją pozycję, zanim cena aktywów osiągnie którąkolwiek z barier.", "-1907770956": "Dopóki zmiana ceny dla każdego kleszcza mieści się w granicach bariery, Twoja wypłata będzie rosła przy każdym taktowaniu, w oparciu o wybraną wartość akumulatora.", "-997670083": "Maksymalne kleszcze", @@ -3503,9 +3507,11 @@ "-194424366": "powyżej", "-1527492178": "Zablokowano zakup", "-725375562": "Możesz zablokować/odblokować przycisk zakupu w menu Ustawienia", - "-601992465": "Gromadzić", - "-30171993": "Twoja stawka wzrośnie o {{growth_rate}}% przy każdym zaznaczeniu, zaczynając od drugiego kleszcza, o ile cena pozostanie w przedziale ±{{tick_size_barrier}} od poprzedniej ceny ticka.", + "-2131851017": "Tempo wzrostu", "-1358367903": "Stawka", + "-542594338": "Maksymalna wypłata", + "-690963898": "Twoja umowa zostanie automatycznie zamknięta, gdy Twoja wypłata osiągnie tę kwotę.", + "-511541916": "Twoja umowa zostanie automatycznie zamknięta po osiągnięciu tej liczby kleszczy.", "-1918235233": "Min. stawka", "-1935239381": "Max. stawka", "-1930565757": "Twoja stawka to jednorazowa składka bezzwrotna za zakup tej umowy. Twój całkowity zysk/strata jest równa wartości kontraktu pomniejszonej o stawkę.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stop out <0/>", "-1686280757": "<0>{{commission_percentage}}% z (<1/> * {{multiplier}})", "-1043117679": "Gdy Twoje bieżące straty zrównają się z {{stop_out_percentage}}% Twojej stawki lub przewyższą tę wartość, Twój kontrakt zostanie zamknięty po najbliższej dostępnej cenie aktywa.", - "-477998532": "Twój kontrakt zostanie automatycznie zamknięty, gdy Twoja strata będzie równa tej kwocie lub wyższa od niej.", - "-2008947191": "Twoja umowa jest zamykana automatycznie, gdy zysk jest większy lub równy tej kwocie.", "-339236213": "Mnożnik", "-857660728": "Ceny wykonania", "-119134980": "<0>{{trade_type}}: Otrzymasz wypłatę, jeśli cena rynkowa wynosi {{payout_status}} ta cena <0>w czasie wygaśnięcia. w przeciwnym razie Twoja wypłata będzie zerowa.", "-243332856": "Statystyki ostatnich cyfr dla ostatnich 1000 ticków dla {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Otrzymasz wypłatę, jeśli rynek wynosi {{payout_status}} ta cena <0>w czasie wygaśnięcia. w przeciwnym razie, twoja wypłata będzie zerowa.", "-347156282": "Prześlij dowód", + "-1738427539": "Zakup", "-461955353": "cena zakupu", "-172348735": "zysk", "-1624674721": "typ kontraktu", diff --git a/packages/translations/src/translations/pt.json b/packages/translations/src/translations/pt.json index 6e074dd177c6..bab8424b5849 100644 --- a/packages/translations/src/translations/pt.json +++ b/packages/translations/src/translations/pt.json @@ -317,7 +317,6 @@ "379523479": "Para evitar a perda de fundos, não compartilhe tokens com o escopo Admin com partes não autorizadas.", "380606668": "tick", "380694312": "Máximo de negociações consecutivas", - "382781785": "Seu contrato é fechado automaticamente quando seu lucro é maior ou igual a esse valor.", "384303768": "Este bloco retorna \"Verdadeiro\" se a última vela estiver preta. Ele pode ser colocado em qualquer lugar da tela, exceto nos parâmetros do bloco raiz Negociação.", "386191140": "Você pode escolher entre contas de negociação de CFD ou contas de Opções e Multiplicadores", "386278304": "Instale o aplicativo da web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Máximo de posições em aberto", "438067535": "Mais de $500.000", "442520703": "$250.001 a $500.000", + "443203714": "Seu contrato será encerrado automaticamente se a sua perda atingir esse valor.", "443559872": "Financeira SVG", "444484637": "Negação lógica", "445419365": "1 a 2 anos", @@ -455,6 +455,7 @@ "545476424": "Retiradas totais", "546534357": "Se você selecionar \"Cancelamento da transação\", poderá cancelar sua posição dentro de uma hora se achar que o mercado não está se movendo a seu favor. Cobraremos uma pequena taxa por isso, mas devolveremos o valor da sua participação sem lucros ou perdas. Se o valor do Nível de Parada (Stop Out) for atingido antes do término do cancelamento da transação, sua posição será cancelada automaticamente e retornaremos o valor da sua participação sem lucros ou perdas. Enquanto o \"Cancelamento da transação\" estiver ativo:", "549479175": "Deriv Multiplicadores", + "550589723": "Sua entrada aumentará em {{growth_rate}}% por tick, desde que o preço à vista atual permaneça dentro de ±{{tick_size_barrier}} do preço à vista anterior.", "551569133": "Saiba mais sobre limites de negociação", "554135844": "Editar", "554410233": "Esta é uma das 10 senhas mais comuns", @@ -524,6 +525,7 @@ "627814558": "Este bloco retorna um valor quando uma condição é verdadeira. Use este bloco em qualquer um dos blocos de funções acima.", "628193133": "ID da conta", "629145209": "Caso a operação \"E\" seja selecionada, o bloco retornará \"Verdadeiro\" apenas se os dois valores fornecidos forem \"Verdadeiro\"", + "629395043": "Todas as taxas de crescimento", "632398049": "Este bloco atribui um valor nulo a um item ou instrução.", "634219491": "Você não forneceu seu número de identificação fiscal. Essas informações são necessárias para os requisitos legais e regulamentares. Vá para <0>Detalhes pessoais nas configurações da sua conta e preencha o seu último número de identificação fiscal.", "636219628": "<0>c. Se nenhuma oportunidade de acordo for encontrada, a reclamação irá para a fase de determinação a ser tratada pela DRC.", @@ -674,6 +676,7 @@ "802438383": "Novo Comprovante de Endereço é necessário", "802556390": "segundos", "802989607": "Arraste seu arquivo XML aqui", + "803500173": "Entrada inicial", "806165583": "Australia 200", "807499069": "Procedimento de reclamações da Comissão Financeira", "808323704": "Você também pode usar os blocos \"Comparar\" e \"Operação lógica\" para criar variáveis ​​de teste.", @@ -1093,6 +1096,7 @@ "1264842111": "Você pode alternar entre conta real e conta demo.", "1265704976": "", "1270581106": "Se você selecionar \"Não Toca\", você ganha o Pagamento se o mercado nunca tocar na barreira em nenhum momento durante o período do contrato.", + "1271461759": "Seu contrato será encerrado automaticamente se o seu lucro atingir esse valor.", "1272012156": "GBP/CHF", "1272337240": "Dias", "1272681097": "Horas", @@ -1430,7 +1434,6 @@ "1641395634": "Lista de últimos dígitos", "1641635657": "Nova comprovante de documento de identidade necessário", "1641980662": "A saudação é necessária.", - "1642645912": "Todas as tarifas", "1644703962": "Procurando contas CFD? Acesse o Trader's Hub", "1644864436": "Você precisará autenticar sua conta antes de se candidatar para se tornar um cliente profissional. <0>Autenticar minha conta", "1644908559": "O código em dígito é obrigatório.", @@ -1588,6 +1591,7 @@ "1803338729": "\nEscolha o tipo de contrato que deseja negociar. Por exemplo, para o tipo de negociação Ascensão / Queda, você pode escolher uma das três opções: Ascensão, Queda ou Ambos. A opção selecionada determinará as opções disponíveis para o bloco Compra.", "1804620701": "Vencimento", "1804789128": "{{display_value}} Ticks", + "1806017862": "Máximo de ticks", "1806355993": "Sem comissão", "1806503050": "Observe que alguns métodos de pagamento podem não estar disponíveis em seu país.", "1808058682": "Os blocos foram carregados com sucesso", @@ -2629,6 +2633,7 @@ "-1511825574": "Lucro/Perda:", "-726626679": "Lucro/Perda potencial:", "-338379841": "Preço indicativo:", + "-2027409966": "Entrada inicial:", "-1525144993": "Limite de pagamento:", "-1167474366": "Tick ", "-555886064": "Ganhou", @@ -3441,7 +3446,6 @@ "-2039780875": "Confirmação de compra", "-1672470173": "Exigir confirmação antes de comprar um contrato", "-1342661765": "Bloquear botões de compra de contrato", - "-1738427539": "Comprar", "-504410042": "Quando você abre uma posição, barreiras são criadas em torno do preço do ativo. Para cada novo tick, as barreiras superior e inferior são calculadas automaticamente com base no valor do ativo e do acumulador que você escolher. Você terá lucro se fechar a sua posição antes que o preço do ativo atinja qualquer uma das barreiras.", "-1907770956": "Enquanto a mudança de preço de cada tick estiver dentro da barreira, seu pagamento aumentará a cada tick, com base no valor do acumulador que você selecionou.", "-997670083": "Máximo de ticks", @@ -3503,9 +3507,11 @@ "-194424366": "acima", "-1527492178": "Compra bloqueada", "-725375562": "Você pode bloquear/desbloquear o botão de compra no menu Configurações", - "-601992465": "Acumular", - "-30171993": "Sua entrada aumentará em {{growth_rate}} a cada tick a partir do segundo tick, desde que o preço permaneça dentro de uma faixa de ±{{tick_size_barrier}}} em relação ao preço do tick anterior.", + "-2131851017": "Taxa de crescimento", "-1358367903": "Entrada", + "-542594338": "Pagamento máximo", + "-690963898": "Seu contrato será encerrado automaticamente quando o seu pagamento atingir esse valor.", + "-511541916": "Seu contrato será automaticamente encerrado ao atingir esse número de ticks.", "-1918235233": "Entrada mínima", "-1935239381": "Entrada máxima", "-1930565757": "A sua entrada é um prêmio único e não reembolsável na compra deste contrato. O seu lucro/perda total é igual ao valor do contrato menos a sua participação.", @@ -3520,14 +3526,13 @@ "-2131859340": "Pare <0/>", "-1686280757": "<0>{{commission_percentage}}% de (<1/> * {{multiplier}})", "-1043117679": "Quando sua perda atual for igual ou superior a {{stop_out_percentage}}% de sua aposta, seu contrato será fechado ao preço de ativo disponível mais próximo.", - "-477998532": "Seu contrato é fechado automaticamente quando sua perda é maior ou igual a esse valor.", - "-2008947191": "Seu contrato é fechado automaticamente quando o seu lucro é maior ou igual a esse valor.", "-339236213": "Multiplicador", "-857660728": "Preços de Exercício", "-119134980": "<0>{{trade_type}}: Você receberá um pagamento se o preço do mercado for {{payout_status}} esse preço <0>na hora de expiração. Caso contrário, seu pagamento será zero.", "-243332856": "Estatísticas do último dígito para 1000 ticks mais recentes de {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Você receberá um pagamento se o mercado for {{payout_status}} esse preço <0>na hora de expiração. Caso contrário, seu pagamento será zero.", "-347156282": "Enviar comprovante", + "-1738427539": "Comprar", "-461955353": "preço de aquisição", "-172348735": "lucro", "-1624674721": "tipo de contrato", diff --git a/packages/translations/src/translations/ru.json b/packages/translations/src/translations/ru.json index 065c6c0b1bfd..f0eb40abb14e 100644 --- a/packages/translations/src/translations/ru.json +++ b/packages/translations/src/translations/ru.json @@ -317,7 +317,6 @@ "379523479": "Во избежание потери средств не передавайте токены со сферой действия Админ неавторизованным лицам.", "380606668": "тик.", "380694312": "Максимальное число последовательных контрактов", - "382781785": "Ваш контракт будет автоматически закрыт, когда прибыль достигнет или превысит это значение.", "384303768": "Этот блок возвращает значение “Верно”, если последняя свеча черная. Блок может быть размещен где угодно, за исключением корневого блока параметров контракта.", "386191140": "Вы можете выбрать между торговыми счетами для CFD, опционов и мультипликаторов", "386278304": "Установите веб-приложение {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Макс. число открытых позиций", "438067535": "Более $500 000", "442520703": "$250 001 - $500 000", + "443203714": "Ваш контракт будет автоматически закрыт, если ваш убыток достигнет этой суммы.", "443559872": "Финансовый SVG", "444484637": "Логическое отрицание", "445419365": "1 - 2 года", @@ -455,6 +455,7 @@ "545476424": "Общая сумма вывода", "546534357": "Если вы выберете функцию «Отмена сделки», вы сможете отменить свою позицию в течение указанного времени, если обнаружите, что рынок движется не в вашу пользу. За это мы возьмем небольшую плату, но вернем сумму вашей ставки без прибыли или убытка. Если сумма стоп аут будет достигнута до истечения срока отмены сделки, ваша позиция будет отменена автоматически, и мы вернем сумму вашей ставки без прибыли или убытка. Пока активна «Отмена сделки»:", "549479175": "Мультипликаторы Deriv", + "550589723": "Ваша ставка будет расти на {{growth_rate}}% за тик до тех пор, пока текущая спот-цена остается в пределах ±{{{tick_size_barrier}} от предыдущей спот-цены.", "551569133": "Узнайте больше о торговых лимитах", "554135844": "Изменить", "554410233": "Это один из 10 наиболее распространенных паролей.", @@ -524,6 +525,7 @@ "627814558": "Этот блок возвращает значение, когда условие верно. Используйте этот блок в любом из функциональных блоков выше.", "628193133": "ID счета", "629145209": "В случае, если выбрана операция «И», блок возвращает «Верно», только если оба заданных значения «Верны»", + "629395043": "Все темпы роста", "632398049": "Этот блок присваивает нулевое значение элементу или инструкции.", "634219491": "Вы не указали свой идентификационный номер налогоплательщика. Эта информация необходима для соблюдения правовых и нормативных требований. Перейдите в <0>личные данные в настройках счета и введите свой актуальный идентификационный номер налогоплательщика.", "636219628": "<0>c.Если не удастся найти возможность урегулировать спор, DRC перейдет к этапу определения.", @@ -674,6 +676,7 @@ "802438383": "Необходимо новое подтверждение адреса", "802556390": "сек.", "802989607": "Перетащите сюда свой файл XML", + "803500173": "Начальная ставка", "806165583": "Australia 200", "807499069": "Порядок рассмотрения жалоб Финансовой комиссией", "808323704": "Вы также можете использовать блоки «Сравнить» и «Логическая операция» для создания тестовых переменных.", @@ -1093,6 +1096,7 @@ "1264842111": "Вы можете переключаться между реальными и демо-счетами.", "1265704976": "", "1270581106": "Если вы выбираете \"Нет касания\", вы получаете выплату, если рынок не коснется заданного ценового барьера в течение всего срока действия контракта.", + "1271461759": "Ваш контракт будет автоматически закрыт, если ваша прибыль достигнет этой суммы.", "1272012156": "GBP/CHF", "1272337240": "Дни", "1272681097": "Часы", @@ -1430,7 +1434,6 @@ "1641395634": "Список последних тиков", "1641635657": "Необходимо новое удостоверение личности", "1641980662": "Необходимо указать приветствие.", - "1642645912": "Все ставки", "1644703962": "Ищете счета CFD? Перейти в Trader's Hub", "1644864436": "Прежде чем подать заявку на статус профессионального клиента, необходимо аутентифицировать счет. <0>Аутентифицируйте счет", "1644908559": "Требуется цифровой код.", @@ -1588,6 +1591,7 @@ "1803338729": "Выберите направление контракта. Например, в контракте Повышение/Падение вы можете выбрать одну из трех опций: Повышение, Падение или Оба. Выбранное направление будет определять количество опций, доступных в блоке покупки.", "1804620701": "Срок действия", "1804789128": "{{display_value}} Тиков", + "1806017862": "Максимальное количество галочек", "1806355993": "Никаких комиссий", "1806503050": "Обратите внимание, что некоторые платежные методы могут быть недоступны в вашей стране.", "1808058682": "Блоки успешно загружены", @@ -2629,6 +2633,7 @@ "-1511825574": "Прибыль/убыток:", "-726626679": "Потенциальная прибыль/убыток:", "-338379841": "Ориентировочная цена:", + "-2027409966": "Начальная ставка:", "-1525144993": "Лимит выплаты:", "-1167474366": "Тик ", "-555886064": "Выиграл", @@ -3441,7 +3446,6 @@ "-2039780875": "Подтверждение покупки", "-1672470173": "Требовать подтверждение перед покупкой контракта", "-1342661765": "Блокировка кнопок покупки контракта", - "-1738427539": "Покупка", "-504410042": "Когда вы откроете позицию, вокруг цены актива будут созданы барьеры. Для каждого нового тика верхний и нижний барьеры автоматически рассчитываются в зависимости от выбранного актива и аккумулятора. Вы получите прибыль, если закроете позицию до того, как цена актива достигнет любого из барьеров.", "-1907770956": "Пока цена находится в пределах барьеров, ваша выплата будет расти с каждым тиком в зависимости от выбранного значения аккумулятора.", "-997670083": "Максимум тиков", @@ -3503,9 +3507,11 @@ "-194424366": "выше", "-1527492178": "Покупка заблокирована", "-725375562": "Вы можете заблокировать/разблокировать кнопку покупки в меню настроек", - "-601992465": "Аккумуляция", - "-30171993": "Ваша ставка будет расти на {{growth_rate}}% с каждым тиком, начиная со второго тика, при условии, что цена останется в диапазоне ±{{tick_size_barrier}} от предыдущей цены тика.", + "-2131851017": "Темпы роста", "-1358367903": "Ставка", + "-542594338": "Максимальная выплата", + "-690963898": "Ваш контракт будет автоматически закрыт, когда ваша выплата достигнет этой суммы.", + "-511541916": "По достижении этого количества галочек ваш контракт будет автоматически закрыт.", "-1918235233": "Мин. ставка", "-1935239381": "Макс. ставка", "-1930565757": "Ваша ставка – это невозмещаемая единовременная плата за покупку контракта. Ваша общая прибыль/убыток равна стоимости контракта минус ставка.", @@ -3520,14 +3526,13 @@ "-2131859340": "Стоп аут <0/>", "-1686280757": "<0>{{commission_percentage}}% от (<1/> * {{multiplier}})", "-1043117679": "Когда ваш текущий убыток станет равен или превысит {{stop_out_percentage}}% вашей ставки, контракт будет закрыт по ближайшей доступной цене актива.", - "-477998532": "Ваш контракт будет автоматически закрыт, когда убыток достигнет или превысит это значение.", - "-2008947191": "Ваш контракт будет автоматически закрыт, когда прибыль достигнет или превысит это значение.", "-339236213": "Мультипликатор", "-857660728": "Цены исполнения", "-119134980": "<0>{{trade_type}}: Вы получите выплату, если рыночная цена будет {{payout_status}} эта цена <0>в момент истечения срока действия. В противном случае выплата будет равна нулю.", "-243332856": "Статистика последней десятичной последних 1000 тиков для {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Вы получите выплату, если рынок будет {{payout_status}} эта цена <0>на момент экспирации. В противном случае выплата будет равна нулю.", "-347156282": "Отправить подтверждение", + "-1738427539": "Покупка", "-461955353": "цена покупки", "-172348735": "прибыль", "-1624674721": "тип контракта", diff --git a/packages/translations/src/translations/si.json b/packages/translations/src/translations/si.json index 48727e6fce8b..7d24ed19baa0 100644 --- a/packages/translations/src/translations/si.json +++ b/packages/translations/src/translations/si.json @@ -317,7 +317,6 @@ "379523479": "අරමුදල් නැතිවීම වළක්වා ගැනීම සඳහා, අවසර නොලත් පාර්ශවයන් සමඟ පරිපාලක විෂය පථය සමඟ ටෝකන බෙදා නොගන්න.", "380606668": "ටික්", "380694312": "උපරිම අඛණ්ඩ ගනුදෙනු", - "382781785": "ඔබේ ලාභය මෙම මුදලට වඩා වැඩි හෝ සමාන වන විට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා ඇත.", "384303768": "අන්තිම ඉටිපන්දම කළු නම් මෙම කොටස “සත්ය” නැවත ලබා දෙයි. වෙළඳ පරාමිති මූල කොටස හැර එය කැන්වසය මත ඕනෑම තැනක තැබිය හැකිය.", "386191140": "ඔබට CFD වෙළඳ ගිණුම් හෝ විකල්ප සහ ගුණක ගිණුම් අතර තෝරා ගත හැකිය", "386278304": "{{platform_name_trader}} වෙබ් යෙදුම ස්ථාපනය කරන්න", @@ -371,6 +370,7 @@ "437904704": "උපරිම විවෘත තනතුරු", "438067535": "ඩොලර් 500,000 ට වඩා", "442520703": "ඩොලර් 250,001 - ඩොලර් 500,000", + "443203714": "ඔබේ අලාභය මෙම මුදල කරා ළඟා වුවහොත් ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත.", "443559872": "මූල්ය SVG", "444484637": "තර්කනය නිෂේධනය", "445419365": "අවුරුදු 1 - 2", @@ -455,6 +455,7 @@ "545476424": "මුළු මුදල් ආපසු", "546534357": "ඔබ “ගනුදෙනු අවලංගු කිරීම” තෝරා ගන්නේ නම්, වෙළඳපල ඔබට වාසිදායක වුවහොත් තෝරාගත් කාල රාමුවක් තුළ ඔබේ වෙළඳාම අවලංගු කිරීමට ඔබට හැකි වේ. අපි මේ සඳහා කුඩා ගාස්තුවක් අය කරන්නෙමු, නමුත් අපි ඔබේ කොටස් මුදල ලාභයක් හෝ අලාභයක් නොමැතිව ආපසු ලබා දෙන්නෙමු. ගනුදෙනුව අවලංගු කිරීම කල් ඉකුත් වීමට පෙර නැවතුම් මුදල ළඟා වුවහොත්, ඔබේ ස්ථානය ස්වයංක්රීයව අවලංගු වන අතර අපි ඔබේ කොටස් මුදල ලාභ හෝ අලාභයකින් තොරව ආපසු ලබා දෙන්නෙමු. “ගනුදෙනු අවලංගු කිරීම” සක්රීය වන අතර:", "549479175": "ගුණකය ලබා", + "550589723": "වර්තමාන ස්ථාන මිල පෙර ස්ථාන මිලෙන් ±{{tick_size_barrier}} ක් තුළ පවතින තාක් කල් ඔබේ කොටස ටික් එකකට {{growth_rate}}% කින් වර්ධනය වේ.", "551569133": "වෙළඳ සීමාවන් ගැන තව දැනගන්න", "554135844": "සංස්කරණය කරන්න", "554410233": "මෙය ඉහළම 10 පොදු මුරපදයකි", @@ -524,6 +525,7 @@ "627814558": "කොන්දේසියක් සත්ය වූ විට මෙම කොටස වටිනාකමක් ලබා දෙයි. ඉහත ශ්රිත කොටස් එක්කෝ තුළ මෙම කොටස භාවිතා කරන්න.", "628193133": "ගිණුම් හැඳුනුම්පත", "629145209": "“සහ” මෙහෙයුම තෝරාගෙන තිබේ නම්, බ්ලොක් එක “සත්ය” නැවත ලබා දෙන්නේ ලබා දී ඇති අගයන් දෙකම “සත්ය” නම් පමණි", + "629395043": "සියලුම වර්ධන අනුපාත", "632398049": "මෙම කොටස අයිතමයකට හෝ ප්රකාශයකට ශුන්ය අගයක් ලබා දෙයි.", "634219491": "ඔබ ඔබේ බදු හඳුනාගැනීමේ අංකය ලබා දී නොමැත. නීතිමය හා නියාමන අවශ්යතා සඳහා මෙම තොරතුරු අවශ්ය වේ. කරුණාකර ඔබගේ ගිණුම් සැකසුම් වල <0>පුද්ගලික තොරතුරු වෙත ගොස් ඔබගේ නවතම බදු හඳුනාගැනීමේ අංකය පුරවන්න.", "636219628": "<0>ඇ. බේරුම්කරණ අවස්ථාවක් සොයාගත නොහැකි නම්, පැමිණිල්ල DRC විසින් හැසිරවිය යුතු අධිෂ්ඨාන අදියර වෙත ගමන් කරනු ඇත.", @@ -674,6 +676,7 @@ "802438383": "ලිපිනය පිළිබඳ නව සාක්ෂි අවශ්ය වේ", "802556390": "තත්පර", "802989607": "ඔබගේ XML ගොනුව මෙහි ඇදගෙන යන්න", + "803500173": "ආරම්භක කොටස්", "806165583": "ඕස්ට්රේලියාව 200", "807499069": "මූල්ය කොමිෂන් සභා පැමිණිලි පටිපාටිය", "808323704": "පරීක්ෂණ විචල්යයන් සෑදීම සඳහා ඔබට “සසඳන්න” සහ “ලොජික් මෙහෙයුම්” කුට්ටි භාවිතා කළ හැකිය.", @@ -1093,6 +1096,7 @@ "1264842111": "ඔබට සැබෑ සහ ආදර්ශන ගිණුම් අතර මාරු විය හැකිය.", "1265704976": "", "1270581106": "ඔබ “ස්පර්ශයක් නැත” තෝරා ගන්නේ නම්, ගිවිසුම් කාලය තුළ වෙළඳපල කිසි විටෙකත් බාධකයට අත නොතබන්නේ නම් ඔබ ගෙවීම දිනා ගනී.", + "1271461759": "ඔබේ ලාභය මෙම මුදල කරා ළඟා වුවහොත් ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත.", "1272012156": "GBP/CHF", "1272337240": "දින", "1272681097": "පැය", @@ -1430,7 +1434,6 @@ "1641395634": "අවසාන ඉලක්කම් ලැයිස්තුව", "1641635657": "අනන්යතා ලේඛනයේ නව සාක්ෂි අවශ්යයි", "1641980662": "ආචාර කිරීම අවශ්ය වේ.", - "1642645912": "සියලුම ගාස්තු", "1644703962": "CFD ගිණුම් සොයනවාද? වෙළෙන්දාගේ කේන්ද්රය වෙත යන්න", "1644864436": "වෘත්තීය සේවාදායකයෙකු වීමට ඉල්ලා සිටීමට පෙර ඔබේ ගිණුම <0>සත්යාපනය කිරීමට ඔබට අවශ්ය වනු ඇත.", "1644908559": "ඉලක්කම් කේතය අවශ්ය වේ.", @@ -1588,6 +1591,7 @@ "1803338729": "ඔබට වෙළඳාම් කිරීමට අවශ්ය කුමන ආකාරයේ කොන්ත්රාත්තුවක් තෝරන්න. උදාහරණයක් ලෙස, නැගී සිටීම/වැටීම වෙළඳ වර්ගය සඳහා ඔබට විකල්ප තුනෙන් එකක් තෝරා ගත හැකිය: නැගීම, වැටීම හෝ දෙකම. තෝරාගත් විකල්පය මිලදී ගැනීමේ කොටස සඳහා පවතින විකල්ප තීරණය කරනු ඇත.", "1804620701": "කල් ඉකුත්වීම", "1804789128": "කිනිතුල්ලන් {{display_value}}", + "1806017862": "මැක්ස්. කිනිතුල්ලන්", "1806355993": "කොමිසමක් නැත", "1806503050": "සමහර ගෙවීම් ක්රම ඔබේ රටේ නොතිබිය හැකි බව කරුණාවෙන් සලකන්න.", "1808058682": "බ්ලොක් සාර්ථකව පටවනු ලැබේ", @@ -2629,6 +2633,7 @@ "-1511825574": "ලාභය/අඞු කිරීමට:", "-726626679": "විභව ලාභය/අලාභය:", "-338379841": "දර්ශක මිල:", + "-2027409966": "ආරම්භක කොටස්:", "-1525144993": "ගෙවීම් සීමාව:", "-1167474366": "ටික් ", "-555886064": "දිනයි", @@ -3441,7 +3446,6 @@ "-2039780875": "මිලදී ගැනීම තහවුරු", "-1672470173": "කොන්ත්රාත්තුවක් මිලදී ගැනීමට පෙර තහවුරු කිරීම අවශ්ය වේ", "-1342661765": "කොන්ත්රාත් මිලදී ගැනීමේ බොත්තම් අගුළු දමන්න", - "-1738427539": "මිලදී ගැනීම", "-504410042": "ඔබ ස්ථානයක් විවෘත කරන විට, වත්කම් මිල වටා බාධක ඇති වේ. එක් එක් නව ටික් සඳහා, ඔබ තෝරා ගන්නා වත්කම් සහ ඇකියුලේටර් අගය මත පදනම්ව ඉහළ සහ පහළ බාධක ස්වයංක්රීයව ගණනය කරනු ලැබේ. වත්කම් මිල බාධක වලට පහර දීමට පෙර ඔබ ඔබේ ස්ථානය වසා දැමුවහොත් ඔබ ලාභයක් උපයා ගනු ඇත.", "-1907770956": "එක් එක් ටික් සඳහා මිල වෙනස් කිරීම බාධකයක් තුළ පවතින තාක් කල්, ඔබ තෝරාගත් ඇකියුලේටර් අගය මත පදනම්ව ඔබේ ගෙවීම සෑම ටික් එකකින්ම වර්ධනය වේ.", "-997670083": "උපරිම කිනිතුල්ලන්", @@ -3503,9 +3507,11 @@ "-194424366": "ඉහත", "-1527492178": "අගුලු දමා මිලදී", "-725375562": "සැකසුම් මෙනුවෙන් ඔබට මිලදී ගැනීමේ බොත්තම අගුළු ඇරීමට/අගුළු ඇරීමට හැකිය", - "-601992465": "සමුච්චය", - "-30171993": "පෙර ටික් මිලෙන් ±{{tick_size_barrier}} ක පරාසයක් තුළ මිල පවතින තාක් කල්, දෙවන ටික් එකෙන් ආරම්භ වන සෑම ටික් එකකදීම ඔබේ කොටස {{growth_rate}}% කින් වර්ධනය වේ.", + "-2131851017": "වර්ධන වේගය", "-1358367903": "කණුවක්", + "-542594338": "උපරිම ගෙවීම", + "-690963898": "ඔබගේ ගෙවීම මෙම මුදල කරා ළඟා වූ විට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත.", + "-511541916": "මෙම කිනිතුල්ලන් සංඛ්යාව කරා ළඟා වූ පසු ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා දැමෙනු ඇත.", "-1918235233": "විනාඩි. කොටස්", "-1935239381": "මැක්ස්. කොටස්", "-1930565757": "මෙම කොන්ත්රාත්තුව මිලදී ගැනීම සඳහා ඔබේ කොටස ආපසු නොගෙවන එක් වරක් වාරිකයක් වේ. ඔබේ මුළු ලාභය/අලාභය කොන්ත්රාත්තුවේ වටිනාකමට සමාන වේ.", @@ -3520,14 +3526,13 @@ "-2131859340": "නවත්වන්න<0/>", "-1686280757": "<0>{{commission_percentage}}% (<1/>* {{multiplier}})", "-1043117679": "ඔබගේ වත්මන් අලාභය ඔබගේ කොටස් වලින් {{stop_out_percentage}}%ට සමාන වන විට හෝ ඉක්මවන විට, ඔබගේ කොන්ත්‍රාත්තුව පවතින ආසන්නතම වත්කම් මිලට වසා දමනු ඇත.", - "-477998532": "ඔබේ අලාභය මෙම මුදලට වඩා වැඩි හෝ සමාන වූ විට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා ඇත.", - "-2008947191": "ඔබේ ලාභය මෙම මුදලට වඩා වැඩි හෝ සමාන වූ විට ඔබේ කොන්ත්රාත්තුව ස්වයංක්රීයව වසා ඇත.", "-339236213": "ගුණකය", "-857660728": "වැඩ වර්ජන මිල", "-119134980": "<0>{{trade_type}}: වෙළඳපල මිල <0>කල් ඉකුත් වන විට මෙම මිල {{payout_status}} නම් ඔබට ගෙවීමක් ලැබෙනු ඇත. එසේ නොමැති නම්, ඔබේ ගෙවීම ශුන්ය වේ.", "-243332856": "නවතම 1000 කිනිතුල්ලන් සඳහා {{ underlying_name }}සඳහා අවසාන ඉලක්කම් සංඛ්යාන", "-1900883796": "<0>{{trade_type}}: <0>කල් ඉකුත් වන විට වෙළඳපල මෙම මිල {{payout_status}} ක් නම් ඔබට ගෙවීමක් ලැබෙනු ඇත. එසේ නොමැති නම්, ඔබේ ගෙවීම ශුන්ය වේ.", "-347156282": "සාධනය ඉදිරිපත් කරන්න", + "-1738427539": "මිලදී ගැනීම", "-461955353": "මිලදී ගැනීමේ මිල", "-172348735": "ලාභය", "-1624674721": "කොන්ත්රාත් වර්ගය", diff --git a/packages/translations/src/translations/th.json b/packages/translations/src/translations/th.json index 511588144dc3..194660395bae 100644 --- a/packages/translations/src/translations/th.json +++ b/packages/translations/src/translations/th.json @@ -317,7 +317,6 @@ "379523479": "เพื่อหลีกเลี่ยงการสูญเสียเงินทุนโปรดอย่าแบ่งปันโทเคนกับข้อมูลขอบเขตผู้ดูแลระบบให้กับบุคคลที่ไม่ได้รับอนุญาต", "380606668": "จุด Tick", "380694312": "จำนวนสูงสุดของการเทรดต่อเนื่อง", - "382781785": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติเมื่อผลกำไรของคุณมีมากกว่าหรือเท่ากับจำนวนนี้", "384303768": "บล็อกนี้จะคืนค่าว่า “จริง” หากแท่งเทียนสุดท้ายเป็นสีดำ มันจะถูกวางไว้ที่ใดก็ได้บนผืนผ้าใบ เว้นแต่ภายในบล็อกพื้นฐานเพื่อระบุพารามิเตอร์การซื้อขาย", "386191140": "คุณสามารถเลือกระหว่างบัญชีซื้อขาย CFD หรือบัญชีตราสารสิทธิและบัญชีตัวคูณ", "386278304": "ติดตั้งเว็บแอป {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "ตำแหน่งการค้าที่เปิดได้สูงสุด", "438067535": "มากกว่า $500,000", "442520703": "$250,001 - $500,000", + "443203714": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติหากว่าจำนวนที่คุณขาดทุนได้มาถึงจำนวนนี้", "443559872": "บัญชี Financial SVG", "444484637": "การปฏิเสธตรรกะ", "445419365": "1 - 2 ปี", @@ -455,6 +455,7 @@ "545476424": "เงินถอนทั้งหมด", "546534357": "หากคุณเลือก “การยกเลิกดีลข้อตกลง” คุณสามารถยกเลิกการซื้อขายภายในกรอบเวลาที่เลือกได้หากว่าตลาดไม่เคลื่อนตัวไปตามที่คุณคาดการณ์ไว้ โดยเราจะเรียกเก็บค่าธรรมเนียมเล็กน้อยสำหรับการยกเลิกนี้ แต่เราจะคืนจำนวนเงินทุนทรัพย์ของคุณซึ่งไม่รวมกำไรหรือขาดทุนให้ ทั้งนี้ หากมูลค่าการซื้อขายนั้นได้แตะถึงขีดจำนวนเงินค้ำประกันขั้นต่ำที่อนุญาตหรือ stop out ก่อนที่การยกเลิกข้อตกลงจะหมดอายุ ตำแหน่งการค้าของคุณจะถูกยกเลิกโดยอัตโนมัติและเราจะคืนจำนวนเงินทุนทรัพย์ของคุณซึ่งไม่รวมกำไรหรือขาดทุนให้ ในขณะที่ “การยกเลิกดีลข้อตกลง” ยังมีผลใช้งานอยู่:", "549479175": "ตัวคูณ Deriv", + "550589723": "เงินทุนทรัพย์ของคุณจะเติบโต {{growth_rate}}% ในทุกจุด Tick ตราบใดที่ราคายังคงอยู่ในช่วง ±{{tick_size_barrier}} จากราคาอันก่อนหน้า", "551569133": "เรียนรู้เพิ่มเติมเกี่ยวกับขีดจำกัดการซื้อขาย", "554135844": "แก้ไข", "554410233": "นี่คือรหัสผ่านทั่วไป 10 อันดับแรก", @@ -524,6 +525,7 @@ "627814558": "บล็อกนี้ส่งคืนค่าเมื่อเงื่อนไขนั้นเป็นจริง ให้ใช้บล็อกนี้ภายในบล็อกฟังก์ชันอันใดอันหนึ่งที่อยู่ด้านบน", "628193133": "หมายเลข ID บัญชี", "629145209": "ในกรณีที่เลือกการดำเนินการ \"AND\" ตัวบล็อกจะส่งกลับว่า \"จริง\" ก็เฉพาะเมื่อทั้งสองค่าที่ระบุนั้นเป็น \"จริง\"", + "629395043": "อัตราการเติบโตทั้งหมด", "632398049": "บล็อกนี้กำหนดค่าว่าไม่ทราบข้อมูลหรือ null ให้กับรายการหรือข้อความใดๆ", "634219491": "คุณยังไม่ได้ระบุหมายเลขประจำตัวผู้เสียภาษีของคุณ ข้อมูลนี้มีความจำเป็นเนื่องจากข้อกำหนดทางกฎหมายและระเบียบข้อบังคับ โปรดไปที่ <0>รายละเอียดส่วนบุคคล ในการตั้งค่าบัญชีของคุณ และกรอกหมายเลขประจำตัวผู้เสียภาษีล่าสุดของคุณ", "636219628": "<0>c หากไร้โอกาสในการหาข้อตกลงยุติการพิพาท ข้อร้องเรียนนั้นจะถูกส่งไปยังขั้นตอนการพิจารณาเพื่อให้คณะกรรมการ DRC เข้าจัดการต่อไป", @@ -674,6 +676,7 @@ "802438383": "ต้องการหลักฐานยืนยันที่อยู่ใหม่", "802556390": "วินาที", "802989607": "ลากไฟล์ XML ของคุณมาที่นี่", + "803500173": "เงินทุนทรัพย์แรกเริ่ม", "806165583": "Australia 200", "807499069": "กระบวนการดำเนินการเรื่องข้อร้องเรียนโดยคณะกรรมการทางการเงิน", "808323704": "คุณยังสามารถใช้บล็อก \"เปรียบเทียบ (Compare)\" และบล็อก \"การดำเนินการทางตรรกะ (Logic operation)\" เพื่อสร้างตัวแปรทดสอบ", @@ -1093,6 +1096,7 @@ "1264842111": "คุณสามารถสลับไปมาระหว่างบัญชีจริงและบัญชีทดลองได้", "1265704976": "<ข้อความว่าง>", "1270581106": "หากคุณเลือก \"ไม่แตะ\" คุณจะได้รับเงินผลตอบแทนก็ต่อเมื่อความเคลื่อนไหวตลาดไม่แตะค่าเส้นระดับราคาเป้าหมายเลย ณ เวลาใดๆ ในช่วงระยะเวลาของสัญญา", + "1271461759": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติหากว่าจำนวนที่คุณทำกำไรได้มาถึงจำนวนนี้", "1272012156": "GBP/CHF", "1272337240": "วัน", "1272681097": "ชั่วโมง", @@ -1430,7 +1434,6 @@ "1641395634": "ลิสต์รายการตัวเลขหลักสุดท้าย", "1641635657": "ต้องการเอกสารยืนยันตัวตนใหม่", "1641980662": "โปรดระบุคำขึ้นต้น", - "1642645912": "อัตราเปอร์เซ็นต์ทั้งหมด", "1644703962": "กำลังมองหาบัญชี CFD อยู่ใช่ไหม? ไปที่ Trader's Hub", "1644864436": "คุณจำเป็นจะต้องพิสูจน์สิทธิ์บัญชีของคุณเสียก่อนที่จะทำการขอเป็นลูกค้ามืออาชีพ <0>พิสูจน์สิทธิ์บัญชีของฉัน", "1644908559": "โปรดระบุรหัสหลัก", @@ -1588,6 +1591,7 @@ "1803338729": "เลือกประเภทสัญญาที่คุณต้องการซื้อขาย ตัวอย่างเช่น การซื้อขายแบบ ขึ้น/ลง ซึ่งคุณสามารถเลือกได้จากสามตัวเลือกคือ ขึ้น หรือ ลง หรือ ทั้งคู่ ทั้งนี้ ประเภทสัญญาที่ถูกเลือกจะกำหนดตัวเลือกที่จะมีมาให้สำหรับบล็อกการซื้อ", "1804620701": "การหมดอายุ", "1804789128": "ค่าจุด Tick {{display_value}} จุด", + "1806017862": "จำนวนจุด Tick สูงสุด", "1806355993": "ไม่มีค่าคอมมิชชั่น", "1806503050": "โปรดทราบว่าวิธีการชําระเงินบางวิธีอาจไม่มีให้บริการในประเทศของคุณ", "1808058682": "ดำเนินการโหลดบล็อกเรียบร้อยแล้ว", @@ -2629,6 +2633,7 @@ "-1511825574": "กำไร/ขาดทุน:", "-726626679": "กำไร/ขาดทุนที่ถูกประมาณการ:", "-338379841": "ราคาที่เหมาะสม:", + "-2027409966": "เงินทุนทรัพย์แรกเริ่ม:", "-1525144993": "วงเงินผลตอบแทน:", "-1167474366": "จุด Tick ", "-555886064": "ชนะ", @@ -3441,7 +3446,6 @@ "-2039780875": "ยืนยันการซื้อ", "-1672470173": "ต้องมีการยืนยันก่อนซื้อสัญญา", "-1342661765": "ปุ่มล็อคสัญญาซื้อ", - "-1738427539": "ซื้อ", "-504410042": "เมื่อคุณเปิดตำแหน่งการค้า เส้นระดับราคาเป้าหมายต่างๆ จะถูกสร้างขึ้นรอบราคาของสินทรัพย์ ในแต่ละจุด Tick ที่เกิดขึ้นมานั้นเส้นระดับราคาเป้าหมายบนและล่างจะถูกคำนวณอัตโนมัติโดยอิงตามสินทรัพย์และค่า Accumulator ที่คุณเลือก คุณจะทำกำไรได้หากคุณปิดตำแหน่งก่อนที่ราคาสินทรัพย์จะแตะเส้นระดับราคาเป้าหมายอันใดอันหนึ่ง", "-1907770956": "ตราบใดที่การเปลี่ยนแปลงราคาสำหรับแต่ละจุด Tick แสดงราคานั้นอยู่ภายในช่วงเส้นระดับราคาเป้าหมาย เงินผลตอบแทนของคุณจะเพิ่มขึ้นในทุกๆ จุด Tick ที่เกิดขึ้นโดยขึ้นอยู่กับค่า Accumulator ที่คุณเลือกไว้", "-997670083": "จำนวนจุด Tick สูงสุด", @@ -3503,9 +3507,11 @@ "-194424366": "ด้านบน", "-1527492178": "ล็อกการซื้อ", "-725375562": "คุณสามารถล็อก/ปลดล็อกปุ่มซื้อได้จากเมนูการตั้งค่า", - "-601992465": "ค่า Accumulator", - "-30171993": "เงินทุนทรัพย์ของคุณจะเติบโต {{growth_rate}}% ในทุกจุด Tick ที่เกิดขึ้นตั้งแต่จุด Tick อันที่สอง ตราบใดที่ราคายังคงอยู่ในช่วง ±{{tick_size_barrier}} จากราคาของจุด Tick อันก่อนหน้า", + "-2131851017": "อัตราการเติบโต", "-1358367903": "ทุนทรัพย์", + "-542594338": "ยอดเงินที่ได้รับสูงสุด", + "-690963898": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติหากว่าจำนวนเงินผลตอบแทนของคุณได้มาถึงจำนวนนี้", + "-511541916": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติเมื่อถึงจำนวนจุด Tick นี้", "-1918235233": "เงินทุนทรัพย์ขั้นต่ำสุด", "-1935239381": "เงินทุนทรัพย์ขั้นสูงสุด", "-1930565757": "เงินทุนทรัพย์ที่ลงไปของคุณนั้นคือค่าพรีเมี่ยมที่จ่ายไปครั้งเดียวและไม่สามารถเรียกคืนเงินได้เพื่อที่จะซื้อสัญญานี้ ผลรวมกำไร/ขาดทุนทั้งหมดของคุณเท่ากับมูลค่าสัญญาลบด้วยเงินทุนทรัพย์ที่ลงไปของคุณ", @@ -3520,14 +3526,13 @@ "-2131859340": "ตัวยุติการซื้อขาย <0/>", "-1686280757": "<0>{{commission_percentage}}% ของ (<1/> * {{multiplier}})", "-1043117679": "เมื่อการขาดทุนปัจจุบันของคุณนั้นเท่ากับหรือเกินกว่า {{stop_out_percentage}}% ของเงินทุนทรัพย์ของคุณ สัญญาการค้าของคุณจะถูกปิดที่จุดราคาสินทรัพย์ที่อยู่ใกล้ที่สุด", - "-477998532": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติ เมื่อการขาดทุนของคุณมีมากกว่าหรือเท่ากับจำนวนนี้", - "-2008947191": "สัญญาของคุณจะถูกปิดโดยอัตโนมัติเมื่อผลกำไรของคุณมีมากกว่าหรือเท่ากับจำนวนเงินนี้", "-339236213": "ตัวคูณ", "-857660728": "ราคาใช้สิทธิ", "-119134980": "<0>{{trade_type}}: คุณจะได้รับเงินผลตอบแทนถ้าราคาตลาด {{payout_status}} ราคานี้ <0>ณ เวลาหมดอายุ มิฉะนั้นเงินผลตอบแทนของคุณจะเป็นศูนย์", "-243332856": "สถิติเลขหลักสุดท้ายของจุด Tick จำนวน 1000 จุดล่าสุดสำหรับ {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: คุณจะได้รับเงินผลตอบแทนหากตลาด {{payout_status}} ราคานี้ <0>ณ เวลาหมดอายุ มิฉะนั้นเงินผลตอบแทนของคุณจะเป็นศูนย์", "-347156282": "โปรดส่งหลักฐาน", + "-1738427539": "ซื้อ", "-461955353": "ราคาซื้อ", "-172348735": "กำไร", "-1624674721": "ประเภทของสัญญา", diff --git a/packages/translations/src/translations/tr.json b/packages/translations/src/translations/tr.json index 392be3d1b96b..925bbcde1585 100644 --- a/packages/translations/src/translations/tr.json +++ b/packages/translations/src/translations/tr.json @@ -317,7 +317,6 @@ "379523479": "Fon kaybını önlemek için, tokenleri Yönetici alanında yetkisiz taraflarla paylaşmayın.", "380606668": "tik", "380694312": "Maksimum ardışık işlemler", - "382781785": "Kazancınız bu miktardan fazla veya bu miktara eşit olduğunda sözleşmeniz otomatik olarak kapatılır.", "384303768": "Bu blok, son mum siyahsa \"Doğru\" olarak döner. Ticari parametreler kök bloğu hariç kanvas üzerinde herhangi bir yere yerleştirilebilir.", "386191140": "CFD işlem hesapları veya Opsiyonlar ve Çarpanlar hesapları arasında seçim yapabilirsiniz", "386278304": "{{platform_name_trader}} web uygulamasını yükle", @@ -371,6 +370,7 @@ "437904704": "Maksimum açık pozisyonlar", "438067535": "500.000 dolardan fazla", "442520703": "250,001 - 500,000$", + "443203714": "Kaybınız bu tutara ulaşırsa sözleşmeniz otomatik olarak kapatılacaktır.", "443559872": "Finansal SVG", "444484637": "Mantık olumsuzlama", "445419365": "1-2 yıl", @@ -455,6 +455,7 @@ "545476424": "Toplam para çekme işlemleri", "546534357": "\"Anlaşma iptali\"ni seçerseniz, piyasanın aleyhinize hareket etmesi durumunda, seçtiğiniz bir zaman dilimi içinde işleminizi iptal edebileceksiniz. Bunun için küçük bir ücret talep edeceğiz, ancak kar veya zarar etmeden bahis tutarınızı size iade edeceğiz. Anlaşma iptali sona ermeden önce durdurma tutarına ulaşılırsa, pozisyonunuz otomatik olarak iptal edilir, ve kar veya zarar etmeden bahis tutarınızı size iade edeceğiz. \"Anlaşma iptali\" etkinken:", "549479175": "Deriv Çarpanları", + "550589723": "Mevcut spot fiyat önceki spot fiyattan ±{{tick_size_barrier}} içinde kaldığı sürece hisseniz tik başına {{growth_rate}}% oranında artacaktır.", "551569133": "İşlem limitleri hakkında daha fazla bilgi edinin", "554135844": "Düzenle", "554410233": "Bu bir top-10 ortak parolasıdır", @@ -524,6 +525,7 @@ "627814558": "Bir koşul doğru olduğunda bu blok bir değer getirir. Bu bloğu yukarıdaki fonksiyon bloklarının herhangi birinde kullanın.", "628193133": "Hesap Kimliği", "629145209": "\"VE\" işlemi seçilme durumunda, blok yalnızca verilen değerlerin her ikisi de \"Doğru\" olduğunda \"Doğru\" olarak döner", + "629395043": "Tüm büyüme oranları", "632398049": "Bu blok, bir öğeye veya ifadeye boş bir değer atar.", "634219491": "Vergi kimlik numaranızı vermediniz. Bu bilgiler, yasal ve düzenleyici şartlar için gereklidir. Lütfen hesap ayarlarınızda <0>Kişisel bilgiler bölümüne gidin ve en son vergi kimlik numaranızı girin.", "636219628": "<0>c.herhangi bir anlaşma fırsatı bulunamazsa, şikayet DRC tarafından ele alınmak üzere karar aşamasına geçecektir.", @@ -619,7 +621,7 @@ "731382582": "BNB/USD", "734390964": "Yetersiz bakiye", "734881840": "yanlış", - "742469109": "Dengeyi sıfırla", + "742469109": "Bakiyeyi sıfırla", "742676532": "Forex, türetilmiş endeksler, kripto para birimleri ve yüksek kaldıraçlı emtialar üzerinde CFD ticareti yapın.", "744110277": "Bollinger Bands Array (BBA)", "745656178": "Sözleşmenizi piyasa fiyatı üzerinden satmak için bu bloğu kullanın.", @@ -674,6 +676,7 @@ "802438383": "Yeni adres kanıtı gerekli", "802556390": "saniye", "802989607": "XML dosyanızı buraya sürükleyin", + "803500173": "İlk bahis", "806165583": "Avustralya 200", "807499069": "Mali komisyon şikayetleri prosedürü", "808323704": "Test değişkenleri yapmak için \"Karşılaştır\" ve \"Mantık işlemi\" bloklarını da kullanabilirsiniz.", @@ -733,7 +736,7 @@ "869993298": "Minimum withdrawal", "872549975": "Bugün için {{number}} transfer hakkınız kaldı.", "872661442": "E-postayı <0>{{prev_email}} adresinden <1>{{changed_email}} olarak güncellemek istediğinize emin misiniz?", - "872721776": "2. XML dosyanızı seçin ve Seçmek.", + "872721776": "2. XML dosyanızı seçin ve Seç ögesine tıklayın.", "872817404": "Giriş Noktası Saati", "873166343": "1. \"Kayıt\" düzenli bir mesaj görüntüler.", "874461655": "Telefonunuzla QR kodunu tarayın", @@ -745,7 +748,7 @@ "881000060": "{{transaction_type_display_text}} {{currency}}", "885065431": "Bir Deriv hesabı edinin", "888274063": "İlçe/Şehir", - "888924866": "Aşağıdakiler için aşağıdaki girdileri kabul etmiyoruz:", + "888924866": "Şunlar için aşağıdaki girdileri kabul etmiyoruz:", "890299833": "Raporlara Git", "891337947": "Ülke seç", "892341141": "{{date_time}}: tarihinden itibaren işlem istatistikleriniz", @@ -766,11 +769,11 @@ "907680782": "Sahiplik doğrulaması kanıtı başarısız oldu", "910888293": "Çok fazla deneme", "912406629": "Şu adımları takip edin:", - "912967164": "Bilgisayarınızdan içe aktarma", + "912967164": "Bilgisayarınızdan içe aktar", "915735109": "{{platform_name}} platformuna dönün", "918447723": "Gerçek", "920125517": "Demo hesabı ekle", - "921901739": "- Hesabınıza bağlı bankanın hesap bilgileriniz", + "921901739": "- Hesabınıza bağlı bankadaki hesap bilgileriniz", "924046954": "Adınızı ve banka hesap numaranızı veya hesap bilgilerinizi gösteren bir belge yükleyin.", "926813068": "Sabit/Değişken", "929608744": "Para çekme işlemi yapamazsınız", @@ -810,7 +813,7 @@ "960201789": "3. Satış koşulları", "961178214": "Bir seferde yalnızca bir sözleşme satın alabilirsiniz", "961266215": "140+", - "961327418": "Benim bilgisayarım", + "961327418": "Bilgisayarım", "961692401": "Bot", "966457287": "{{ variable }} değerini Üstel Hareket Ortalaması {{ dummy }} olarak ayarlayın", "968576099": "Up/Down", @@ -821,7 +824,7 @@ "975950139": "İkamet edilen ülke", "977929335": "Hesap ayarlarıma git", "981138557": "Yeniden yönlendir", - "981568830": "Tarihine kadar kendinizi web sitemizden ticaret yapmaya dışlamayı seçtiniz {{exclude_until}}. Eğer kendini-dışlama sürenizden sonra bir ticaret veya para yatırma işlemi yapamazsanız, lütfen <0>canlı sohbet yoluyla bizimle iletişime geçin.", + "981568830": "{{exclude_until}} Tarihine kadar kendinizi web sitemizden ticaret yapmaya dışlamayı seçtiniz. Eğer kendini-dışlama sürenizden sonra bir ticaret veya para yatırma işlemi yapamazsanız, lütfen <0>canlı sohbet yoluyla bizimle iletişime geçin.", "981965437": "2FA uygulamanızı kullanarak aşağıdaki QR kodunu tarayın. <0>Authy veya <1>Google Authenticator kullanmanızı öneririz.", "982146443": "WhatsApp", "982402892": "Adresin ilk satırı", @@ -830,10 +833,10 @@ "987224688": "Son 12 ayda diğer finansal araçlarla kaç işlem yaptınız?", "988361781": "Henüz bir alım satım faaliyetiniz yok.", "988934465": "İstendiğinde, devam etmek için kamera erişimini etkinleştirmeniz gerekir", - "989021200": "Piyasa yönünü ve hareket boyutunu tahmin edin ve pozisyon açmak için “Ara” veya “Kur” u seçin.", + "989021200": "Piyasa yönünü ve hareket boyutunu tahmin edin ve pozisyon açmak için “Call” veya “Put”u seçin.", "990739582": "170+", "992294492": "Posta kodunuz geçersiz", - "992677950": "Diğer cihazlarda çıkış", + "992677950": "Diğer cihazlarda çıkış yapılıyor", "993827052": "Bu yetki alanını seçmeniz ile size bir Finansal STP hesabı verilecektir. İşlemleriniz doğrudan piyasaya gidecek ve daha sıkı spreadlere sahip olacak.", "995563717": "{{ boolean }} değil", "999008199": "metin", @@ -845,7 +848,7 @@ "1006664890": "Sessiz", "1009032439": "Tüm zamanlar", "1010198306": "Bu blok, dizeler ve sayılar içeren bir liste oluşturur.", - "1010337648": "Mülkiyet kanıtınızı doğrulayamadık.", + "1010337648": "Sahiplik kanıtınızı doğrulayamadık.", "1012102263": "Bu tarihe kadar hesabınızda oturum açamayacaksınız (bugünden itibaren 6 haftaya kadar).", "1015201500": "Süre ve bahis gibi ticari opsiyonlarınızı tanımlayın.", "1016220824": "Bu özelliği kullanmak için gerçek bir para hesabına geçmelisiniz.<0/>bunu <1>Hesap Değiştirici'den gerçek bir hesap seçerek yapabilirsiniz", @@ -871,7 +874,7 @@ "1032907147": "AUD/NZD", "1035506236": "Yeni bir parola seçin", "1035893169": "Sil", - "1036116144": "Bir varlığın gerçekte sahip olmadan fiyat hareketi hakkında spekülasyon yapın.", + "1036116144": "Bir varlığa gerçekte sahip olmadan fiyat hareketi hakkında tahminde bulunun.", "1036867749": "Sözleşme için istenen süre, bahis, tahmin ve/veya bariyer(ler) burada tanımlanır.", "1038575777": "Parolayı değiştir", "1039428638": "AB yönetmeliği", @@ -891,7 +894,7 @@ "1045782294": "Deriv parolanızı değiştirmek için <0>Parolayı değiştir düğmesini tıklayın.", "1047389068": "Gıda hizmetleri", "1047881477": "Ne yazık ki, tarayıcınız videoyu desteklemiyor.", - "1048687543": "Labuan Finansal Hizmetler Kurumu", + "1048687543": "Labuan Financial Services Authority", "1048947317": "Üzgünüz, bu uygulama {{clients_country}} içinde mevcut değildir.", "1049384824": "Rise", "1050128247": "I confirm that I have verified the payment agent’s transfer information.", @@ -914,7 +917,7 @@ "1065353420": "110+", "1065498209": "Yineleme (1)", "1066235879": "Para transferi, ikinci bir hesap oluşturmanızı gerektirecektir.", - "1066459293": "4.3. Şikayetinizi kabul etme", + "1066459293": "4.3. Şikayetinizin kabul edilmesi", "1069347258": "Kullandığınız doğrulama bağlantısı geçersiz veya süresi dolmuş. Lütfen yenisini isteyin.", "1069576070": "Satınalma kilidi", "1070624871": "Adres belgesi doğrulama durumunu denetle", @@ -928,8 +931,8 @@ "1082406746": "Lütfen en az {{min_stake}} bahis miktarı girin.", "1083781009": "Vergi kimlik numarası *", "1083826534": "Bloğu Etkinleştir", - "1086118495": "Trader merkezi", - "1088031284": "Grev:", + "1086118495": "Traders Hub", + "1088031284": "Strike:", "1088138125": "Tik {{current_tick}} - ", "1089085289": "Cep telefonu numarası", "1089436811": "Eğitimler", @@ -937,9 +940,9 @@ "1095295626": "<0>• Mali Hizmetler Hakemi, şikayetin kabul edilip edilemeyeceğini ve yasaya uygun olup olmadığını belirleyecektir..", "1096078516": "Belgelerinizi inceleyeceğiz ve 3 gün içinde durumunu size bildireceğiz.", "1096175323": "Bir Deriv hesabına ihtiyacınız olacak", - "1098147569": "Bir şirketin mallarını veya hisselerini satın alın.", + "1098147569": "Bir şirketin emtialarını veya hisselerini satın alın.", "1098622295": "\"i\" 1 değeriyle başlar ve her tekrarda 2 artırılır. Döngü, \"i\" 12 değerine ulaşana kadar tekrarlanır ve döngü sonlandırılır.", - "1099892929": "Botu Kaydet", + "1099892929": "Botu kaydet", "1100133959": "Ulusal Kimlik", "1100870148": "Hesap limitleri ve bunların nasıl uygulandıkları hakkında daha fazla bilgi için lütfen <0>Yardım Merkezi'ne gidin.", "1101560682": "deste", @@ -997,7 +1000,7 @@ "1158678321": "<0>b.Uyuşmazlık Çözüm Komitesi (DRC) Başkanı, gerekli tüm bilgileri almak ve soruşturma aşamasında şikayeti çözme şansı olup olmadığını görmek için 5 iş günü içinde hem sizinle hem de bizimle iletişime geçecektir.", "1160761178": "Çıkış noktası alt bariyere eşit veya bu değerin altında olduğunda ödeme yapılmaz.", "1161924555": "Lütfen bir opsiyon seçin", - "1163771266": "Üçüncü blok <0>isteğe bağlıdır. Sözleşmenizi süresi dolmadan satmak istiyorsanız bu bloğu kullanabilirsiniz.. Şimdilik, bloğu olduğu gibi bırakın. ", + "1163771266": "Üçüncü blok <0>optional. Sözleşmenizi süresi dolmadan satmak istiyorsanız bu bloğu kullanabilirsiniz.. Şimdilik, bloğu olduğu gibi bırakın. ", "1163836811": "Gayrimenkul", "1164773983": "Anlaşma iptali etkinken kar al ve/veya zarar durdur seçeneği kullanılamaz.", "1166128807": "Hesaplarınızdan birini seçin veya yeni bir kriptopara hesabı ekleyin", @@ -1021,7 +1024,7 @@ "1181396316": "Bu blok, belirli bir aralıktan rastgele bir sayı verir", "1181770592": "Satıştan elde edilen kâr/zarar", "1183007646": "- Sözleşme türü: Rise, Fall, Touch, No Touch, vb. sözleşme türünün adı.", - "1184968647": "Sözleşmenizi şimdi kapatın veya devam ettirin. Çalışmaya devam etmeye karar verirseniz, daha sonra kontrol edebilir ve kapatabilirsiniz. ", + "1184968647": "Sözleşmenizi şimdi kapatın veya devam ettirin. Çalışmasına devam etmeye karar verirseniz, daha sonra kontrol edebilir ve kapatabilirsiniz ", "1188316409": "To receive your funds, contact the payment agent with the details below", "1188980408": "5 dakika", "1189249001": "4.1. Şikayet olarak kabul edilen nedir?", @@ -1029,7 +1032,7 @@ "1191429031": "<0>{{platform_name_dxtrade}} şifrenizi değiştirmek için lütfen e-postadaki bağlantıya tıklayın.", "1191644656": "Piyasa yönünü tahmin edin ve bir pozisyonu açmak için “Up” veya “Down” seçeneklerinden birini seçin. Bir pozisyon açtığınızda bir komisyon talep edeceğiz.", "1195393249": "{{ notification_type }} bildirin: {{ notification_sound }} {{ input_message }} sesi ile", - "1196683606": "Türev MT5 CFD demo hesabı", + "1196683606": "Deriv MT5 CFD demo hesabı", "1197326289": "Artık platformlarımızın hiçbirinde dijital opsiyonları takas edemezsiniz. Ayrıca, Opsiyonlar hesabınıza para yatırma işlemi yapamazsınız.", "1198368641": "Göreceli Güç Endeksi (RSI)", "1199281499": "Son Basamaklar Listesi", @@ -1093,6 +1096,7 @@ "1264842111": "Gerçek ve demo hesaplar arasında geçiş yapabilirsiniz.", "1265704976": "", "1270581106": "\"No Touch\" seçeneğini seçerseniz, piyasa sözleşme süresi boyunca herhangi bir zamanda bariyere temas etmezse ödemeyi kazanırsınız.", + "1271461759": "Kârınız bu tutara ulaşırsa sözleşmeniz otomatik olarak kapatılacaktır.", "1272012156": "GBP/CHF", "1272337240": "Gün", "1272681097": "Saat", @@ -1104,11 +1108,11 @@ "1286094280": "Para çek", "1286507651": "Kimlik doğrulama ekranını kapat", "1288965214": "Pasaport", - "1289146554": "Britanya Virjin Adaları Finansal Hizmetler Komisyonu", + "1289146554": "British Virgin Islands Financial Services Commission", "1289646209": "Marjin call", "1290525720": "Örnek: ", "1291887623": "Dijital opsiyonlar işlem frekansı", - "1292188546": "Türev MT5 yatırımcı şifresini sıfırla", + "1292188546": "Deriv MT5 yatırımcı şifresini sıfırla", "1292891860": "Telegram'a Bildir", "1293660048": "Günlük maks. toplam kayıp", "1294756261": "Bu blok, herhangi bir zamanda yürütülebilecek bir talimat grubu olan bir fonksiyon yaratır. Stratejinizde ihtiyaç duyduğunuz her türlü eylemi gerçekleştirmek için diğer blokları buraya yerleştirin. Bir fonksiyondaki tüm talimatlar yerine getirildiğinde, botunuz stratejinizde kalan bloklarla devam edecektir. Seçtiğiniz bir isim vermek için \"bir şey yap\" alanına tıklayın. İşlevinize bir değer (adlandırılmış bir değişken olarak) göndermek için artı simgesine tıklayın.", @@ -1182,7 +1186,7 @@ "1360929368": "Bir Deriv hesabı ekle", "1362578283": "Yüksek", "1363060668": "Şu tarihten itibaren ticari istatistikleriniz:", - "1363645836": "Türetilmiş FX", + "1363645836": "Türev FX", "1363675688": "Süre, zorunlu bir alandır.", "1364958515": "Hisse senetleri", "1366244749": "Limitler", @@ -1222,7 +1226,7 @@ "1402208292": "Metin durumunu değiştir", "1403376207": "Bilgilerimi güncelle", "1405584799": "aralık ile: {{ candle_interval_type }}", - "1407191858": "dTrader", + "1407191858": "DTrader", "1408844944": "Bu bloğun işlevini genişletmek için artı simgesini tıklayın.", "1410320737": "Deriv MT5 panosuna gidin", "1412535872": "Bu blok ile son ticaretin sonucunu kontrol edebilirsiniz. Yalnızca \"Alım satım koşullarını yeniden başlat\" kök bloğuna yerleştirilebilir.", @@ -1245,7 +1249,7 @@ "1430396558": "5. Hata anında satın al/sat'ı yeniden başlatın", "1430632931": "Alım satım yapmak için, lütfen kim olduğunuzu ve nerede yaşadığınızı onaylayın.", "1433367863": "Üzgünüz, isteğiniz işlenirken bir hata oluştu.", - "1433468641": "Hizmetlerimizi tüm ülkelerde sunuyoruz, olanlar hariç hüküm ve koşullarımızda belirtilenler.", + "1433468641": "Hizmetlerimizi tüm ülkelerde sunuyoruz, hüküm ve koşullarımızda belirtilmiş olanlar hariç.", "1434382099": "Bir mesajla birlikte bir iletişim penceresi görüntüler", "1434976996": "Duyuru", "1435363248": "Bu blok, Unix Epoch'tan bu yana geçen saniye sayısını 2019-08-01 00:00:00 gibi bir tarih ve saat biçimine dönüştürür.", @@ -1265,14 +1269,14 @@ "1452260922": "Çok fazla başarısız deneme", "1452941569": "Bu engelleme, belirli bir saniye boyunca yürütmeyi geciktirir. Bu bloğun içine herhangi bir blok yerleştirebilirsiniz. Stratejinizdeki diğer blokların yürütülmesi, bu bloktaki talimatlar uygulanana kadar duraklatılır.", "1453317405": "Bu blok, hesabınızın bir sayı veya metin dizesi olarak bakiyesini verir.", - "1454406889": "Tekrarlama seçeneği olarak <0>kadar seçin.", + "1454406889": "Tekrarlama seçeneği olarak <0>until seçin.", "1454648764": "anlaşma referans kimliği", "1454865058": "ICO satın alma veya toplu satış ile bağlantılı bir adres girmeyin. Bunu yaparsanız, ICO token'ları hesabınıza aktarılmaz.", "1455741083": "Ehliyetinizin arka sayfasını yükleyin.", "1457341530": "Your proof of identity verification has failed", "1457603571": "Bildirim yok", - "1458160370": "{{platform_name}} {{account}} {{jurisdiction_shortcode}} hesap eklemek için {{platform}} şifrenizi girin.", - "1459761348": "Kimlik kanıtı gönderin", + "1458160370": "Bir {{platform_name}} {{account}} {{jurisdiction_shortcode}} hesabı eklemek için {{platform}} şifrenizi girin.", + "1459761348": "Kimlik kanıtı sunun", "1461323093": "Geliştirici konsolundaki mesajları görüntüler.", "1464190305": "Bu blok, botunuzu manuel olarak durdurmadan ve yeniden başlatmadan başka bir sözleşme satın almanızı sağlayan Satın Alma koşulları bloğuna geri aktaracaktır.", "1464253511": "{{deriv}} üzerindeki her bir kripto para birimi için zaten bir hesabınız var.", @@ -1298,7 +1302,7 @@ "1478030986": "Ticaret ve para çekme işlemleri için API belirteçleri oluştur veya sil", "1480915523": "Atla", "1481977420": "Lütfen para çekme isteğinizi doğrulamamıza yardımcı olun.", - "1483470662": "Hesabınızla işlem yapmaya başlamak için 'Aç'ı tıklayın", + "1483470662": "Hesabınızla işlem yapmaya başlamak için ‘Open’ ögesine tıklayın", "1484336612": "Bu blok, döngüyü sonlandırmak veya devam ettirmek için kullanılır ve bir döngü bloğunun içinde herhangi bir yere yerleştirilebilir.", "1487086154": "Belgeleriniz başarıyla gönderildi", "1488126519": "Botlarınız", @@ -1318,7 +1322,7 @@ "1503618738": "- Anlaşma referans kimliği: Sözleşme referans kimliği", "1505420815": "No payment agents found for your search", "1505898522": "Deste indir", - "1505927599": "Sunucularımız bir darbe vurdu. Devam etmek için yenileyelim.", + "1505927599": "Sunucularımız bir darbe aldı. Devam etmek için yenileyelim.", "1509570124": "{{buy_value}} (Satın Al)", "1509678193": "Eğitim", "1510075920": "Altın/USD", @@ -1328,13 +1332,13 @@ "1516537408": "Artık Deriv'de işlem yapamaz veya hesabınıza para yatıramazsınız.", "1516559721": "Lütfen sadece bir dosya seçin", "1516676261": "Para yatırma", - "1516834467": "İstediğiniz hesapları 'Al'", + "1516834467": "İstediğiniz hesapları 'Alın'", "1517503814": "Dosyayı bırakın veya yüklemek için buraya tıklayın", "1519124277": "Derived SVG", "1519891032": "Trader's Hub'a hoşgeldiniz", "1520332426": "Yıllık net gelir", "1524636363": "Kimlik doğrulama başarısız oldu", - "1526483456": "2. Değişkeniniz için bir ad girin, ve vur Oluşturmak. Yeni değişkeninizi içeren yeni bloklar aşağıda görünecektir.", + "1526483456": "2. Değişkeniniz için bir ad girin, ve Oluştur ögesine tıklayın. Yeni değişkeninizi içeren yeni bloklar aşağıda görünecektir.", "1527251898": "Başarısız", "1527906715": "Bu blok, verilen numarayı seçili değişkene ekler.", "1531017969": "Eklenen her öğenin metin değerini arada boşluk bırakmadan birleştirerek tek bir metin dizesi oluşturur. Öğe sayısı buna göre eklenebilir.", @@ -1343,9 +1347,9 @@ "1534796105": "Değişken değeri alır", "1537711064": "Kasiyere erişmeden önce hızlı bir kimlik doğrulaması yapmanız gerekir. Kimlik belgenizi göndermek için lütfen hesap ayarlarınıza gidin.", "1540585098": "Düşüş", - "1541508606": "CFD mi arıyorsunuz? Trader Merkezine Git", + "1541508606": "CFD'leri mi arıyorsunuz? Trader's Hub'a Gidin", "1541969455": "Her ikisi", - "1542742708": "Sentetikler, Forex, Hisse Senetleri, Hisse senetleri, Emtialar ve Kripto Para Birimleri", + "1542742708": "Sentetikler, Forex, Hisse Senetleri, Hisse senedi endeksleri, Emtialar ve Kripto Para Birimleri", "1544642951": "\"Only Ups\"ı seçerseniz, giriş noktasından sonra ardışık tikler art arda yükselirse ödemeyi kazanırsınız. Herhangi bir tik düşerse veya önceki tiklerden herhangi birine eşitse ödeme yapılmaz.", "1547148381": "Bu dosya çok büyük (sadece 8MB'a kadar izin verilir). Lütfen başka bir dosya yükleyin.", "1548765374": "Belge numarası doğrulanamadı", @@ -1368,23 +1372,23 @@ "1567745852": "Bot adı", "1569624004": "Uyarıyı kapat", "1570484627": "Tik listesi", - "1571303610": "3. Ticaret parametrelerinizi ayarlayın ve vurun Oluşturmak.", + "1571303610": "3. Ticaret parametrelerinizi ayarlayın ve Oluştur ögesine tıklayın.", "1571575776": "Kabul edilen formatlar: pdf, jpeg, jpg, ve png. Maksimum dosya boyutu: 8MB", "1572504270": "Yuvarlama işlemi", "1572982976": "Sunucu", - "1573429525": "Çağrı/Koymak", + "1573429525": "Call/Put", "1573533094": "Belgeniz doğrulama için beklemede.", "1575556189": "Ethereum blockchain'deki Tether, ERC20 token olarak, daha yeni bir taşıma katmanıdır ve bu da Tether'i Ethereum akıllı sözleşmelerde kullanıma sunmaktadır. Standart bir ERC20 token olarak, herhangi bir Ethereum adresine de gönderilebilir.", "1577480486": "Mobil bağlantınız bir saat içinde sona erecek", "1577527507": "Hesap açma nedeni gerekli.", "1577612026": "Bir klasör seçin", - "1579839386": "App store", + "1579839386": "Appstore", "1580498808": "Birden çok yüz bulundu", "1584109614": "Tikler Dizesi Listesi", "1584936297": "XML dosyası desteklenmeyen öğeler içeriyor. Lütfen dosyayı kontrol edin veya değiştirin.", "1585859194": "Deriv fiat ve {{platform_name_mt5}} hesaplarınız, Deriv fiat ve {{platform_name_derivez}} hesaplarınız ve Deriv fiat ve {{platform_name_dxtrade}} hesaplarınız arasındaki farklı para birimlerindeki transferler için %1 transfer ücreti alacağız.", "1587046102": "O ülkedeki belgeler şu anda desteklenmiyor — başka bir belge türü deneyin", - "1589148299": "Başlat", + "1589148299": "Start", "1589640950": "Bu sözleşmenin yeniden satışa sunulması sunulmamaktadır.", "1589702653": "Adres kanıtı", "1590400723": "Tüm hesaplarınızdaki toplam varlıklar", @@ -1402,7 +1406,7 @@ "1604916224": "Mutlak", "1605222432": "Ticaret konusunda hiçbir bilgim ve tecrübem yok.", "1605292429": "Maks. toplam kayıp", - "1611306795": "Botum nasıl?", + "1611306795": "Botum nasıl çalışıyor?", "1612105450": "Alt dize al", "1612638396": "İşleminizi belirli bir zaman dilimi içinde istediğiniz zaman iptal edin.", "1613633732": "Aralık 10-60 dakika arasında olmalıdır", @@ -1430,13 +1434,12 @@ "1641395634": "Son rakam listesi", "1641635657": "Yeni kimlik belgesi gerekiyor", "1641980662": "Selamlama gereklidir.", - "1642645912": "Tüm fiyatlar", - "1644703962": "CFD hesapları mı arıyorsunuz? Trader Merkezine Git", + "1644703962": "CFD hesapları mı arıyorsunuz? Trader's Hub'a Git", "1644864436": "Profesyonel bir müşteri olma talebinde bulunmadan önce hesabınızın kimliğini doğrulamanız gerekir. <0>hesabımın kimliğini doğrulayın", "1644908559": "Rakam kodu gereklidir.", "1647186767": "Bot çalışırken bir hatayla karşılaştı.", "1648938920": "Hollanda 25", - "1649239667": "2. Altında Bloklar menüsü, kategorilerin bir listesini göreceksiniz. Bloklar bu kategoriler içinde gruplandırılmıştır. İstediğiniz bloğu seçin ve bunları çalışma alanına sürükleyin.", + "1649239667": "2. Bloklar menüsü altında, kategorilerin bir listesini göreceksiniz. Bloklar bu kategoriler içinde gruplandırılmıştır. İstediğiniz bloğu seçin ve bunları çalışma alanına sürükleyin.", "1651513020": "Her bir aralık için kalan süreyi göster", "1651951220": "\"abcabcabc\" gibi tekrarların tahmin edilmesi \"abc\"den biraz daha zordur", "1652366857": "alın ve kaldırın", @@ -1451,7 +1454,7 @@ "1656155124": "<0/> saniye içinde yeniden gönder", "1658954996": "Tesis ve Makine Operatörleri ve Montajcılar", "1659074761": "Reset Put", - "1659352235": "Add your Deriv MT5 CFDs account under Deriv Investments (Europe) Limited regulated by the Malta Financial Services Authority (MFSA) (licence no. IS/70156).", + "1659352235": "Deriv MT5 CFD hesabınızı, Malta Financial Services Authority (MFSA) tarafından düzenlenen Deriv Investments (Europe) Limited altına ekleyin (licence no. IS/70156).", "1665272539": "Unutmayın: Seçilen tarihe kadar hesabınızda oturum açamazsınız.", "1665738338": "Bakiye", "1665756261": "Canlı sohbete git", @@ -1459,16 +1462,16 @@ "1670016002": "Çarpan: {{ multiplier }}", "1670426231": "Bitiş zamanı", "1671232191": "Aşağıdaki limitleri ayarladınız:", - "1674163852": "Sözleşmenizin sona ermesini süreyi veya bitiş saatini belirleyerek belirleyebilirsiniz..", + "1674163852": "Sözleşmenizin sona ermesini süreyi veya bitiş saatini belirleyerek belirleyebilirsiniz.", "1675030608": "Bu hesabı oluşturmak için önce adres kanıtınızı yeniden göndermeniz gerekiyor.", - "1675289747": "Gerçek hesaba geçti", + "1675289747": "Gerçek hesaba geçildi", "1677027187": "Forex", "1677990284": "Uygulamalarım", "1679743486": "1. Hızlı strateji ögesine gidin ve istediğiniz stratejiyi seçin.", "1680666439": "Adınızı, hesap numaranızı ve işlem geçmişinizi gösteren banka ekstrenizi yükleyin.", "1682409128": "Adsız Strateji", "1682636566": "E-postayı yeniden gönder", - "1683522174": "Kontör", + "1683522174": "Doldur", "1683963454": "Sözleşmeniz, {{timestamp}} saat ve {{date}} tarihinde bir sonraki mevcut varlık fiyatı üzerinden otomatik olarak kapatılacaktır.", "1684419981": "Bu nedir?", "1686800117": "{{error_msg}}", @@ -1477,17 +1480,17 @@ "1689258195": "Sunmuş olduğunuz bilgilerle adresinizi doğrulayamadık. Lütfen kontrol edin ve yeniden gönderin veya farklı bir belge türü seçin.", "1691335819": "Bizimle ticaret yapmaya devam etmek için lütfen kim olduğunuzu onaylayın.", "1691765860": "- Olumsuzluk", - "1692912479": "Türev MT5, Türev X", + "1692912479": "Deriv MT5, Deriv X", "1693614409": "Başlangıç zamanı", "1694331708": "İstediğiniz zaman CFD'ler, dijital seçenekler ve çarpanlar arasında geçiş yapabilirsiniz.", "1694517345": "Yeni bir e-posta adresi girin", - "1698624570": "2. Hit Tamam onaylamak için.", + "1698624570": "2. Onaylamak için Ok ögesine tıklayın.", "1700233813": "{{selected_value}} konumundan aktarıma izin verilmiyor. Lütfen açılır listeden başka bir hesap seçin", "1701447705": "Lütfen adresinizi güncelleyin", - "1703091957": "Kara para aklama ile mücadele mevzuatının gerektirdiği şekilde, durum tespiti yükümlülüklerimizin bir parçası olarak istihdamınız hakkında bilgi topluyoruz.", + "1703091957": "Kara para aklama ile mücadele mevzuatının gerektirdiği şekilde, gerekli olan önlem yükümlülüklerimizin bir parçası olarak istihdamınız hakkında bilgi topluyoruz.", "1704656659": "CFD ticaretinde ne kadar deneyiminiz var?", "1708413635": "{{currency_name}} ({{currency}}) hesabınız için", - "1709401095": "Finansal piyasalar ve Türetilmiş endekslerimizle Deriv X üzerinde CFD ticareti yapın.", + "1709401095": "Finansal piyasalar ve Türev endekslerimizle Deriv X üzerinde CFD ticareti yapın.", "1709859601": "Çıkış Noktası Zamanı", "1710662619": "Uygulamaya sahipseniz, ticarete başlamak için başlatın.", "1711013665": "Beklenen hesap cirosu", @@ -1517,16 +1520,16 @@ "1734264460": "Yasal Uyarı", "1736292549": "Posta kodunu güncelle", "1737352280": "Bot.init çağrılmaz", - "1738094481": "<0>Süre: Keneler 1", + "1738094481": "<0>Süre: Tikler 1", "1738681493": "Gerekirse gözlüklerinizi çıkarın", - "1739086943": "Wall Street", + "1739086943": "Wall Street 30", "1739384082": "İşsiz", "1739668049": "Hesabınızı kapatın", "1740371444": "Temel piyasa seçilmedi", "1742256256": "Lütfen aşağıdaki belgelerden birini yükleyin:", "1743448290": "Ödeme acenteleri", "1743902050": "Finansal değerlendirmenizi tamamlayın", - "1744509610": "XML dosyasını bilgisayarınızdan çalışma alanına sürüklemeniz yeterlidir ve botunuz buna göre yüklenecektir. Alternatif olarak, vurabilirsin İçe Aktar içinde Bot Oluşturucu, ve botunuzu bilgisayarınızdan veya Google Drive\"ınızdan içe aktarmayı seçin.", + "1744509610": "XML dosyasını bilgisayarınızdan çalışma alanına sürüklemeniz yeterlidir ve botunuz buna göre yüklenecektir. Alternatif olarak, Bot Builder içinde Import ögesine tıklayabilir, ve botunuzu bilgisayarınızdan veya Google Drive\"ınızdan içe aktarmayı seçebilirsiniz.", "1745523557": "- Kare kök", "1746051371": "Uygulamayı indirin", "1746273643": "Moving Average Convergence Divergence", @@ -1561,7 +1564,7 @@ "1779519903": "Geçerli bir sayı olmalıdır.", "1780442963": "İndirmek için QR kodunu tarayın {{ platform }}.", "1780770384": "Bu blok size 0.0 ile 1.0 arasında rastgele bir fraksiyon verir.", - "1781393492": "Deriv fiatınız ile {{platform_name_mt5}} hesaplarınız, Deriv fiatınız ve {{platform_name_derivez}} hesaplarınız ve Deriv fiatınız ve {{platform_name_dxtrade}} hesaplarınız arasındaki aynı para birimindeki transferler için transfer ücreti almayız.", + "1781393492": "Deriv fiat hesabınız ile {{platform_name_mt5}} hesaplarınız, Deriv fiat hesabınız ve {{platform_name_derivez}} hesaplarınız ve Deriv fiat hesabınız ve {{platform_name_dxtrade}} hesaplarınız arasındaki aynı para birimindeki transferler için transfer ücreti almıyoruz.", "1782308283": "Hızlı strateji", "1782395995": "Son Basamak Tahmini", "1782690282": "Bloklar menüsü", @@ -1570,9 +1573,9 @@ "1783740125": "Selfie'nizi yükleyin", "1787135187": "Posta kodu gerekli", "1787492950": "Grafik sekmesindeki göstergeler yalnızca gösterge amaçlıdır ve {{platform_name_dbot}} çalışma alanındakilerden biraz farklı olabilir.", - "1788515547": "<0/>Finansal Hizmetler Hakem Ofisine şikayette bulunma hakkında daha fazla bilgi için, lütfen <1>onların rehberliğine bakın.", + "1788515547": "<0/>Finansal Hizmetler Hakem Ofisine şikayette bulunma hakkında daha fazla bilgi için, lütfen <1>rehberliklerini görün..", "1788966083": "01-07-1999", - "1789273878": "Puan başına ödeme", + "1789273878": "Nokta başına ödeme", "1789497185": "Pasaport ayrıntılarınızın bulanıklık veya parlama olmadan okunabildiğinden emin olun", "1790770969": "FX - majörler (standart/mikro lotlar), FX - minörler, Emtia, Kripto para birimleri", "1791017883": "Bu <0>kullanım kılavuzuna göz atın.", @@ -1588,6 +1591,7 @@ "1803338729": "Ne tür bir sözleşme ticareti yapmak istediğinizi seçin. Örneğin, Rise/Fall ticaret türü için üç seçenekden birini seçebilirsiniz: Rise, Fall veya her İkisi. Seçili seçenek, Satın Alma bloğu için kullanılabilir seçenekleri belirler.", "1804620701": "Bitiş", "1804789128": "{{display_value}} Tikleri", + "1806017862": "Maks. tikler", "1806355993": "Komisyon yok", "1806503050": "Bazı ödeme yöntemlerinin ülkenizde kullanılamayabileceğini lütfen unutmayın.", "1808058682": "Bloklar başarıyla yüklendi", @@ -1602,7 +1606,7 @@ "1813700208": "Boom 300 Endeksi", "1813958354": "Yorumu kaldır", "1815034361": "alfabetik", - "1815905959": "DTrader, DBot, SmartTrader ve İkili Bot", + "1815905959": "DTrader, DBot, SmartTrader ve Binary Bot", "1815995250": "Satın alma sözleşmesi", "1816126006": "Hepsi bir arada FX ve CFD platformu olan Deriv MT5 ({{platform_name_dmt5}}) üzerinde ticaret yapın.", "1817154864": "Bu blok, belirli bir aralıktan rastgele bir sayı verir.", @@ -1611,7 +1615,7 @@ "1821818748": "Sürücü Belgesi Referans numarasını girin", "1823177196": "En popüler", "1824193700": "Bu blok size en son tik değerinin son basamağını verir.", - "1824292864": "Aramak", + "1824292864": "Call", "1827607208": "Dosya yüklenmedi.", "1828370654": "Onboarding", "1830520348": "{{platform_name_dxtrade}} Parolası", @@ -1647,9 +1651,9 @@ "1856485118": "Please <0>resubmit your proof of address to transfer funds between MT5 and Deriv accounts.", "1858251701": "dakika", "1859308030": "Geri bildirim ver", - "1862182694": "Otomatik ticarette en yaygın kullanılan stratejilerden üçü Martingale, D'Alembert ve Oscar's Grind'dir - hepsini hazır ve DBot'ta sizi bekleyen bulabilirsiniz.", + "1862182694": "Otomatik ticarette en yaygın kullanılan stratejilerden üçü Martingale, D'Alembert ve Oscar's Grind'dir — hepsini hazır hale gelmiş ve DBot'ta sizi bekliyor olarak bulabilirsiniz.", "1863053247": "Lütfen kimlik belgenizi yükleyin.", - "1863694618": "MT5'te forex, hisse senetleri, hisse senedi endeksleri, emtialar ve kripto para birimleri ile CFD ticareti yapın.", + "1863694618": "Forex, hisse senedi, hisse senedi endeksleri, emtialar ve kripto para birimleri ile MT5 üzerinde CFD ticareti yapın.", "1863731653": "To receive your funds, contact the payment agent", "1866811212": "Ülkenizdeki yetkili, bağımsız bir ödeme aracısı aracılığıyla yerel para biriminize para yatırın.", "1866836018": "<0/><1/>şikayetiniz veri işleme uygulamalarımızla ilgiliyse, yerel denetim yetkilinize resmi bir şikayet sunabilirsiniz.", @@ -1672,7 +1676,7 @@ "1877832150": "uçtan #", "1879042430": "Uygunluk Testi, UYARI:", "1879412976": "Kar miktarı: <0>{{profit}}", - "1879463662": "Minimum depozito değeri {{minimum_deposit}} {{currency}} gereklidir. Aksi takdirde, fonlar kaybolur ve geri alınamaz.", + "1879463662": "Minimum depozito değeri olan {{minimum_deposit}} {{currency}} gereklidir. Aksi takdirde, fonlar kaybolacak ve geri alınamaz.", "1879651964": "<0>Bekleyen doğrulama", "1880029566": "Avustralya doları", "1880097605": "{{ input_text }} mesajı ile birlikte {{ string_or_number }} için komut iste", @@ -1728,7 +1732,7 @@ "1930899934": "Tether", "1931659123": "Her tik'de çalıştır", "1931884033": "Belgedeki doğum tarihiniz Deriv profilinizle aynı değil gibi görünüyor. Bu sorunu çözmek için lütfen <0>Kişisel bilgiler sayfasından doğum tarihinizi güncelleyin.", - "1934450653": "<0>Sözleşme türü için, İkisine de ayarlayın.", + "1934450653": "<0>Sözleşme türü için, \"Both\" olarak ayarlayın.", "1939014728": "Çalışma alanındaki blokları nasıl kaldırabilirim?", "1939902659": "Sinyal", "1940408545": "Bu tokeni sil", @@ -1997,10 +2001,10 @@ "-1314683258": "Garantili bir kar için uzun vadeli bir yatırım yapın.", "-1546090184": "Kaldıraç CFD ticaretini nasıl etkiler?", "-1636427115": "Kaldıraç riski azaltmaya yardımcı olur.", - "-800221491": "Kaldıraç karları garanti eder.", + "-800221491": "Kaldıraç kazancı garanti eder.", "-811839563": "Kaldıraç, ticari değerin bir kısmı için büyük pozisyonlar açmanıza olanak tanır, bu da kar veya zararın artmasına neden olabilir.", - "-1185193552": "Yeterli piyasa likiditesi olduğu sürece, kayıp belirli bir miktara eşit veya daha fazla olduğunda işleminizi otomatik olarak kapatın.", - "-1046354": "Yeterli piyasa likiditesi olduğu sürece, kâr belirli bir miktara eşit veya daha fazla olduğunda işleminizi otomatik olarak kapatın.", + "-1185193552": "Yeterli piyasa likiditesi olduğu sürece, kayıp belirli bir miktara eşit veya daha fazla olduğunda işleminizi otomatik olarak kapatır.", + "-1046354": "Yeterli piyasa likiditesi olduğu sürece, kâr belirli bir miktara eşit veya daha fazla olduğunda işleminizi otomatik olarak kapatır.", "-1842858448": "Ticaretinizde garantili bir kar elde edin.", "-860053164": "Çarpanları ticareti yaparken.", "-1250327770": "Bir şirketin hisselerini satın alırken.", @@ -2112,9 +2116,9 @@ "-1286823855": "Adınızı ve telefon numaranızı gösteren mobil fatura ekstrenizi yükleyin.", "-1309548471": "Adınızı ve hesap bilgilerinizi gösteren banka ekstrenizi yükleyin.", "-1410396115": "Adınızı ve kart numaranızın ilk altı ve son dört hanesini gösteren bir fotoğraf yükleyin. Kart adınızı göstermiyorsa, işlem geçmişinde adınızı ve kart numaranızı gösteren banka ekstresini yükleyin.", - "-3805155": "İşlemi işlemek için aşağıdakilerden birinin ekran görüntüsünü yükleyin:", + "-3805155": "Yapılan işlemi işlemek için aşağıdakilerden birinin ekran görüntüsünü yükleyin:", "-1523487566": "- web sitesindeki hesap profili bölümünüz", - "-613062596": "- uygulamadaki Hesap Bilgileri sayfası", + "-613062596": "- Uygulamadaki Hesap Bilgileri sayfası", "-1718304498": "Kullanıcı Kimliği", "-609424336": "Web sitesindeki hesabınızın uygulama veya profil bölümünün kişisel bilgiler bölümünden adınızın, hesap numaranızın ve e-posta adresinizin ekran görüntüsünü yükleyin.", "-1954436643": "Kullanıcı adınızın ekran görüntüsünü <0>https://onlinenaira.com/members/index.htm adresindeki Genel Bilgiler sayfasına yükleyin.", @@ -2154,7 +2158,7 @@ "-705047643": "Üzgünüz, bir hata oluştu. Lütfen başka bir dosya seçin.", "-1664309884": "Yüklemek için buraya basın", "-987011273": "Sahiplik kanıtınız gerekli değildir.", - "-808299796": "Şu anda sahiplik kanıtı sunmanız gerekmiyor. Gelecekte mülkiyet kanıtı gerekip gerekmediğini size bildireceğiz.", + "-808299796": "Şu anda sahiplik kanıtı sunmanız gerekmiyor. Gelecekte sahiplik kanıtı gerekip gerekmediğini size bildireceğiz.", "-179726573": "Sahiplik kanıtınızı aldık.", "-813779897": "Sahiplik doğrulaması kanıtı geçti.", "-638756912": "Banka/kredi kartınızın ön tarafında gösterilen kart numarasının 7-12'ini karartın.", @@ -2188,7 +2192,7 @@ "-179005984": "Kaydet", "-307865807": "Risk Tolerans Uyarısı", "-690100729": "Evet, riski anlıyorum.", - "-2010628430": "CFD'ler ve diğer finansal araçlar, kaldıraç nedeniyle hızla para kaybetme riski yüksektir. CFD'lerin ve diğer finansal araçların nasıl çalıştığını ve paranızı kaybetme riskinin yüksek olup olmadığını anlayıp anlamayacağınızı düşünmelisiniz. devam<0/><0/> etmek için sermayenizin risk altında olduğunu anladığınızı onaylamanız gerekir.", + "-2010628430": "CFD'ler ve diğer finansal araçlar, kaldıraç nedeniyle hızla para kaybetme riski yüksektir. CFD'lerin ve diğer finansal araçların nasıl çalıştığını ve paranızı kaybetme riskinin yüksek olup olmadığını anlayıp anlamayacağınızı düşünmelisiniz. <0/><0/> Devam etmek için, sermayenizin risk altında olduğunu anladığınızı onaylamanız gerekir.", "-863770104": "Lütfen “Tamam” ı tıklayarak, kendinizi risklere maruz bırakıyor olabilirsiniz. Bu riskleri doğru bir şekilde değerlendirecek veya azaltacak bilgi veya deneyime sahip olmayabilirsiniz., önemli olabilir, yatırım yaptığınız meblağın tamamını kaybetme riski dahil.", "-1292808093": "Ticaret Deneyimi", "-884768257": "0-35 karakter girmelisiniz.", @@ -2244,7 +2248,7 @@ "-80717068": "Apps you have linked to your <0>Deriv password:", "-2143208677": "Click the <0>Change password button to change your Deriv MT5 password.", "-9570380": "Kullan {{platform_name_dxtrade}} giriş yapmak için şifre {{platform_name_dxtrade}} web ve mobil uygulamalardaki hesaplar.", - "-2131200819": "Devre dışı", + "-2131200819": "Devre dışı bırak", "-200487676": "Etkinleştir", "-1840392236": "Bu doğru kod değil. Lütfen tekrar deneyin.", "-2067796458": "Kimlik doğrulama kodu", @@ -2339,7 +2343,7 @@ "-38915613": "Kaydedilmemiş değişiklikler", "-2137450250": "Kaydedilmemiş değişiklikleriniz var. Değişiklikleri iptal etmek ve bu sayfadan çıkmak istediğinizden emin misiniz?", "-1067082004": "Ayarlardan Çık", - "-1982432743": "Görünüşe göre belgenizdeki adres, adresle eşleşmiyor\n Deriv profilinizde. Lütfen kişisel bilgilerinizi şimdi\n Doğru adres.", + "-1982432743": "Görünüşe göre belgenizdeki adres, adresle eşleşmiyor\n Deriv profilinizde bulunan. Lütfen kişisel bilgilerinizi şimdi güncelleyin\n doğru adres ile.", "-1451334536": "Alım satım işlemine devam et", "-1525879032": "Adres kanıtı belgelerinizin süresi doldu. Lütfen tekrar gönderin.", "-1425489838": "Adres doğrulama belgesi gerekli değil", @@ -2419,9 +2423,9 @@ "-30772747": "Kişisel bilgileriniz başarıyla kaydedildi.", "-1107320163": "Kodlama gerekmeyecek şekilde işlem yapma sürecini otomatikleştirin.", "-829643221": "Çarpanlar ticaret platformu.", - "-1585707873": "Mali Komisyon", + "-1585707873": "Finansal Komisyon", "-199154602": "Vanuatu Finansal Hizmetler Komisyonu", - "-191165775": "Malta Finansal Hizmetler Kurumu", + "-191165775": "Malta Financial Services Authority", "-194969520": "Karşı taraf şirketi", "-1089385344": "Deriv (SVG) LLC", "-2019617323": "Deriv (BVI) Ltd", @@ -2434,52 +2438,52 @@ "-362324454": "Emtialar", "-1071336803": "Platform", "-820028470": "Opsiyonlar & Çarpanlar", - "-1018945969": "TüccarsHub", + "-1018945969": "TradersHub", "-1856204727": "Sıfırla", "-213142918": "Para yatırma ve çekme işlemleri geçici olarak kullanılamıyor ", "-224804428": "İşlemler", "-1186807402": "Transfer", "-1308346982": "Derived", - "-1145604233": "Gerçek dünya piyasa hareketlerini simüle eden türetilmiş endekslerle MT5'te CFD ticareti yapın.", + "-1145604233": "Gerçek dünya piyasa hareketlerini simüle eden türev endekslerle MT5'te CFD ticareti yapın.", "-328128497": "Finansal", "-1484404784": "Forex, hisse senedi endeksleri, emtialar ve kripto para birimleri ile MT5'te CFD ticareti yapın.", "-659955365": "Swap-Free", - "-133406819": "Sentetikler, forex, hisse senetleri, hisse senetleri, hisse senedi endeksleri, kripto para birimleri ve ETF'lerle MT5'te takas içermeyen CFD ticareti yapın.", + "-133406819": "Sentetikler, forex, hisse senetleri, hisse senedi endeksleri, kripto para birimleri ve ETF'lerle MT5'te swap-free CFD ticareti yapın.", "-1210359945": "Hesaplarınıza para aktarın", "-81256466": "Bir CFD hesabı oluşturmak için bir Deriv hesabına ihtiyacınız var.", - "-699372497": "Başarılı işlemlerde daha iyi getiri elde etmek için kaldıraç ve sıkı spreadlerle ticaret <0>yapın.", - "-1884966862": "Farklı tür ve yargı yetkisine sahip daha fazla Deriv MT5 hesabı edinin.", + "-699372497": "Başarılı işlemlerde daha iyi getiri elde etmek için kaldıraç ve sıkı spreadlerle ticaret yapın. <0>Daha fazla bilgi edin", + "-1884966862": "Farklı tür ve yetki alanına sahip daha fazla Deriv MT5 hesabı edinin.", "-596618970": "Diğer CFD'ler", - "-982095728": "Almak", + "-982095728": "Edin", "-1277942366": "Toplam varlıklar", "-1255879419": "Trader's Hub", "-493788773": "AB Dışı", "-673837884": "AB", - "-230566990": "Gönderdiğiniz aşağıdaki belgeler çeklerimizi geçmedi:", + "-230566990": "Gönderdiğiniz aşağıdaki belgeler kontrollerimizi geçmedi:", "-846812148": "Adres kanıtı.", "-2055865877": "AB dışı yönetmelik", "-643108528": "AB dışı ve AB yönetmeliği", "-172898036": "CR5236585", "-1665192032": "Çarpanlar hesabı", "-744999940": "Deriv hesabı", - "-1638358352": "<0>Multipliers ile ilk hissenizden daha fazlasını riske atmadan CFD'lerin üst tarafını elde edin.", + "-1638358352": "<0>Çarpanlar ile ilk bahisinizden daha fazlasını riske atmadan CFD'lerin avantajını elde edin.", "-749129977": "Gerçek bir Deriv hesabı edinin, ticarete başlayın ve paranızı yönetin.", - "-1814994113": "CFD'leri <0>{{compare_accounts_title}}", - "-318106501": "Sentetikler, sepetler ve türetilmiş FX ile MT5 üzerinde CFD ticareti yapın.", + "-1814994113": "CFD'ler <0>{{compare_accounts_title}}", + "-318106501": "Sentetikler, sepetler ve türev FX ile MT5 üzerinde CFD ticareti yapın.", "-1328701106": "MT5'te forex, hisse senetleri, hisse senedi endeksleri, sentetikler, kripto para birimleri ve emtialar ile CFD ticareti yapın.", - "-2146691203": "Yönetmelik seçimi", - "-249184528": "AB veya AB dışı düzenlemeler kapsamında gerçek hesaplar oluşturabilirsiniz. <0>Bu hesaplar hakkında daha fazla bilgi edinmek için<0/> simgeye tıklayın.", + "-2146691203": "Düzenleme seçimi", + "-249184528": "AB veya AB dışı düzenlemeler kapsamında gerçek hesaplar oluşturabilirsiniz. Bu hesaplar hakkında daha fazla bilgi edinmek için <0><0/> simgesine tıklayın.", "-1505234170": "Trader's Hub turu", - "-181080141": "Ticaret merkezi turu", + "-181080141": "Trading hub turu", "-1042025112": "Etrafta dolaşmak için yardıma ihtiyacınız var? <0>Yardımcı olabilecek kısa bir öğreticimiz var. Başlamak için Turu tekrarla tuşuna basın.", "-1536335438": "Bunlar sizin için mevcut olan ticaret hesaplarıdır. Daha fazla bilgi edinmek için bir hesabın simgesine veya açıklamasına tıklayabilirsiniz", "-1034232248": "CFD'ler veya Çarpanlar", "-1320214549": "CFD işlem hesapları ve Çarpanlar hesapları arasında seçim yapabilirsiniz", - "-2069414013": "Hesap oluşturmak için 'Al' düğmesini tıklayın", + "-2069414013": "Hesap oluşturmak için 'Edin' düğmesine tıklayın", "-951876657": "Hesabınıza yükleme", - "-1945421757": "Hesabınız olduğunda, bir hesaba para eklemek için “Para Yatırma” veya “Aktar” ı tıklayın", + "-1945421757": "Bir hesabınız olduğunda, hesaba para eklemek için “Deposit” veya “Transfer”i tıklayın", "-1965920446": "Ticarete başlayın", - "-514389291": "<0>AB yasal sorumluluk reddi: CFD'ler karmaşık araçlardır ve kaldıraç nedeniyle hızla para kaybetme riski yüksektir. <0>Perakende yatırımcı hesaplarının% 71'i bu sağlayıcıyla CFD ticareti yaparken para kaybediyor. CFD'lerin nasıl çalıştığını anlayıp anlamadığınızı ve yüksek paranızı kaybetme riskini alıp alamayacağınızı düşünmelisiniz.", + "-514389291": "<0>AB yasal sorumluluk feragatnamesi: CFD'ler karmaşık araçlardır ve kaldıraç nedeniyle hızla para kaybetme riski yüksektir. <0>Perakende yatırımcı hesaplarının %71'i bu sağlayıcıyla CFD ticareti yaparken para kaybediyor. CFD'lerin nasıl çalıştığını anlayıp anlamadığınızı ve paranızı yüksek kaybetme riskini alıp alamayacağınızı düşünmelisiniz.", "-1975494965": "Kasiyer", "-1787304306": "Deriv P2P", "-2021135479": "Bu alan zorunludur.", @@ -2629,6 +2633,7 @@ "-1511825574": "Kar/Zarar:", "-726626679": "Potansiyel kar/zarar:", "-338379841": "Gösterge fiyatı:", + "-2027409966": "İlk bahis:", "-1525144993": "Ödeme limiti:", "-1167474366": "Tik ", "-555886064": "Kazandı", @@ -3441,7 +3446,6 @@ "-2039780875": "Satın alma onayı", "-1672470173": "Bir sözleşme satın almadan önce onay iste", "-1342661765": "Sözleşme satın alma düğmelerini kilitle", - "-1738427539": "Satın al", "-504410042": "Bir pozisyon açtığınızda, varlık fiyatı etrafında engeller oluşturulacaktır. Her yeni kene için, üst ve alt engeller, seçtiğiniz varlık ve akümülatör değerine göre otomatik olarak hesaplanır. Varlık fiyatı engellerden herhangi birine çarpmadan önce pozisyonunuzu kapatırsanız kar elde edersiniz.", "-1907770956": "Her bir kene için fiyat değişikliği bariyer içinde olduğu sürece, ödemeniz seçtiğiniz akümülatör değerine bağlı olarak her işarette büyüyecektir.", "-997670083": "Maksimum keneler", @@ -3503,9 +3507,11 @@ "-194424366": "üzerinde", "-1527492178": "Satın alma kilitlendi", "-725375562": "Satın alma düğmesini Ayarlar menüsünden kilitleyebilir/kilidini açabilirsiniz", - "-601992465": "Biriktirmek", - "-30171993": "Fiyat, önceki kene fiyatından ±{{tick_size_barrier}} aralığında kaldığı sürece, ikinci işaretten başlayarak her işarette% {{growth_rate}}oranında artacaktır.", + "-2131851017": "Büyüme oranı", "-1358367903": "Bahis", + "-542594338": "Maks. ödeme", + "-690963898": "Ödemeniz bu tutara ulaştığında sözleşmeniz otomatik olarak kapatılacaktır.", + "-511541916": "Bu sayıda kene ulaşıldığında sözleşmeniz otomatik olarak kapatılacaktır.", "-1918235233": "Min. kazık", "-1935239381": "Maks. bahis miktarı", "-1930565757": "Hisseleriniz, bu sözleşmeyi satın almak için iade edilmeyen tek seferlik bir primdir. Toplam kârınız/zararınız, sözleşme değerine eksi bahis tutarınıza eşittir.", @@ -3520,14 +3526,13 @@ "-2131859340": "Stop out <0/>", "-1686280757": "(<1/> * {{multiplier}})'ın <0>{{commission_percentage}}%", "-1043117679": "Mevcut kaybınız bahisinizin {{stop_out_percentage}}% değerine eşit olduğunda veya aştığında, sözleşmeniz mevcut en yakın varlık fiyatından kapatılacaktır.", - "-477998532": "Kaybınız bu miktardan fazla veya bu miktara eşit olduğunda sözleşmeniz otomatik olarak kapatılır.", - "-2008947191": "Kârınız bu miktardan fazla veya ona eşit olduğunda sözleşmeniz otomatik olarak kapanır.", "-339236213": "Çarpan", "-857660728": "Grev Fiyatları", "-119134980": "<0>{{trade_type}}: Piyasa fiyatı ise bir ödeme alacaksınız {{payout_status}} <0>son kullanma zamanında bu fiyat. aksi takdirde, ödemeniz sıfır olacaktır.", "-243332856": "{{ underlying_name }} için en son 1000 tikin son basamak durumu", "-1900883796": "<0>{{trade_type}}: Piyasa ise bir ödeme alacaksınız {{payout_status}} <0>son kullanma zamanında bu fiyat. aksi takdirde, ödemeniz sıfır olacaktır.", "-347156282": "İspat Gönder", + "-1738427539": "Satın al", "-461955353": "alış fiyatı", "-172348735": "kar", "-1624674721": "sözleşme türü", diff --git a/packages/translations/src/translations/vi.json b/packages/translations/src/translations/vi.json index a1287b213cb3..2d0486ae79df 100644 --- a/packages/translations/src/translations/vi.json +++ b/packages/translations/src/translations/vi.json @@ -229,10 +229,10 @@ "283986166": "Tự giới hạn giao dịch trên trang web này chỉ áp dụng cho tài khoản {{brand_website_name}} của bạn, không bao gồm các tài khoản thuộc các công ty hoặc trang web khác.", "284527272": "antimode", "284772879": "Hợp đồng", - "284809500": "Demo tài chính", + "284809500": "Tài chính thử nghiệm", "287934290": "Bạn có chắc chắn bạn muốn hủy giao dịch này không?", "289898640": "ĐIỀU KHOẢN SỬ DỤNG", - "291744889": "<0>1. Các thông số Trade: <0>", + "291744889": "<0>1. Các thông số giao dịch: <0>", "291817757": "Đi tới trang cộng đồng Deriv của chúng tôi để tìm hiểu về API, API token, cách sử dụng Deriv API và nhiều nội dung khác.", "292491635": "Nếu bạn chọn \"Cắt lỗ\" và đưa ra một giá trị để giới hạn số lỗ của mình, giao dịch của bạn sẽ tự động đóng khi số lỗ lớn hơn hoặc bằng giá trị này. Số lỗ của bạn có thể sẽ lớn hơn giá trị bạn đặt ra do phụ thuộc vào giá của thị trường tại thời điểm đóng.", "292526130": "Phân tích tick và biểu đồ nến", @@ -241,7 +241,7 @@ "294305803": "Cài đặt quản lý tài khoản", "294335229": "Bán tại giá thị trường", "301441673": "Chọn quốc gia/quốc tịch của bạn như trên hộ chiếu hoặc giấy tờ tùy thân do chính phủ cấp.", - "301472132": "Chào! Nhấn <0>Bắt đầu để có một tour du lịch nhanh để giúp bạn bắt đầu.", + "301472132": "Xin chào! Nhấn <0>Bắt đầu để được hướng dẫn khám phá nhanh.", "303959005": "Giá bán:", "304309961": "Chúng tôi đang xem xét yêu cầu rút tiền của bạn. Bạn vẫn có thể hủy giao dịch này nếu muốn. Một khi chúng tôi đã bắt đầu xử lý giao dịch, bạn sẽ không thể hủy được nữa.", "307971599": "<0>Với Lệnh Mua:<1/> Bạn sẽ nhận được tiền chi trả (payout) nếu giá thị trường cao hơn giá thực hiện (strike price) tại thời điểm hết hạn hợp đồng. Số tiền chi trả này sẽ tăng tỉ lệ thuận với độ chênh lệch giữa giá thị trường và giá thực hiện. Khi số tiền chi trả cao hơn số tiền cược (stake) ban đầu của bạn, bạn sẽ bắt đầu có lợi nhuận. Nếu giá thị trường bằng hoặc thấp hơn giá thực hiện tại thời điểm hết hạn hợp đồng, bạn sẽ không nhận được khoản tiền chi trả nào.", @@ -263,11 +263,11 @@ "326770937": "Rút {{currency}} ({{currency_symbol}}) về ví của bạn", "327534692": "Giá trị thời gian không hợp lệ. Để chạy được bot, vui lòng nhập {{min}}.", "328539132": "Lặp lại các chỉ dẫn bên trong một số lần xác định", - "329353047": "Cơ quan Dịch vụ Tài chính Malta (MFSA) (Giấy phép số IS/70156)", + "329353047": "Malta Financial Services Authority (MFSA) (Giấy phép số IS/70156)", "329404045": "<0>Chuyển sang tài khoản thực của bạn<1> để tạo tài khoản {{account_title}} {{platform}}.", "333121115": "Chọn loại tài khoản Deriv MT5", "333456603": "Giới hạn rút tiền", - "333807745": "Nhấp vào khối bạn muốn xóa và nhấn Delete trên bàn phím của bạn.", + "333807745": "Nhấp vào khung bạn muốn xóa và nhấn phím Xóa trên bàn phím của bạn.", "334680754": "Chuyển sang tài khoản thực của bạn để tạo tài khoản DMT5", "334942497": "Thời gian mua", "335040248": "Về chúng tôi", @@ -280,7 +280,7 @@ "343873723": "Khung này hiển thị một thông báo. Bạn có thể chỉ định màu của tin nhắn và chọn từ 6 tùy chọn âm thanh khác nhau.", "344418897": "Các tính năng giới hạn giao dịch và quyền tự ngăn giao dịch giúp bạn kiểm soát số tiền và thời gian bạn dành cho {{brand_website_name}} và thực hiện <0>giao dịch có trách nhiệm.", "345320063": "Mốc thời gian không hợp lệ", - "345818851": "Rất tiếc, đã xảy ra lỗi nội bộ. Nhấn vào hộp kiểm ở trên để thử lại.", + "345818851": "Rất tiếc, đã xảy ra lỗi nội bộ. Nhấn vào hộp đánh dấu ở trên để thử lại.", "347029309": "Forex: Tiêu chuẩn/Micro", "347039138": "Phép lặp (2)", "348951052": "Cổng thanh toán của bạn đang bị khóa", @@ -317,7 +317,6 @@ "379523479": "Để tránh mất tiền, không chia sẻ mã token và quyền quản trị viên cho các bên không được phép.", "380606668": "tick", "380694312": "Các giao dịch liên tiếp tối đa", - "382781785": "Hợp đồng của bạn sẽ tự động đóng khi tiền lãi lớn hơn hoặc bằng giá trị này.", "384303768": "Khung này trả về \"Đúng\" nếu nến cuối cùng có màu đen. Nó có thể được đặt ở bất cứ đâu trên biểu đồ, ngoại trừ trong khung Tham số giao dịch gốc.", "386191140": "Bạn có thể chọn giữa tài khoản CFD, Quyền chọn và Cấp số nhân", "386278304": "Cài đặt ứng dụng web {{platform_name_trader}}", @@ -371,6 +370,7 @@ "437904704": "Số vị thế mở tối đa", "438067535": "Hơn $500.000", "442520703": "$250.001 — $500.000", + "443203714": "Hợp đồng của bạn sẽ được đóng tự động nếu tổn thất của bạn đạt đến số tiền này.", "443559872": "Financial SVG", "444484637": "Lý luận phủ định", "445419365": "1 — 2 năm", @@ -386,7 +386,7 @@ "457494524": "1. Từ thư viện khối, nhập tên cho biến mới và nhấp vào Tạo mới.", "459612953": "Chọn tài khoản", "459817765": "Đang chờ xử lý", - "460070238": "Chúc mừng", + "460070238": "Xin chúc mừng", "460975214": "Hoàn thành bài kiểm tra mức độ phù hợp của bạn", "461795838": "Vui lòng liên hệ chúng tôi qua live chat để mở khóa.", "462079779": "Không được bán lại", @@ -412,7 +412,7 @@ "489768502": "Thay đổi mật khẩu nhà đầu tư", "491603904": "Trình duyệt không được hỗ trợ", "492198410": "Đảm bảo mọi thứ rõ ràng", - "492566838": "Số nhận dạng người nộp thuế", + "492566838": "Mã số thuế", "497518317": "Chức năng trả về một giá trị", "498144457": "Hóa đơn tiện ích gần đây (ví dụ: điện, nước hoặc gas)", "498562439": "hoặc", @@ -421,7 +421,7 @@ "500920471": "Khung này thực hiện các phép toán số học giữa hai số.", "501401157": "Bạn chỉ được phép nạp tiền", "501537611": "*Số phiên giao dịch mở tối đa", - "502007051": "SVG miễn phí qua đêm Demo", + "502007051": "Tài khoản SVG thử nghiệm không phí qua đêm", "502041595": "Khung này cung cấp cho bạn một nến cụ thể từ trong khoảng thời gian đã chọn.", "503137339": "Giới hạn mức chi trả", "505793554": "ký tự cuối", @@ -444,7 +444,7 @@ "531114081": "3. Loại hợp đồng", "531675669": "Euro", "535041346": "Tổng tiền cược tối đa mỗi ngày", - "538017420": "0.5 pip", + "538017420": "0,5 pip", "538228086": "Đóng-Thấp (Close - Low)", "541650045": "Quản lý mật khẩu {{platform}}", "541700024": "Trước tiên, hãy nhập số giấy phép lái xe của bạn và ngày hết hạn.", @@ -455,11 +455,12 @@ "545476424": "Tổng số tiền rút", "546534357": "Nếu bạn chọn \"Hủy giao dịch\", bạn có thể hủy giao dịch của bạn trong khung thời gian đã chọn nếu thị trường đi ngược lại dự đoán của bạn. Chúng tôi sẽ tính một khoản phí nhỏ cho việc này, nhưng chúng tôi sẽ trả lại số tiền cược của bạn mà không có lãi hay lỗ. Nếu đạt tới số tiền dừng trước khi hủy thỏa thuận, giao dịch của bạn sẽ tự động được hủy và chúng tôi sẽ trả lại số tiền cược của bạn mà không bao gồm lãi hoặc lỗ. Trong khi \"Hủy giao dịch\" đang hoạt động:", "549479175": "Cấp số nhân Deriv", + "550589723": "Tiền đặt cọc của bạn sẽ tăng ở mức {{growth_rate}}% cho mỗi tick miễn là giá giao ngay hiện tại vẫn nằm trong ±{{tick_size_barrier}} so với giá giao ngay trước đó.", "551569133": "Tìm hiểu thêm về các giới hạn giao dịch", "554135844": "Chỉnh sửa", "554410233": "Đây là một trong 10 mật khẩu phổ biến nhất", "555351771": "Sau khi xác định các tham số và tùy chọn giao dịch, bạn có thể hướng dẫn bot của mình mua hợp đồng khi các điều kiện cụ thể được đáp ứng. Để làm điều đó, bạn có thể sử dụng các khối có điều kiện và các \bkhung chỉ số để giúp bot của bạn đưa ra quyết định.", - "555881991": "Phiếu số nhận dạng quốc gia", + "555881991": "Số căn cước công dân", "556264438": "Khoảng thời gian", "559224320": "Công cụ “kéo và thả” cổ điển của chúng tôi để tạo bot giao dịch, có biểu đồ giao dịch dạng pop-up, dành cho các trader nhiều kinh nghiệm.", "561982839": "Thay đổi loại tiền tệ", @@ -502,7 +503,7 @@ "599469202": "{{secondPast}}giây trước", "602278674": "Xác định danh tính", "603849445": "Giá thực hiện", - "603849863": "Tìm kiếm <0>Lặp lại trong thời gian/Cho đến, và nhấp vào biểu tượng + để thêm khối vào khu vực không gian làm việc.", + "603849863": "Tìm lệnh <0>Lặp lại Trong khi/Cho đến và nhấp vào biểu tượng + để thêm khung vào không gian làm việc.", "606240547": "- Ghi chép tự nhiên", "606877840": "Lùi về hôm nay", "607807243": "Lấy nến", @@ -524,6 +525,7 @@ "627814558": "Khung này trả về một giá trị khi một điều kiện là đúng. Sử dụng khung này vào một trong các khung chức năng ở trên.", "628193133": "ID tài khoản", "629145209": "Trong trường hợp nếu thuật toán \"AND\" được chọn, khung sẽ trả về giá trị \"Đúng\" chỉ khi cả hai điều kiện đưa ra là \"Đúng\"", + "629395043": "Tất cả tốc độ tăng trưởng", "632398049": "Khung này gán giá trị rỗng cho một mục hoặc câu lệnh.", "634219491": "Bạn chưa cung cấp mã số thuế của mình. Thông tin này là cần thiết cho các yêu cầu pháp lý và quy định. Vui lòng truy cập tới <0>Thông tin cá nhân trong phần cài đặt tài khoản của bạn và điền vào mã số thuế mới nhất của bạn.", "636219628": "<0>c. Nếu không có cơ hội giải quyết, khiếu nại sẽ chuyển sang giai đoạn phán quyết do DRC xử lý.", @@ -556,7 +558,7 @@ "660481941": "Để truy cập vào các ứng dụng di động của bạn và các ứng dụng bên thứ ba khác, bạn cần tạo mã thông báo API trước.", "660991534": "Kết thúc", "661759508": "Dựa vào thông tin được cung cấp về kiến thức và kinh nghiệm của bạn, chúng tôi thấy rằng những dịch vụ đầu tư hiện có trên trang web này không phù hợp với bạn.<0/><0/>", - "662548260": "Forex, Stock indices, Commodities và Cryptocurrencies", + "662548260": "Forex, Chỉ số chứng khoán, Hàng hóa và Tiền điện tử", "662578726": "Khả dụng", "662609119": "Tải ứng dụng MT5", "665089217": "Vui lòng gửi <0>giấy tờ xác thực danh tính để xác thực tài khoản và truy cập vào cổng thanh toán của bạn.", @@ -583,13 +585,13 @@ "693396140": "Hủy giao dịch (hết hạn)", "696870196": "- Giờ mở cửa: đánh dấu thời gian mở", "697630556": "Thị trường này hiện đã đóng cửa.", - "698037001": "Số nhận dạng quốc gia", + "698037001": "Số căn cước công dân", "699159918": "1. Điền đơn khiếu nại", "700259824": "Nghề nghiệp và thu nhập", "701034660": "Chúng tôi vẫn đang xử lý yêu cầu rút tiền của bạn.<0 />Vui lòng đợi đến khi việc chuyển tiền được hoàn tất trước khi vô hiệu hóa tài khoản của bạn.", "701462190": "Giá vào", "701647434": "Tìm kiếm chuỗi", - "702451070": "ID quốc tịch (Không có ảnh)", + "702451070": "Căn cước công dân (Không ảnh)", "705299518": "Tiếp theo, tải lên ảnh chụp trang có ảnh trong hộ chiếu của bạn.", "706413212": "Để truy cập vào thủ quỹ, bạn đang ở trong tài khoản {{regulation}} {{currency}} ({{loginid}}) của bạn.", "706727320": "Tần suất giao dịch các quyền chọn nhị phân", @@ -674,6 +676,7 @@ "802438383": "Cần giấy tờ xác nhận địa chỉ mới", "802556390": "giây", "802989607": "Kéo tệp XML của bạn vào đây", + "803500173": "Mức cược ban đầu", "806165583": "Australia 200", "807499069": "Thủ tục khiếu nại hoa hồng tài chính", "808323704": "Bạn cũng có thể sử dụng khung \"So sánh\" và \"Thuật toán logic\" để thử các biến.", @@ -733,7 +736,7 @@ "869993298": "Mức rút tối thiểu", "872549975": "Bạn có {{number}} lần chuyển khoản còn lại trong hôm nay.", "872661442": "Bạn có chắc bạn muốn cập nhật email từ <0>{{prev_email}} sang <1>{{changed_email}}?", - "872721776": "2. Chọn tập tin XML của bạn và nhấn Chọn.", + "872721776": "2. Chọn tệp XML của bạn và nhấn Chọn.", "872817404": "Thời gian điểm vào", "873166343": "1. \"Nhật ký\" hiển thị một thông báo thông thường.", "874461655": "Quét mã QR bằng điện thoại của bạn", @@ -745,7 +748,7 @@ "881000060": "{{transaction_type_display_text}} {{currency}}", "885065431": "Tạo tài khoản Deriv", "888274063": "Tỉnh/Thành phố", - "888924866": "Chúng tôi không chấp nhận các đầu vào sau đây cho:", + "888924866": "Chúng tôi không chấp nhận các đầu vào sau đây:", "890299833": "Đi tới Báo cáo", "891337947": "Chọn quốc gia", "892341141": "Thông số giao dịch của bạn kể từ: {{date_time}}", @@ -755,7 +758,7 @@ "894191608": "<0>c. Chúng tôi phải chi trả và tuân thủ phán quyết trong vòng 28 ngày kể từ khi có quyết định.", "898457777": "Bạn đã thêm một tài khoản tài chính Deriv.", "900646972": "trang.", - "901096150": "Kiếm tiền bằng cách dự đoán đúng biến động giá của thị trường với <0>Quyền chọn, hoặc hưởng những lợi ích của giao dịch CFD mà không mất nhiều hơn số tiền cược ban đầu với <1>Cấp số nhân.", + "901096150": "Kiếm thu nhập bằng cách dự đoán đúng biến động giá của thị trường với giao dịch <0>Quyền chọn, hoặc hưởng những lợi ích của giao dịch CFD mà không phải chịu rủi ro mất nhiều hơn số tiền cược với giao dịch <1>Cấp số nhân.", "902045490": "3 phút", "903429103": "Trong danh sách nến đọc {{ candle_property }} # từ cuối {{ input_number }}", "904696726": "Mã API token", @@ -882,7 +885,7 @@ "1041001318": "Khung này thực hiện các thao tác sau trong một danh sách nhất định: tổng, tối thiểu, tối đa, trung bình, trung vị, mode, antimode, độ lệch chuẩn, mục ngẫu nhiên.", "1041620447": "Nếu mã QR không hoạt động, bạn có thể nhập thủ công đoạn mã này:", "1042659819": "Bạn có một tài khoản cần hành động", - "1043483281": "Nhấp vào Chạy khi bạn muốn bắt đầu giao dịch, và nhấp vào Dừng khi bạn muốn dừng.", + "1043483281": "Nhấp vào Chạy khi bạn muốn bắt đầu giao dịch và nhấp vào Dừng khi bạn muốn dừng.", "1043790274": "Đã có lỗi xảy ra", "1044230481": "Đây là địa chỉ dành riêng cho Ethereum ({{token}}), vui lòng không sử dụng {{prohibited_token}}.", "1044540155": "100+", @@ -900,7 +903,7 @@ "1052779010": "Bạn đang sử dụng tài khoản thử nghiệm của mình", "1053153674": "Chỉ số Jump 50", "1053159279": "Trình độ giáo dục", - "1053556481": "Sau khi bạn gửi khiếu nại của bạn, chúng tôi sẽ gửi cho bạn một email xác nhận để xác nhận rằng chúng tôi đã nhận được khiếu nại.", + "1053556481": "Sau khi bạn gửi khiếu nại, chúng tôi sẽ gửi đến bạn một email để xác nhận rằng chúng tôi đã nhận được khiếu nại của bạn.", "1055313820": "Không phát hiện tài liệu nào", "1056381071": "Quay trở lại giao dịch", "1056821534": "Bạn có chắc bạn muốn đóng tài khoản của mình?", @@ -932,8 +935,8 @@ "1088031284": "Giá thực hiện:", "1088138125": "Tick {{current_tick}} - ", "1089085289": "Số di động", - "1089436811": "Bài giảng", - "1089687322": "Ngừng bot hiện tại của bạn?", + "1089436811": "Hướng dẫn", + "1089687322": "Bạn muốn dừng bot hiện tại của bạn?", "1095295626": "<0>• Arbiter for Financial Services sẽ xác định xem khiếu nại có được chấp nhận và phù hợp với pháp luật hay không.", "1096078516": "Chúng tôi sẽ xem xét giấy tờ của bạn và thông báo tình hình đến bạn trong vòng 3 ngày.", "1096175323": "Bạn sẽ cần một tài khoản Deriv", @@ -1093,6 +1096,7 @@ "1264842111": "Bạn có thể đổi giữa các tài khoản thực và tài khoản thử nghiệm.", "1265704976": "", "1270581106": "Nếu bạn chọn \"Không Chạm\" (No Touch), hợp đồng quyền chọn của bạn sẽ sinh lời nếu giá thị trường không chạm đến ngưỡng giới hạn trong suốt thời hạn hợp đồng.", + "1271461759": "Hợp đồng của bạn sẽ được đóng tự động nếu lợi nhuận của bạn đạt đến số tiền này.", "1272012156": "GBP/CHF", "1272337240": "Ngày", "1272681097": "Giờ", @@ -1276,14 +1280,14 @@ "1461323093": "Hiển thị thông báo trong bảng điều khiển dành cho nhà phát triển.", "1464190305": "Khung này sẽ chuyển quyền điều khiển trở lại khung Các điều kiện Mua, cho phép bạn mua hợp đồng khác mà không cần dừng và khởi động lại bot của mình theo cách thủ công.", "1464253511": "Bạn đã có tài khoản cho mỗi loại tiền điện tử có mặt trên {{deriv}}.", - "1465084972": "Bạn có bao nhiêu kinh nghiệm với các công cụ tài chính khác?", + "1465084972": "Bạn có bao nhiêu năm kinh nghiệm giao dịch các công cụ tài chính khác?", "1465919899": "Chọn ngày kết thúc", "1466430429": "Nên ở giữa {{min_value}} và {{max_value}}", "1466900145": "Doe", "1467017903": "Thị trường này hiện chưa có mặt trên {{platform_name_trader}}, nhưng đã có trên {{platform_name_smarttrader}}.", "1467421920": "với khoảng thời gian: %1", "1467661678": "Giao dịch tiền điện tử", - "1467880277": "3. Truy vấn chung", + "1467880277": "3. Các câu hỏi chung", "1468308734": "Khung này lặp lại các hướng dẫn khi điều kiện đặt đúng", "1468419186": "Deriv hiện hỗ trợ rút Tether USDT sang ví Omni. Để đảm bảo giao dịch thành công, hãy nhập địa chỉ ví tương thích với mã bạn muốn rút. <0>Tìm hiểu thêm", "1468937050": "Giao dịch trên {{platform_name_trader}}", @@ -1298,10 +1302,10 @@ "1478030986": "Tạo hoặc xóa mã thông báo API để giao dịch và rút tiền", "1480915523": "Bỏ qua", "1481977420": "Vui lòng giúp chúng tôi xác nhận yêu cầu rút tiền của bạn.", - "1483470662": "Chọn 'Mở' để bắt đầu giao dịch với tài khoản của bạn", + "1483470662": "Nhấp 'Mở' để bắt đầu giao dịch với tài khoản của bạn", "1484336612": "Khung này được sử dụng để chấm dứt hoặc tiếp tục một vòng lặp và có thể được đặt ở bất cứ đâu trong khung vòng lặp.", "1487086154": "Giấy tờ của bạn đã được gửi thành công", - "1488126519": "bot của bạn", + "1488126519": "Bot của bạn", "1488548367": "Tải lên lại", "1490583127": "DBot chưa khả dụng cho các tài khoản thực", "1491392301": "<0>Bán cho: {{sold_for}}", @@ -1318,7 +1322,7 @@ "1503618738": "- ID tham chiếu của thỏa thuận: ID tham chiếu của hợp đồng", "1505420815": "Không tìm thấy đại lý thanh toán nào cho tìm kiếm của bạn", "1505898522": "Tải xuống ngăn xếp", - "1505927599": "Máy chủ của chúng tôi chạm một vết sưng. Hãy làm mới để tiếp tục.", + "1505927599": "Máy chủ của chúng tôi gặp sự cố. Hãy làm mới để tiếp tục.", "1509570124": "{{buy_value}} (Mua)", "1509678193": "Đào tạo", "1510075920": "Vàng/USD", @@ -1334,7 +1338,7 @@ "1519891032": "Chào mừng bạn đến với Trader's Hub", "1520332426": "Thu nhập ròng hằng năm", "1524636363": "Quá trình xác thực thất bại", - "1526483456": "2. Nhập tên cho biến của bạn, và nhấn Create. Các khối mới chứa biến mới của bạn sẽ xuất hiện bên dưới.", + "1526483456": "2. Nhập tên cho biến của bạn và nhấn Tạo. Các khung mới chứa biến mới sẽ xuất hiện bên dưới.", "1527251898": "Không thành công", "1527906715": "Khung này thêm số cho sẵn vào biến được chọn.", "1531017969": "Tạo một chuỗi văn bản duy nhất từ ​​việc kết hợp giá trị văn bản của từng mục được đính kèm, không có khoảng trống ở giữa. Số lượng các mục có thể được thêm vào cho phù hợp.", @@ -1343,10 +1347,10 @@ "1534796105": "Lấy giá trị biến", "1537711064": "Bạn cần xác minh nhanh danh tính trước khi có thể truy cập Cổng thanh toán. Vui lòng đi tới phần cài đặt tài khoản để gửi giấy tờ xác thực danh tính của bạn.", "1540585098": "Từ chối", - "1541508606": "Tìm kiếm giao dịch CFD? Đi tới Trader's Hub", + "1541508606": "Bạn muốn giao dịch CFD? Hãy đi tới Trader's Hub", "1541969455": "Cả hai", - "1542742708": "Tổng hợp, Forex, Chứng Stocks, Stock indices, Commodities và Cryptocurrencies", - "1544642951": "Nếu bạn chọn \"Chỉ Tăng\", bạn sẽ thắng nếu các tick liên tục tăng sau điểm khởi đầu. Sẽ không được trả tiền nếu có bất kỳ tick giảm dưới hoặc bằng các tick trước nó.", + "1542742708": "Chỉ số tổng hợp, Forex, Cổ phiếu, Chỉ số chứng khoán, Hàng hóa và Tiền điện tử", + "1544642951": "Nếu bạn chọn \"Chỉ Tăng\" (Only Ups), hợp đồng quyền chọn của bạn sẽ sinh lời nếu các tick tiếp theo tăng liên tiếp sau giá vào. Hợp đồng không sinh lời nếu giá bất kỳ tick nào thấp hơn hoặc bằng với bất kỳ tick nào trước đó.", "1547148381": "Kích thước tệp quá lớn (chỉ cho phép tối đa 8MB). Vui lòng tải lên một tệp tin khác.", "1548765374": "Xác minh số giấy tờ thất bại", "1549098835": "Tổng số tiền rút", @@ -1373,7 +1377,7 @@ "1572504270": "Thao tác làm tròn", "1572982976": "Máy chủ", "1573429525": "Mua/Bán", - "1573533094": "Tài liệu của bạn đang chờ xác minh.", + "1573533094": "Giấy tờ của bạn đang chờ xác minh.", "1575556189": "Tether trên blockchain Ethereum, dưới dạng mã ERC20, là một lớp vận chuyển mới hơn, hiện làm cho Tether khả dụng trong các hợp đồng Ethereum thông minh. Là một mã ERC20 tiêu chuẩn, nó cũng có thể được gửi đến bất kỳ địa chỉ Ethereum nào.", "1577480486": "Liên kết trên điện thoại của bạn sẽ hết hạn sau một giờ", "1577527507": "Cần có lý do mở tài khoản.", @@ -1388,7 +1392,7 @@ "1589640950": "Không thể bán lại hợp đồng này.", "1589702653": "Giấy tờ xác thực địa chỉ", "1590400723": "Tổng tài sản trong tất cả tài khoản Deriv của bạn", - "1591933071": "Gửi lại tài liệu", + "1591933071": "Gửi lại giấy tờ", "1593010588": "Đăng nhập ngay", "1594147169": "Vui lòng quay lại", "1594322503": "Lựa chọn bán hiện khả dụng", @@ -1402,7 +1406,7 @@ "1604916224": "Tuyệt đối", "1605222432": "Tôi không có kiến thức và kinh nghiệm trading.", "1605292429": "Tổng mức thua lỗ tối đa", - "1611306795": "Boot của tôi làm thế nào?", + "1611306795": "Hiệu quả hoạt động của bot của tôi?", "1612105450": "Nhận chuỗi phụ", "1612638396": "Hủy giao dịch của bạn bất cứ lúc nào trong một khung thời gian nhất định.", "1613633732": "Thời gian nghỉ nên trong khoảng 10 — 60 phút", @@ -1414,7 +1418,7 @@ "1620346110": "Thiết lập tiền tệ", "1621024661": "Tether như một token TRC20 (tUSDT) là một phiên bản của Tether được lưu trữ trên Tron.", "1622662457": "Ngày từ", - "1622944161": "Bây giờ, hãy vào khối <0>Điều kiện giao dịch Khởi động lại.", + "1622944161": "Bây giờ, hãy đi tới khung <0>Điều kiện để khởi động lại giao dịch.", "1623706874": "Sử dụng khối này khi bạn muốn sử dụng cấp số nhân là loại giao dịch của mình.", "1630372516": "Thử dùng dịch vụ Fiat onramp của chúng tôi", "1630417358": "Vui lòng chuyển đến cài đặt tài khoản của bạn và điền đầy đủ thông tin cá nhân để có thể rút tiền.", @@ -1430,13 +1434,12 @@ "1641395634": "Danh sách chữ số cuối", "1641635657": "Yêu cầu giấy tờ xác thực danh tính mới", "1641980662": "Cần danh xưng.", - "1642645912": "Tất cả % tích lũy", - "1644703962": "Tìm kiếm tài khoản CFD? Truy cập Trader's Hub", + "1644703962": "Bạn đang tìm kiếm tài khoản CFD? Hãy truy cập Trader's Hub", "1644864436": "Bạn cần phải xác thực tài khoản của mình trước khi đăng ký trở thành trader chuyên nghiệp. <0>Xác thực tài khoản của tôi", "1644908559": "Cần thông tin mã số.", "1647186767": "Bot đã gặp lỗi khi chạy.", "1648938920": "Netherlands 25", - "1649239667": "2. Dưới menu Blocks, bạn sẽ thấy danh sách các thể loại. Các khối được nhóm lại trong các thể loại này. Chọn khối bạn muốn và kéo chúng vào không gian làm việc.", + "1649239667": "2. Dưới Menu Khung, bạn sẽ thấy danh sách phân loại các khung, Chọn khung bạn muốn và kéo chúng vào không gian làm việc.", "1651513020": "Hiển thị thời gian còn lại cho mỗi khoảng", "1651951220": "Các lặp lại như \"abcabcabc\" chỉ hơi khó đoán hơn \"abc\"", "1652366857": "lấy và loại bỏ", @@ -1464,7 +1467,7 @@ "1675289747": "Chuyển sang tài khoản thực", "1677027187": "Forex", "1677990284": "Ứng dụng của tôi", - "1679743486": "1. Chuyển đến Quick strategy và chọn chiến lược bạn muốn.", + "1679743486": "1. Đi tới Chiến lược nhanh và chọn chiến lược bạn muốn.", "1680666439": "Tải lên sao kê ngân hàng có hiển thị tên, số tài khoản và lịch sử giao dịch của bạn.", "1682409128": "Chiến lược chưa đặt tên", "1682636566": "Gửi lại email trong", @@ -1481,7 +1484,7 @@ "1693614409": "Thời gian bắt đầu", "1694331708": "Bạn có thể chuyển đổi giữa giao dịch CFD, quyền chọn kỹ thuật số và cấp số nhân bất kỳ lúc nào.", "1694517345": "Nhập địa chỉ email mới", - "1698624570": "2. Nhấn Ok để xác nhận.", + "1698624570": "2. Nhấp Ok để xác nhận.", "1700233813": "Không thể chuyển tiền từ {{selected_value}}. Vui lòng chọn một tài khoản khác từ danh sách thả xuống", "1701447705": "Vui lòng cập nhật địa chỉ của bạn", "1703091957": "Chúng tôi cần thông tin về công việc của bạn vì đó là nghĩa vụ của chúng tôi theo yêu cầu của luật chống rửa tiền.", @@ -1517,7 +1520,7 @@ "1734264460": "Thông báo miễn trừ trách nhiệm", "1736292549": "Cập nhật mã bưu điện", "1737352280": "Bot.init không được gọi", - "1738094481": "D@@ <0>uration: Ticks 1", + "1738094481": "<0>Thời lượng: Tick 1", "1738681493": "Hãy bỏ kính, nếu cần thiết", "1739086943": "Wall Street 30", "1739384082": "Thất nghiệp", @@ -1526,7 +1529,7 @@ "1742256256": "Vui lòng tải lên một trong các loại giấy tờ sau:", "1743448290": "Đại lý thanh toán", "1743902050": "Hoàn thành đánh giá tài chính của bạn", - "1744509610": "Chỉ cần kéo tệp XML từ máy tính của bạn vào không gian làm việc, và bot của bạn sẽ được tải cho phù hợp. Ngoài ra, bạn có thể nhấn Import trong Bot Builder, và chọn nhập bot của bạn từ máy tính của bạn hoặc từ Google Drive của bạn.", + "1744509610": "Chỉ cần kéo tệp XML từ máy tính của bạn vào không gian làm việc và bot của bạn sẽ được tải lên. Ngoài ra, bạn có thể chọn Nhập trong Tạo Bot, và nhập bot từ máy tính của bạn hoặc từ Google Drive của bạn.", "1745523557": "- Căn bậc hai", "1746051371": "Tải ứng dụng", "1746273643": "Biến thiên trung bình hội tụ phân kỳ", @@ -1537,7 +1540,7 @@ "1748754976": "Chạy", "1749675724": "Deriv không thu phí sử dụng cho mọi loại tài khoản.", "1750065391": "Thời gian đăng nhập:", - "1753183432": "Chúng tôi thực hiện tất cả các khiếu nại một cách nghiêm túc và nhằm mục đích giải quyết chúng nhanh chóng và công bằng nhất có thể. Nếu bạn không hài lòng với bất kỳ khía cạnh nào của dịch vụ của chúng tôi, vui lòng cho chúng tôi biết bằng cách gửi khiếu nại theo hướng dẫn dưới đây:", + "1753183432": "Chúng tôi nghiêm túc tiếp nhận tất cả các khiếu nại và sẽ cố gắng giải quyết chúng nhanh chóng và công bằng nhất có thể. Nếu bạn không hài lòng với bất kỳ khía cạnh nào của dịch vụ của chúng tôi, vui lòng cho chúng tôi biết bằng cách gửi khiếu nại theo hướng dẫn dưới đây:", "1753226544": "gỡ", "1753975551": "Đăng ảnh chụp trang hộ chiếu có ảnh", "1756678453": "thoát ra", @@ -1570,7 +1573,7 @@ "1783740125": "Tải lên ảnh chân dung tự chụp", "1787135187": "Cần có mã Postal/Zip", "1787492950": "Các chỉ báo trên thẻ biểu đồ chỉ dành cho mục đích chỉ dẫn và có thể khác một chút so với các chỉ báo trên bảng làm việc {{platform_name_dbot}}.", - "1788515547": "<0/>Để biết thêm thông tin về việc nộp đơn khiếu nại với Văn phòng trọng tài cho các dịch vụ tài chính, vui lòng <1>xem hướng dẫn của họ.", + "1788515547": "<0/>Để biết thêm thông tin về việc nộp đơn khiếu nại tới Văn phòng trọng tài cho các dịch vụ tài chính (Office of the Arbiter for Financial Services), vui lòng <1>xem hướng dẫn của họ.", "1788966083": "01-07-1999", "1789273878": "Mức chi trả cho mỗi điểm", "1789497185": "Hãy đảm bảo rằng các chi tiết trên hộ chiếu của bạn rõ ràng, không bị mờ hoặc loá", @@ -1580,14 +1583,15 @@ "1791971912": "Gần đây", "1793913365": "Để nạp tiền, vui lòng chuyển sang tài khoản {{currency_symbol}} của bạn.", "1794815502": "Tải xuống lịch sử giao dịch của bạn.", - "1796787905": "Vui lòng tải lên (các) tài liệu sau đây.", + "1796787905": "Vui lòng tải lên (các) giấy tờ sau đây.", "1798943788": "Bạn chỉ có thể nạp tiền.", "1801093206": "Lấy danh sách nến", - "1801270786": "Bạn đã sẵn sàng để tự động hóa chiến lược giao dịch của bạn mà không cần viết bất kỳ mã nào? Anh đã đến đúng chỗ rồi.", + "1801270786": "Bạn muốn tự động hóa chiến lược giao dịch của mình mà không cần biết bất kỳ mã code nào? Bạn đã đến đúng chỗ rồi.", "1801927731": "tài khoản {{platform_name_dxtrade}}", "1803338729": "Chọn loại hợp đồng bạn muốn giao dịch. Ví dụ: đối với loại giao dịch Tăng/Giảm (Rise/Fall), bạn có thể chọn một trong ba tùy chọn: Tăng, Giảm hoặc Cả hai. Quyền chọn được chọn sẽ xác định các tùy chọn khả dụng cho khung Mua.", "1804620701": "Thời hạn", "1804789128": "{{display_value}} tick", + "1806017862": "Tối đa ticks", "1806355993": "Không có phí hoa hồng", "1806503050": "Xin lưu ý rằng một số phương thức thanh toán có thể không có ở quốc gia của bạn.", "1808058682": "Khung được tải thành công", @@ -1596,23 +1600,23 @@ "1810217569": "Vui lòng làm mới trang này để tiếp tục.", "1811109068": "Thẩm quyền", "1811972349": "Thị trường", - "1811973475": "Trả về ký tự cụ thể từ một chuối có sẵn", + "1811973475": "Trả về một ký tự cụ thể từ một chuỗi có sẵn", "1812006199": "Xác minh danh tính", "1812582011": "Đang kết nối với máy chủ", "1813700208": "Chỉ số Boom 300", - "1813958354": "Gỡ bình luận", + "1813958354": "Xóa bình luận", "1815034361": "bảng chữ cái", "1815905959": "DTrader, DBot, SmartTrader và Binary Bot", "1815995250": "Hợp đồng mua", "1816126006": "Giao dịch trên Deriv MT5 ({{platform_name_dmt5}}), nền tảng giao dịch FX và CFD tất cả trong một.", "1817154864": "Khung này cung cấp cho bạn một số ngẫu nhiên từ trong phạm vi đã đặt.", - "1820242322": "ví dụ. Hợp chủng quốc Hoa kì", + "1820242322": "ví dụ: Hợp chủng quốc Hoa kì", "1820332333": "Nạp", - "1821818748": "Nhập số tham chiếu bằng lái xe", + "1821818748": "Nhập số bằng lái xe", "1823177196": "Phổ biến nhất", "1824193700": "Khung này cung cấp cho bạn chữ số cuối cùng của giá trị tick mới nhất.", "1824292864": "Mua", - "1827607208": "Tập tin chưa được tải lên.", + "1827607208": "Tệp chưa được tải lên.", "1828370654": "Onboarding", "1830520348": "Mật khẩu {{platform_name_dxtrade}}", "1831847842": "Tôi xác nhận rằng tên và ngày sinh ở trên khớp với giấy tờ tùy thân đã chọn của tôi (xem bên dưới)", @@ -1647,7 +1651,7 @@ "1856485118": "Vui lòng <0>gửi lại giấy tờ xác thực địa chỉ của bạn để có thể chuyển tiền giữa tài khoản MT5 và Deriv.", "1858251701": "phút", "1859308030": "Gửi phản hồi", - "1862182694": "Ba trong số các chiến lược được sử dụng phổ biến nhất trong giao dịch tự động là Martingale, D'Alembert và Oscar Grind - bạn có thể tìm thấy tất cả chúng đã sẵn sàng và chờ bạn trong DBot.", + "1862182694": "Ba trong số các chiến lược được sử dụng phổ biến nhất trong giao dịch tự động là Martingale, D'Alembert và Oscar Grind. Bạn có thể tìm thấy tất cả các chiến lược này tại DBot.", "1863053247": "Hãy tải lên giấy tờ xác thực danh tính của bạn.", "1863694618": "Giao dịch CFD trên MT5 với forex, cổ phiếu, chỉ số chứng khoán, hàng hóa và tiền điện tử.", "1863731653": "Hãy liên hệ với đại lý thanh toán để nhận tiền", @@ -1663,8 +1667,8 @@ "1873838570": "Vui lòng xác thực địa chỉ của bạn", "1874481756": "Sử dụng khung này để mua hợp đồng cụ thể mà bạn muốn. Bạn có thể thêm nhiều khung Mua cùng với các khung có điều kiện để xác định điều kiện mua của bạn. \bKhung này chỉ có thể được sử dụng trong khung Điều kiện mua hàng.", "1874756442": "BVI", - "1875702561": "Tải hoặc xây dựng bot của bạn", - "1876015808": "Ủy thác an sinh xã hội và bảo hiểm quốc gia", + "1875702561": "Tải hoặc tạo bot của bạn", + "1876015808": "Social Security and National Insurance Trust", "1876325183": "Phút", "1877225775": "Giấy tờ xác thực địa chỉ của bạn đã được chấp nhận", "1877272122": "Chúng tôi giới hạn mức chi trả tối đa cho mỗi hợp đồng và mức này sẽ khác nhau cho mỗi tài sản. Hợp đồng của bạn sẽ tự động đóng khi đạt đến mức chi trả tối đa.", @@ -1672,7 +1676,7 @@ "1877832150": "# từ điểm kết thúc", "1879042430": "Bài kiểm tra mức độ thích hợp, CẢNH BÁO:", "1879412976": "Tiền lời: <0>{{profit}}", - "1879463662": "Giá trị tiền gửi tối thiểu là {{minimum_deposit}} {{currency}} là bắt buộc. Nếu không, số tiền sẽ bị mất và không thể thu hồi được.", + "1879463662": "Bạn cần nạp tối thiểu {{minimum_deposit}} {{currency}}. Nếu không, số tiền sẽ bị mất và không thể thu hồi được.", "1879651964": "<0>Đang chờ xác thực", "1880029566": "Đô Úc", "1880097605": "lời nhắc cho {{ string_or_number }} với thông báo {{ input_text }}", @@ -1702,7 +1706,7 @@ "1914014145": "Hôm nay", "1914270645": "Thời lượng nến mặc định: {{ candle_interval_type }}", "1914725623": "Tải lên trang có chứa ảnh của bạn.", - "1917178459": "Số Verification ngân hàng", + "1917178459": "Số xác thực ngân hàng", "1917523456": "Khung này gửi tin nhắn đến kênh Telegram. Bạn sẽ cần phải tạo bot Telegram của riêng mình để sử dụng khung này.", "1917804780": "Bạn sẽ mất quyền truy cập vào tài khoản quyền chọn của mình khi tài khoản này bị đóng, vì vậy hãy đảm bảo bạn đã rút tất cả tiền của bạn. (Nếu bạn có tài khoản CFD, bạn cũng có thể chuyển tiền từ tài khoản Quyền chọn sang tài khoản CFD của mình.)", "1918633767": "Dòng địa chỉ thứ hai không ở định dạng thích hợp.", @@ -1728,8 +1732,8 @@ "1930899934": "Tether", "1931659123": "Chạy trên mỗi tick", "1931884033": "Có vẻ như ngày sinh của bạn trong giấy tờ không giống trong hồ sơ Deriv của bạn. Vui lòng cập nhật ngày sinh trong trang <0>Thông tin cá nhân để giải quyết vấn đề này.", - "1934450653": "Đối với <0>loại Contract, đặt nó thành cả hai.", - "1939014728": "Làm cách nào để xóa khối khỏi không gian làm việc?", + "1934450653": "Đặt thành cả hai với <0>loại hợp đồng.", + "1939014728": "Làm cách nào để xóa khung khỏi không gian làm việc?", "1939902659": "Tín hiệu", "1940408545": "Xóa mã thông báo này", "1941915555": "Thử lại sau", @@ -1755,13 +1759,13 @@ "1968025770": "Bitcoin Cash", "1968077724": "Nông nghiệp", "1968368585": "Nghề nghiệp", - "1970060713": "Bạn đã xóa thành công bot.", + "1970060713": "Bạn đã xóa bot thành công.", "1971898712": "Thêm hoặc quản lý tài khoản", "1973536221": "Bạn không có vị thế mở nào.", "1973564194": "Bạn chỉ được có một tài khoản tiền pháp định. Bạn sẽ không thể thay đổi đơn vị tiền tệ trong tài khoản của mình nếu bạn đã nạp tiền hoặc tạo tài khoản {{dmt5_label}} thực hoặc {{platform_name_dxtrade}}.", "1973910243": "Quản lý tài khoản của bạn", "1974273865": "Cho phép ứng dụng của bên thứ ba xem hoạt động tài khoản, cài đặt, giới hạn, bảng cân đối kế toán, lịch sử giao dịch và nhiều quyền khác nữa.", - "1974903951": "Nếu bạn nhấn Có, thông tin bạn nhập sẽ bị mất.", + "1974903951": "Nếu bạn chọn Có, thông tin bạn nhập sẽ bị mất.", "1981940238": "Chính sách khiếu nại này có thể thay đổi theo thời gian, áp dụng cho (các) tài khoản của bạn đã đăng ký với {{legal_entity_name_svg}} và {{legal_entity_name_v}}.", "1982912252": "Chỉ số tiềm lực tương đương (RSI) từ một danh sách cùng với một giai đoạn", "1983001416": "Xác định các tùy chọn giao dịch của bạn chẳng hạn như cấp số nhân và tiền đặt cược. Khối này chỉ có thể được sử dụng với loại giao dịch cấp số nhân. Nếu bạn chọn loại giao dịch khác, khối này sẽ được thay thế bằng khối tùy chọn Giao dịch.", @@ -1774,13 +1778,13 @@ "1984742793": "Tải lên giấy tờ", "1985366224": "Mỗi ngày, bạn có thể thực hiện tối đa {{ allowed_internal }} lần chuyển giữa các tài khoản Deriv của mình và tối đa {{ allowed_mt5 }} lần chuyển giữa các tài khoản Deriv và {{platform_name_mt5}} của bạn.", "1985637974": "Bất kỳ khung nào được đặt trong khung này sẽ được thực hiện tại mỗi tick. Nếu khoảng thời gian nến mặc định được đặt thành 1 phút trong \u001d khung Tham số Giao dịch gốc, các hướng dẫn trong khung này sẽ được thực hiện một lần mỗi phút. Đặt khối này bên ngoài một khung gốc bất kỳ.", - "1986094286": "- MaximumLoss: Sử dụng biến này để lưu trữ giới hạn tổn thất tối đa của bạn. Bạn có thể gán bất kỳ số tiền nào bạn muốn, nhưng nó phải là một số dương.", + "1986094286": "- maximumLoss: Sử dụng biến này để lưu số lỗ tối đa của bạn. Bạn có thể gán bất kỳ số tiền nào bạn muốn, nhưng nó phải là một số dương.", "1986498784": "BTC/LTC", "1987080350": "Thử nghiệm", "1987447369": "Cổng thanh toán của bạn đã bị khóa", "1988153223": "Địa chỉ Email", "1988302483": "Chốt lời:", - "1990331072": "Bằng chứng về quyền sở hữu", + "1990331072": "Giấy tờ xác nhận quyền sở hữu", "1990735316": "Tăng tương đương", "1991055223": "Xem giá thị trường của tài sản yêu thích của bạn.", "1991448657": "Bạn không biết mã số thuế của mình? Nhấn <0>vào đây để tìm hiểu thêm.", @@ -1794,20 +1798,20 @@ "1998199587": "Bạn cũng có thể tự ngăn bản thân khỏi giao dịch hoàn toàn trong một khoảng thời gian nhất định. Nếu bất kỳ lúc nào bạn quyết định giao dịch lại, thì bạn cần liên hệ với Bộ phận hỗ trợ khách hàng của chúng tôi để loại bỏ tính năng tự ngăn này. Bạn có thể tiếp tục giao dịch sau 24 giờ kể từ khi lệnh tự ngăn bị gỡ bỏ. ", "2001222130": "Kiểm tra hòm thư rác của bạn. Nếu không ở đó, hãy thử gửi lại email.", "2004395123": "Các công cụ giao dịch mới cho MT5", - "2004792696": "Nếu bạn là một công dân Anh, để tự loại trừ khỏi tất cả công ty cờ bạc trực tuyến có giấy phép trong Anh Quốc, đi tới <0>www.gamstop.co.uk.", + "2004792696": "Nếu bạn là công dân Anh, để tự ngăn mình khỏi giao dịch với tất cả các công ty cờ bạc trực tuyến có giấy phép ở Anh, hãy đi tới <0>www.gamstop.co.uk.", "2007028410": "thị trường, loại giao dịch, loại hợp đồng", - "2007092908": "Giao dịch với đòn bẩy và chênh lệch thấp để thu về lợi nhuận cao hơn cho các giao dịch thành công.", - "2008809853": "Vui lòng tiếp tục rút tiền của bạn trước ngày 30 tháng 11 năm 2021.", - "2009620100": "DBot sẽ không tiếp tục với bất kỳ giao dịch mới nào. Mọi giao dịch đang diễn ra sẽ được hoàn thành bởi hệ thống của chúng tôi. Mọi thay đổi chưa được lưu sẽ bị mất. <0>Lưu ý: Vui lòng kiểm tra bảng sao kê của bạn để xem các giao dịch đã hoàn thành.", + "2007092908": "Giao dịch với đòn bẩy và chênh lệch thấp giá để thu về lợi nhuận cao hơn cho các giao dịch thành công.", + "2008809853": "Vui lòng rút tiền của bạn trước ngày 30 tháng 11 năm 2021.", + "2009620100": "DBot sẽ không thực hiện thêm bất kỳ giao dịch mới nào. Mọi giao dịch đang diễn ra sẽ được hoàn thành bởi hệ thống của chúng tôi. Mọi thay đổi chưa được lưu sẽ bị mất. <0>Lưu ý: Vui lòng kiểm tra bảng sao kê của bạn để xem các giao dịch đã hoàn thành.", "2009770416": "Địa chỉ:", "2010759971": "Tải lên thành công", "2010866561": "Trả về tổng lợi nhuận/thua lỗ", "2011609940": "Vui lòng nhập số lớn hơn 0", - "2011808755": "Thời gian Mua", - "2012110280": "Tổng hợp, chỉ số giỏ hàng và ngoại hối có nguồn gốc", + "2011808755": "Thời gian mua", + "2012110280": "Tổng hợp, chỉ số giỏ hàng và mô phỏng FX", "2014536501": "Số thẻ", "2014590669": "Biến '{{variable_name}}' không có giá trị. Vui lòng chọn một giá trị cho biến '{{variable_name}}' để thông báo.", - "2017672013": "Vui lòng chọn quốc gia đã cấp giấy tờ văn bản.", + "2017672013": "Vui lòng chọn quốc gia đã cấp giấy tờ.", "2020545256": "Đóng tài khoản của bạn?", "2021037737": "Vui lòng cập nhật thông tin của bạn để tiếp tục.", "2023659183": "Sinh viên", @@ -1865,14 +1869,14 @@ "2080553498": "3. Nhận ID chat sử dụng Telegram REST API (đọc thêm: https://core.telegram.org/bots/api#getupdates)", "2080829530": "Đã bán cho: {{sold_for}}", "2082533832": "Có, xóa", - "2084693624": "Chuyển đổi một chuỗi đại diện cho ngày/giờ thành giây kể từ Epoch. Ví dụ: 2019-01-01 21:03:45 GMT + 0800 sẽ được chuyển đổi thành 1546347825. Thời gian và múi giờ được tùy chọn.", - "2084925123": "Dùng thử dịch vụ Fiat onramp của chúng tôi để mua và nạp tiền điện tử vào tài khoản Deriv của bạn.", + "2084693624": "Chuyển đổi một chuỗi đại diện cho ngày/giờ thành giây kể từ Epoch. Ví dụ: 2019-01-01 21:03:45 GMT+0800 sẽ được chuyển đổi thành 1546347825. Thời gian và múi giờ tùy chọn.", + "2084925123": "Sử dụng dịch vụ Fiat onramp của chúng tôi để mua và nạp tiền điện tử vào tài khoản Deriv của bạn.", "2085387371": "Phải là số, chữ cái và ký tự đặc biệt . , '-", - "2085602195": "- Giá trị đầu vào: giá trị của tick đầu tiên của hợp đồng", - "2086742952": "Bạn đã thêm một tài khoản Quyền chọn thực. <0/>Hãy gửi tiền ngay bây giờ để bắt đầu giao dịch.", - "2086792088": "Cả hai rào cản cần phải tương đối hoặc tuyệt đối", - "2088735355": "Các giới hạn phiên và đăng nhập của bạn", - "2089581483": "Hết hạn sau", + "2085602195": "— Giá trị đầu vào: giá trị của tick đầu tiên của hợp đồng", + "2086742952": "Bạn đã thêm một tài khoản Quyền chọn thực. <0/>Hãy nạp tiền ngay bây giờ để bắt đầu giao dịch.", + "2086792088": "Cả hai ngưỡng cần phải tương đối hoặc tuyệt đối", + "2088735355": "Giới hạn phiên và đăng nhập của bạn", + "2089581483": "Hết hạn vào", "2091671594": "Trạng thái", "2093675079": "- Đóng: giá đóng", "2096014107": "Áp dụng", @@ -1885,82 +1889,82 @@ "2101972779": "Điều này giống như ví dụ trên, sử dụng danh sách tick.", "2102572780": "Mã số phải gồm 6 kí tự.", "2104115663": "Lần đăng nhập cuối", - "2104397115": "Vui lòng chuyển đến cài đặt tài khoản của bạn và điền đầy đủ thông tin cá nhân của bạn để có thể gửi tiền và rút tiền.", - "2107381257": "Bảo trì hệ thống thu ngân theo lịch trình", - "2109312805": "Sự chênh lệch là khác biệt giữa giá mua và giá bán. Một chênh lệch có tính thay đổi nghĩa là sự \bkhác biệt liên tục thay đổi, tùy thuộc vào điều kiện thị trường. Một chênh lệch cố định \bcó thể giữ nguyên hoặc thay đổi, theo quyết định tuyệt đối của Broker.", + "2104397115": "Vui lòng đi tới cài đặt tài khoản và điền đầy đủ thông tin cá nhân của bạn để có thể nạp và rút tiền.", + "2107381257": "Bảo trì hệ thống cổng thanh toán theo lịch trình", + "2109312805": "Chênh lệch giá là sự khác biệt giữa giá mua và giá bán. Chênh lệch thả nổi nghĩa là sự \bkhác biệt này thay đổi liên tục, tùy thuộc vào điều kiện thị trường. Chênh lệch cố định \bcó thể giữ nguyên hoặc thay đổi, tùy theo quyết định của nhà môi giới.", "2110365168": "Đã đạt số giao dịch tối đa", - "2111015970": "\bKhung này giúp bạn kiểm tra nếu gói thầu của bạn có thể bán. Nếu hợp đồng của bạn có thể được bán, nó sẽ trả lại \"\bĐúng\". Nếu không, nó trả về một chuỗi rỗng.", - "2111528352": "Đặt một biến", - "2112119013": "Chụp một bức ảnh có mặt của bạn", + "2111015970": "\bKhung này giúp bạn kiểm tra xem liệu hợp đồng của bạn có thể bán hay không. Nếu hợp đồng của bạn có thể được bán, khung sẽ trả kết quả \"\bĐúng\". Nếu không, khung sẽ trả về một chuỗi rỗng.", + "2111528352": "Tạo một biến", + "2112119013": "Tự chụp ảnh chân dung có mặt của bạn", "2112175277": "với dấu phân cách", "2113321581": "Thêm tài khoản Deriv Gaming", - "2115223095": "Thua", - "2117073379": "Thu ngân tiền điện tử của chúng tôi tạm thời ngừng hoạt động do bảo trì hệ thống. Bạn có thể truy cập Thu ngân sau vài phút khi quá trình bảo trì hoàn tất.", - "2117165122": "1. Tạo một bot Telegram và nhận mã thông báo Telegram API của bạn. Đọc thêm vè cách tạo bot trong Telegram ở đây: https://core.telegram.org/bots#6-botfather", + "2115223095": "Lỗ", + "2117073379": "Cổng thanh toán tiền điện tử của chúng tôi tạm thời ngừng hoạt động do bảo trì hệ thống. Bạn có thể truy cập Cổng thanh toán sau vài phút khi quá trình bảo trì hoàn tất.", + "2117165122": "1. Tạo một bot Telegram và nhận mã thông báo Telegram API của bạn. Tìm hiểu thêm về cách tạo bot trong Telegram ở đây: https://core.telegram.org/bots#6-botfather", "2117489390": "Tự động cập nhật trong {{ remaining }} giây", "2118315870": "Bạn đang sống ở đâu?", - "2119449126": "Đầu ra của ví dụ dưới đây sẽ là:", + "2119449126": "Ví dụ đầu ra của ví dụ dưới đây là:", "2119710534": "Những câu hỏi thường gặp", - "2120617758": "Thiết lập cho giao dịch của bạn", + "2120617758": "Thiết lập giao dịch", "2121227568": "NEO/USD", "2122152120": "Tài sản", - "2127564856": "Rút tiền bị khóa", - "2131963005": "Vui lòng rút vốn của bạn khỏi (các) tài khoản Deriv MT5 sau:", + "2127564856": "Tính năng rút tiền bị khóa", + "2131963005": "Vui lòng rút tiền của bạn khỏi (các) tài khoản Deriv MT5 sau:", "2133451414": "Thời lượng", "2133470627": "Khung này trở về khoản chi trả tiềm năng cho loại giao dịch được chọn. Khung này chỉ được sử dụng cho khối gốc \"Điều kiện mua\".", - "2135563258": "Tần suất giao dịch ngoại hối", - "2136246996": "Ảnh tự chụp đã được tải lên", - "2137901996": "Điều này sẽ xóa tất cả dữ liệu trong bản tóm tắt, giao dịch và bảng nhật ký. Tất cả các thẻ sẽ được đặt lại về 0.", + "2135563258": "Tần suất giao dịch forex", + "2136246996": "Ảnh chân dung tự chụp đã được tải lên", + "2137901996": "Lệnh này sẽ xóa tất cả dữ liệu trong tóm tắt, giao dịch và nhật ký. Tất cả các thẻ sẽ được đặt lại về 0.", "2137993569": "Khung này so sánh hai giá trị và được sử dụng để xây dựng một cấu trúc có điều kiện.", - "2138861911": "Các bản scan và sao chép không được chấp nhận", - "2139171480": "Đặt lại Lên/Đặt lại Xuống", + "2138861911": "Không chấp nhận bản scan và photo", + "2139171480": "Đặt lại Lên/Đặt lại Xuống (Reset Up/Reset Down)", "2139362660": "bên trái", "2141055709": "Mật khẩu {{type}} mới", - "2141873796": "Nhận thêm thông tin về các tùy chọn <0>CFD, <1>cấp số nhân và <2>quyền chọn.", + "2141873796": "Nhận thêm thông tin về <0>CFD, <1>cấp số nhân và <2>quyền chọn.", "2143803283": "Lỗi Mua", - "2144609616": "Nếu bạn chọn \"Đặt lại-Xuống\", bạn sẽ thắng khi giá tại thời điểm chốt thấp hơn hẳn so với giá khởi điểm hoặc tại mốc thời điểm đặt lại.", + "2144609616": "Nếu bạn chọn \"Đặt lại-Xuống\", hợp đồng quyền chọn của bạn sẽ sinh lời khi giá thoát thấp hơn hẳn so với giá vào hoặc giá tại mốc thời điểm đặt lại.", "2145690912": "Thu nhập", "2145995536": "Tạo tài khoản mới", "2146336100": "trong văn bản %1 lấy %2", - "2146698770": "Mẹo chuyên nghiệp: Bạn cũng có thể nhấp và kéo ra khối mong muốn", + "2146698770": "Mẹo chuyên nghiệp: Bạn cũng có thể nhấp chọn và kéo khung mong muốn", "2146892766": "Kinh nghiệm giao dịch các quyền chọn nhị phân", - "-612174191": "Dòng địa chỉ đầu tiên là bắt buộc", + "-612174191": "Cần có thông tin dòng địa chỉ đầu tiên", "-242734402": "Vui lòng chỉ sử dụng {{max}} ký tự.", - "-378415317": "Yêu cầu phải có Bang", - "-1784470716": "Bang không ở định dạng thích hợp", - "-1699820408": "Vui lòng điền {{field_name}} không quá {{max_number}} ký tự.", - "-1575567374": "mã số bưu chính/ZIP", + "-378415317": "Cần có thông tin tỉnh/thành phố", + "-1784470716": "Tỉnh/thành phố không ở định dạng thích hợp", + "-1699820408": "Vui lòng điền tên {{field_name}} không quá {{max_number}} ký tự.", + "-1575567374": "mã số bưu chính/mã ZIP", "-1497654315": "Các tài khoản và dịch vụ của chúng tôi không khả dụng cho mã bưu chính Jersey.", - "-755626951": "Điền thông tin địa chỉ của bạn", + "-755626951": "Hoàn thành thông tin địa chỉ của bạn", "-1024240099": "Địa chỉ", "-584911871": "Chọn ví tiền tệ", "-1461267236": "Hãy chọn một loại tiền tệ", "-1352330125": "TIỀN TỆ", - "-1027595143": "Ít hơn $25,000", - "-40491332": "$25,000 - $50,000", - "-1139806939": "$50,001 - $100,000", - "-626752657": "0-1 năm", - "-532014689": "1-2 năm", + "-1027595143": "Ít hơn $25.000", + "-40491332": "$25.000 - $50.000", + "-1139806939": "$50.001 - $100.000", + "-626752657": "0 - 1 năm", + "-532014689": "1 - 2 năm", "-1001024004": "Trên 3 năm", - "-790513277": "6-10 giao dịch trong 12 tháng qua", - "-580085300": "11-39 giao dịch trong 12 tháng qua", - "-654781670": "Sơ cấp", - "-1717373258": "Thứ cấp", + "-790513277": "6 - 10 giao dịch trong 12 tháng qua", + "-580085300": "11 - 39 giao dịch trong 12 tháng qua", + "-654781670": "Tiểu học", + "-1717373258": "Cấp hai", "-996132458": "Xây dựng", "-915003867": "Sức khỏe", - "-1430012453": "Công nghệ thông tin & truyền thông", + "-1430012453": "Công nghệ thông tin & Truyền thông", "-987824916": "Khoa học & Kỹ Thuật", "-146630682": "Văn Hóa & Xã Hội", "-761306973": "Sản xuất", "-739367071": "Có việc làm", - "-1156937070": "$500,001 - $1,000,000", - "-315534569": "Hơn $1,000,000", + "-1156937070": "$500.001 - $1.000.000", + "-315534569": "Hơn $1.000.000", "-2068544539": "Nhân viên hưởng lương", "-531314998": "Đầu tư & Cổ tức", "-1235114522": "Trợ cấp", - "-1298056749": "Phụ Cấp Chính Phủ", - "-449943381": "Tiết Kiệm & Thừa Kế", - "-1631552645": "Các chuyên gia", + "-1298056749": "Phụ cấp chính phủ", + "-449943381": "Tiết kiệm & Thừa kế", + "-1631552645": "Chuyên gia", "-474864470": "Nhân viên chăm sóc khách hàng, bán hàng và dịch vụ", "-1129355784": "Nông, Lâm, Ngư nghiệp", "-1242914994": "Thợ thủ công, cơ khí và điện tử", @@ -1969,19 +1973,19 @@ "-2137323480": "Quyền sở hữu công ty", "-1590574533": "Thỏa Thuận Ly hôn", "-1667683002": "Thừa kế", - "-1237843731": "Thu nhập đầu tư", + "-1237843731": "Thu nhập từ đầu tư", "-777506574": "Bán tài sản", "-1232613003": "<0>Xác thực thất bại. <1>Tại sao?", "-2029508615": "<0>Cần xác thực.<1>Xác thực ngay", - "-1161338910": "Bắt buộc phải điền tên.", - "-1161818065": "Tên họ nên được viết trong khoảng từ 2 đến 50 ký tự.", - "-1281693513": "Yêu cầu ngày sinh.", - "-26599672": "Cần phải có chứng minh công dân", - "-912174487": "Bắt buộc phải có số điện thoại.", - "-673765468": "Chỉ các chữ cái, số, dấu cách, dấu chấm, dấu gạch nối và dấu gạch chéo.", - "-1356204661": "Mã số thuế (TIN) không hợp lệ. Bạn có thể tiếp tục tạo tài khoản, nhưng để thực hiện thanh toán sau này, bạn cần điền thông tin mã số thuế hợp lệ.", + "-1161338910": "Cần có tên của bạn.", + "-1161818065": "Họ nên từ 2 đến 50 ký tự.", + "-1281693513": "Cần có thông tin ngày sinh.", + "-26599672": "Cần thông tin công dân", + "-912174487": "Cần có số điện thoại.", + "-673765468": "Chỉ được dùng chữ cái, số, dấu cách, dấu chấm, dấu gạch nối và dấu gạch chéo.", + "-1356204661": "Mã số thuế không hợp lệ. Bạn có thể tiếp tục tạo tài khoản, nhưng để thực hiện thanh toán sau này, bạn cần điền thông tin mã số thuế hợp lệ.", "-1823540512": "Thông tin cá nhân", - "-1227878799": "Suy đoán", + "-1227878799": "Quan sát", "-1174064217": "Ông", "-855506127": "Cô", "-621555159": "Thông tin nhận dạng", @@ -2052,46 +2056,46 @@ "-1424436001": "Gửi đường dẫn", "-1093833557": "Cách quét mã QR", "-1408210605": "Chĩa máy quay trên điện thoại của bạn vào mã QR", - "-1773802163": "Nếu không hoạt động, tải một mã quét QR từ Google Play hoặc the App Store", + "-1773802163": "Nếu không hoạt động, tải mã quét QR từ Google Play hoặc App Store", "-109026565": "Quét mã QR", - "-1644436882": "Nhận đường dẫn qua SMS", + "-1644436882": "Nhận liên kết qua tin nhắn", "-1667839246": "Nhập số điện thoại", "-1533172567": "Nhập số điện thoại của bạn:", - "-1352094380": "Gửi đường dẫn giới hạn đến điện thoại của bạn", - "-28974899": "Nhận đường dẫn bảo mật của bạn", + "-1352094380": "Gửi liên kết sử dụng một lần đến điện thoại của bạn", + "-28974899": "Nhận liên kết bảo mật của bạn", "-359315319": "Tiếp tục", - "-1279080293": "2. Desktop của bạn vẫn đang mở", + "-1279080293": "2. Cửa sổ desktop của bạn vẫn đang mở", "-102776692": "Tiếp tục thực hiện xác minh", - "-89152891": "Chụp một bức ảnh mặt sau thẻ của bạn", - "-1646367396": "Chụp một bức ảnh mặt trước thẻ của bạn", - "-1350855047": "Chụp một bức ảnh mặt trước giấy phép của bạn", - "-2119367889": "Hãy chụp ảnh bằng chế độ máy ảnh cơ bản ", - "-342915396": "Chụp một bức ảnh", - "-419040068": "Ảnh trang hộ chiếu", + "-89152891": "Chụp ảnh mặt sau thẻ của bạn", + "-1646367396": "Chụp ảnh mặt trước thẻ của bạn", + "-1350855047": "Chụp ảnh mặt trước giấy phép của bạn", + "-2119367889": "Hãy chụp ảnh bằng chế độ máy ảnh cơ bản", + "-342915396": "Chụp ảnh", + "-419040068": "Trang hộ chiếu có ảnh", "-1354983065": "Làm mới", - "-1925063334": "Khôi phục quyền truy cập máy ảnh để tiếp tục xác minh khuôn mặt", - "-54784207": "Truy cập vào camera đã bị từ chối", - "-1392699864": "Cho phép truy cập vào máy quay", + "-1925063334": "Khôi phục quyền truy cập vào máy ảnh để tiếp tục xác minh khuôn mặt", + "-54784207": "Truy cập vào máy ảnh đã bị từ chối", + "-1392699864": "Cho phép truy cập vào máy ảnh", "-269477401": "Cung cấp toàn bộ trang tài liệu để có kết quả tốt nhất", - "-864639753": "Tải mặt sau thẻ của bạn từ máy tính", - "-1309771027": "Tải lên mặt trước của giấy phép từ máy tính của bạn", + "-864639753": "Tải lên ảnh chụp mặt sau thẻ của bạn từ máy tính", + "-1309771027": "Tải lên ảnh chụp mặt trước của giấy phép từ máy tính của bạn", "-1722060225": "Chụp ảnh", "-565732905": "Ảnh tự chụp", - "-1703181240": "Kiểm tra xem nó đã được kết nối và hoạt động chưa. Bạn cũng có thể tiếp tục xác minh trên điện thoại của mình", - "-2043114239": "Camera không hoạt động?", - "-2029238500": "Máy ảnh có thể bị ngắt kết nối. Thử dùng điện thoại thay thế.", - "-468928206": "Đảm bảo máy quay trên điện thoại của bạn vẫn hoạt động", - "-466246199": "Camera không hoạt động", + "-1703181240": "Kiểm tra xem máy ảnh đã được kết nối và hoạt động chưa. Bạn cũng có thể tiếp tục xác minh trên điện thoại của mình", + "-2043114239": "Máy ảnh không hoạt động?", + "-2029238500": "Máy ảnh có thể đã bị ngắt kết nối. Thử dùng điện thoại thay thế.", + "-468928206": "Đảm bảo máy ảnh trên điện thoại của bạn vẫn hoạt động", + "-466246199": "Máy ảnh không hoạt động", "-698978129": "Hãy nhớ nhấn dừng khi bạn đã xong. Làm lại đoạn phim hành động", "-538456609": "Có vẻ bạn đã mất quá nhiều thời gian", "-781816433": "Ảnh khuôn mặt của bạn", - "-1471336265": "Đảm bảo ảnh tự chụp của bạn hiển thị rõ ràng khuôn mặt của bạn", + "-1471336265": "Hãy đảm bảo ảnh tự chụp của bạn hiển thị rõ ràng khuôn mặt của bạn", "-1375068556": "Kiểm tra ảnh tự chụp", - "-1914530170": "Hướng về phía trước và đảm bảo rằng mắt bạn nhìn rõ", - "-776541617": "Chúng tôi sẽ so sánh chúng với các tài liệu của bạn", - "-478752991": "Đường dẫn của bạn sẽ hết hạn sau một giờ", - "-1859729380": "Để mở cửa sổ trình duyệt này khi bạn đang sử dụng điện thoại", - "-1283761937": "Gửi lại đường dẫn", + "-1914530170": "Hướng mặt về phía trước và đảm bảo rằng có thể nhìn rõ mắt bạn", + "-776541617": "Chúng tôi sẽ so sánh với giấy tờ của bạn", + "-478752991": "Đường liên kết của bạn sẽ hết hạn sau một giờ", + "-1859729380": "Để mở cửa sổ trình duyệt này khi bạn sử dụng điện thoại", + "-1283761937": "Gửi lại liên kết", "-629011256": "Đừng làm mới trang này", "-1005231905": "Một khi bạn đã hoàn thành chúng tôi sẽ đưa bạn đến bước tiếp theo", "-542134805": "Tải lên ảnh", @@ -2173,59 +2177,59 @@ "-2139303636": "Bạn có thể đã chọn một liên kết không hoạt động, hoặc trang web đã được chuyển đến một địa chỉ mới.", "-1448368765": "Lỗi: {{error_code}} không tìm thấy trang", "-1265833982": "Chấp nhận", - "-839094775": "Trở lại", - "-2145244263": "Trường này là bắt buộc", + "-839094775": "Quay lại", + "-2145244263": "Cần có thông tin này", "-254792921": "Bạn chỉ có thể nạp tiền tại thời điểm này. Để bật tính năng rút tiền, vui lòng hoàn tất đánh giá tài chính của bạn.", "-1437017790": "Thông tin tài chính", - "-70342544": "Chúng tôi có nghĩa vụ pháp lý phải yêu cầu các thông tin tài chính của bạn.", - "-1100235269": "Ngành nghề tuyển dụng", + "-70342544": "Nghĩa vụ pháp lý yêu cầu chúng tôi phải thu thập thông tin tài chính của bạn.", + "-1100235269": "Ngành nghề", "-684388823": "Tổng thu nhập ước tính", "-39038029": "Kinh nghiệm giao dịch", - "-601903492": "Kinh nghiệm giao dịch ngoại hối", + "-601903492": "Kinh nghiệm giao dịch forex", "-1012699451": "Kinh nghiệm giao dịch CFD", - "-1894668798": "Kinh nghiệm công cụ giao dịch khác", - "-1026468600": "Tần suất các công cụ giao dịch khác", + "-1894668798": "Kinh nghiệm giao dịch các công cụ khác", + "-1026468600": "Tần suất giao dịch các công cụ khác", "-179005984": "Lưu", "-307865807": "Cảnh báo về Khả năng chịu rủi ro", "-690100729": "Vâng, tôi hiểu rủi ro.", "-2010628430": "CFD và các công cụ tài chính khác gây nguy cơ mất tiền nhanh chóng do đòn bẩy cao. Bạn nên cân nhắc xem liệu bạn có hiểu cách CFD và các công cụ tài chính khác hoạt động và liệu bạn có đủ khả năng chịu rủi ro mất tiền cao hay không.<0/><0/> Để tiếp tục, bạn phải xác nhận rằng bạn hiểu bạn có rủi ro mất tiền.", "-863770104": "Xin lưu ý rằng khi nhấp vào 'OK', bạn đồng ý rằng bạn có nguy cơ đối mặt với rủi ro. Bạn có thể không có đủ kiến thức hoặc kinh nghiệm để đánh giá đúng hoặc giảm thiểu những rủi ro có thể là rất đáng kể này, bao gồm cả nguy cơ mất toàn bộ số tiền bạn đầu tư.", "-1292808093": "Kinh nghiệm trading", - "-884768257": "Bạn nên nhập vào 0-35 ký tự.", - "-2113555886": "Chỉ các chữ cái, số, dấu cách và dấu nối là được phép.", - "-874280157": "Mã số thuế (TIN) này không hợp lệ. Bạn có thể tiếp tục sử dụng nó, nhưng để tạo thuận lợi cho các quy trình thanh toán trong tương lai, thông tin thuế hợp lệ sẽ được yêu cầu.", + "-884768257": "Bạn nên nhập vào 0 - 35 ký tự.", + "-2113555886": "Chỉ được nhập chữ cái, số, dấu cách và dấu nối.", + "-874280157": "Mã số thuế này không hợp lệ. Bạn có thể tiếp tục sử dụng dịch vụ, nhưng để các quy trình thanh toán trong tương lai được thuận lợi, bạn cần điền thông tin thuế hợp lệ.", "-1037916704": "Cô", - "-634958629": "Chúng tôi chỉ sử dụng các thông tin bạn cung cấp cho việc xác minh danh tính. Tất cả các thông tin đều được chúng tôi giữ bí mật.", - "-731992635": "Quý Danh*", - "-352888977": "Quý Danh", + "-634958629": "Chúng tôi chỉ sử dụng các thông tin bạn cung cấp cho việc xác minh danh tính. Tất cả các thông tin đều sẽ được giữ bí mật.", + "-731992635": "Danh xưng*", + "-352888977": "Danh xưng", "-136976514": "Quốc gia cư trú*", - "-945104751": "Chúng tôi có nghĩa vụ pháp lý phải yêu cầu các thông tin thuế của bạn.", + "-945104751": "Nghĩa vụ pháp lý yêu cầu chúng tôi phải thu thập thông tin thuế của bạn.", "-1702919018": "Dòng địa chỉ thứ hai (tùy chọn)", - "-1124948631": "Khách hàng Chuyên nghiệp", - "-259515058": "Theo mặc định, tất cả khách hàng {{brand_website_name}} đều được coi là khách hàng bán lẻ nhưng bất kỳ ai cũng có thể gửi yêu cầu để được đối xử như là khách hàng chuyên nghiệp.", - "-1463348492": "Tôi muốn được đối xử như một khách hàng chuyên nghiệp.", + "-1124948631": "Trader chuyên nghiệp", + "-259515058": "Tất cả các khách hàng {{brand_website_name}} đều sẽ được mặc định là các trader mới, nhưng bạn có thể gửi yêu cầu để trở thành trader chuyên nghiệp.", + "-1463348492": "Tôi muốn được coi như là một trader chuyên nghiệp.", "-1958764604": "Tùy chọn email", - "-2121071263": "Đánh dấu vào ô để nhận tin cập nhập qua email.", + "-2121071263": "Đánh dấu vào ô này để nhận tin cập nhập qua email.", "-2068064150": "Nhận thông tin cập nhật về các sản phẩm, dịch vụ và sự kiện của Deriv.", - "-1558679249": "Vui lòng đảm bảo thông tin của bạn là chính xác hoặc nó có thể ảnh hưởng đến trải nghiệm giao dịch của bạn.", + "-1558679249": "Vui lòng đảm bảo thông tin của bạn là chính xác vì nó có thể ảnh hưởng đến trải nghiệm giao dịch của bạn.", "-1822545742": "Ether Classic", "-1334641066": "Litecoin", - "-1214036543": "Đô Mỹ", - "-1782590355": "Chưa có đơn vị tiền tệ nào được chọn cho tài khoản này", - "-2116332353": "Vui lòng đóng các đơn hàng của bạn cho (các) tài khoản Deriv sau:", + "-1214036543": "Đô la Mỹ", + "-1782590355": "Bạn chưa chọn đơn vị tiền tệ cho tài khoản này", + "-2116332353": "Vui lòng đóng các giao dịch của bạn trong (các) tài khoản Deriv sau:", "-2048005267": "{{number_of_positions}} vị trí", - "-1923892687": "Vui lòng rút vốn của bạn khỏi (các) tài khoản Deriv X sau:", + "-1923892687": "Vui lòng rút tiền của bạn khỏi (các) tài khoản Deriv X sau:", "-1629894615": "Tôi có những ưu tiên tài chính khác.", - "-844051272": "Tôi muốn ngăn mình tham gia giao dịch.", + "-844051272": "Tôi muốn tự ngăn bản thân khỏi tham gia giao dịch.", "-1113965495": "Tôi không còn hứng thú tham gia giao dịch.", "-1224285232": "Dịch vụ chăm sóc khách hàng không đạt yêu cầu.", "-9323953": "Các ký tự còn lại: {{remaining_characters}}", - "-2061895474": "Đóng tài khoản của bạn sẽ tự động đăng xuất bạn. Chúng tôi sẽ xóa thông tin cá nhân của bạn ngay sau khi các nghĩa vụ pháp lý của chúng tôi được đáp ứng.", + "-2061895474": "Khi đóng tài khoản, tài khoản của bạn sẽ tự động đăng xuất. Chúng tôi sẽ xóa thông tin cá nhân của bạn ngay sau khi các nghĩa vụ pháp lý của chúng tôi được đáp ứng.", "-203298452": "Đóng tài khoản", "-937707753": "Quay lại", "-1219849101": "Vui lòng chọn ít nhất một lý do", "-484540402": "Đã xảy ra lỗi", - "-1911549768": "Tài khoản MT5 không thể truy cập", + "-1911549768": "(Các) tài khoản MT5 không thể truy cập", "-1869355019": "Hành động cần làm", "-1030102424": "Bạn không thể trading trên Deriv.", "-448385353": "Bạn không thể thực hiện bất kỳ giao dịch nào khác.", @@ -2304,8 +2308,8 @@ "-989216986": "Thêm tài khoản", "-617480265": "Xóa mã thông báo", "-316749685": "Bạn có chắc chắn muốn xóa mã thông báo này không?", - "-786372363": "Tìm hiểu thêm về token API", - "-55560916": "Để truy cập vào các ứng dụng di động của chúng tôi và các ứng dụng của bên thứ ba, bạn cần phải tạo ra một mã token API.", + "-786372363": "Tìm hiểu thêm về API token", + "-55560916": "Để truy cập vào các ứng dụng di động của chúng tôi và các ứng dụng của bên thứ ba, bạn cần phải tạo ra một mã API token.", "-198329198": "Mã API Token", "-955038366": "Sao chép mã thông báo này", "-1668692965": "Ẩn mã thông báo này", @@ -2313,55 +2317,55 @@ "-605778668": "Chưa bao giờ", "-1628008897": "Mã Token", "-1238499897": "Lần sử dụng cuối cùng", - "-1171226355": "Độ dài của tên mã liên kết phải từ {{MIN_TOKEN}} đến {{MAX_TOKEN}} ký tự.", + "-1171226355": "Độ dài của tên mã thông báo phải từ {{MIN_TOKEN}} đến {{MAX_TOKEN}} ký tự.", "-1803339710": "Tối đa {{MAX_TOKEN}} ký tự.", "-408613988": "Chọn phạm vi cho quyền hạn dựa theo nhu cầu của bạn.", "-5605257": "Cho phép ứng dụng của bên thứ ba rút tiền cho đại lý thanh toán và thực hiện chuyển khoản giữa các tài khoản cho bạn.", "-1373485333": "Cho phép các ứng dụng của bên thứ ba xem lịch sử giao dịch của bạn.", "-758221415": "Cho phép ứng dụng của bên thứ ba mở tài khoản, quản lý cài đặt, sử dụng mã thông báo của bạn và nhiều quyền khác nữa. ", "-1117963487": "Đặt tên cho mã token rồi nhấp \"Tạo mới\" để tạo mã token của bạn.", - "-2005211699": "Tạo mới", + "-2005211699": "Tạo", "-2115275974": "CFD", "-1879666853": "Deriv MT5", - "-460645791": "Bạn bị giới hạn ở một tài khoản tiền pháp định. Bạn sẽ không thể thay đổi đơn vị tiền tệ trong tài khoản của mình nếu bạn đã thực hiện khoản tiền gửi đầu tiên hoặc tạo tài khoản {{dmt5_label}} thực.", + "-460645791": "Bạn chỉ được có một tài khoản tiền pháp định. Bạn sẽ không thể thay đổi đơn vị tiền tệ trong tài khoản của mình nếu bạn đã nạp tiền hoặc đã tạo tài khoản {{dmt5_label}} thực.", "-1146960797": "Tiền tệ pháp định", "-1959484303": "Tiền điện tử", - "-561724665": "Bạn chỉ được giới hạn sử dụng một loại tiền pháp định", - "-2087317410": "Ối, đã xảy ra lỗi.", + "-561724665": "Bạn chỉ được có một tài khoản tiền pháp định", + "-2087317410": "Đã xảy ra lỗi.", "-509054266": "Dự đoán doanh thu lợi nhuận", "-1117345066": "Chọn loại giấy tờ", "-651192353": "Ví dụ:", - "-1044962593": "Tải lên tài liệu", + "-1044962593": "Tải lên giấy tờ", "-164448351": "Ẩn", "-1361653502": "Hiển thị thêm", - "-337620257": "Chuyển tới tài khoản thực", + "-337620257": "Chuyển sang tài khoản thực", "-2120454054": "Thêm một tài khoản thực", "-38915613": "Các thay đổi chưa lưu", "-2137450250": "Bạn có nhiều thay đổi chưa được lưu. Bạn có chắc chắn muốn loại bỏ các thay đổi và rời khỏi trang này?", "-1067082004": "Thoát cài đặt", "-1982432743": "Địa chỉ trong giấy tờ của bạn không khớp với địa chỉ trong hồ sơ Deriv. Vui lòng cập nhật thông tin cá nhân của bạn ngay bây giờ với địa chỉ chính xác.", "-1451334536": "Tiếp tục giao dịch", - "-1525879032": "Tài liệu để chứng minh địa chỉ đã hết hạn. Vui lòng gửi lại.", - "-1425489838": "Không cần giấy tờ xác minh địa chỉ", - "-1008641170": "Tài khoản của bạn không cần xác minh địa chỉ vào lúc này. Chúng tôi sẽ thông báo cho bạn nếu cần xác minh địa chỉ trong tương lai.", - "-60204971": "Chúng tôi không thể xác minh bằng xác nhận địa chỉ của bạn", - "-1944264183": "Để tiếp tục giao dịch, bạn cũng cần gửi xác nhận địa chỉ.", - "-1088324715": "Chúng tôi sẽ xem xét tài liệu và thông báo cho bạn về tình trạng của nó trong vòng 1 - 3 ngày.", + "-1525879032": "Giấy tờ xác thực địa chỉ đã hết hạn. Vui lòng gửi lại.", + "-1425489838": "Không cần giấy tờ xác thực địa chỉ", + "-1008641170": "Tài khoản của bạn không cần xác minh địa chỉ vào lúc này. Chúng tôi sẽ thông báo đến bạn nếu cần xác minh địa chỉ trong tương lai.", + "-60204971": "Chúng tôi không thể xác minh địa chỉ của bạn", + "-1944264183": "Để tiếp tục giao dịch, bạn cần gửi giấy tờ xác thực địa chỉ.", + "-1088324715": "Chúng tôi sẽ xem xét giấy tờ của bạn và thông báo tình trạng trong vòng 1 - 3 ngày.", "-329713179": "Ok", "-1926456107": "ID mà bạn nhập đã hết hạn.", - "-555047589": "Có vẻ giấy tờ định danh của bạn đã hết hạn. Vui lòng thử lại với một văn bản hợp lệ.", + "-555047589": "Có vẻ giấy tờ tùy thân của bạn đã hết hạn. Vui lòng gửi lại giấy tờ hợp lệ.", "-841187054": "Thử lại", - "-2097808873": "Chúng tôi không thể xác minh ID của bạn với các chi tiết bạn đã cung cấp. ", - "-228284848": "Chúng tôi không thể xác minh ID của bạn với các chi tiết bạn đã cung cấp.", - "-1391934478": "ID của bạn đã được xác minh. Bạn cũng sẽ cần phải gửi bằng chứng về địa chỉ của mình.", - "-118547687": "Xác minh ID đã được thông qua", - "-200989771": "Đi đến chi tiết cá nhân", - "-1358357943": "Vui lòng kiểm tra và cập nhật mã bưu điện trước khi bạn nộp chứng minh danh tính của mình.", + "-2097808873": "Chúng tôi không thể xác minh danh tính của bạn với các thông tin bạn đã cung cấp. ", + "-228284848": "Chúng tôi không thể xác minh danh tính của bạn với các thông tin bạn đã cung cấp.", + "-1391934478": "Danh tính của bạn đã được xác minh. Bạn cũng sẽ cần phải gửi giấy tờ xác thực địa chỉ của mình.", + "-118547687": "Danh tính đã được xác thực", + "-200989771": "Đi đến thông tin cá nhân", + "-1358357943": "Vui lòng kiểm tra và cập nhật mã bưu điện trước khi bạn gửi giấy tờ xác thực danh tính của mình.", "-1401994581": "Thông tin cá nhân của bạn bị thiếu", - "-2004327866": "Vui lòng chọn quốc gia đã cấp phát tài liệu hợp lệ.", + "-2004327866": "Vui lòng chọn quốc gia đã cấp giấy tờ hợp lệ.", "-1664159494": "Quốc gia", "-749870311": "Vui lòng liên hệ với chúng tôi qua <0>live chat.", - "-1084991359": "Không cần giấy tờ xác minh danh tính", + "-1084991359": "Không cần giấy tờ xác thực danh tính", "-1981334109": "Tài khoản của bạn không cần xác minh danh tính vào lúc này. Chúng tôi sẽ thông báo cho bạn nếu cần xác minh danh tính trong tương lai.", "-182918740": "Chứng minh danh tính bạn nộp bị thất bại do:", "-246893488": "JPEG, JPG, PNG, PDF hoặc GIF", @@ -2413,20 +2417,20 @@ "-547557964": "Chúng tôi không thể gửi email đến địa chỉ này (Thông thường vì tường lửa hoặc bộ lọc).", "-142444667": "Vui lòng nhấp vào đường dẫn liên kết trong email của bạn để đổi mật khẩu Deriv MT5.", "-742748008": "Kiểm tra email của bạn và nhấp vào liên kết trong email để tiếp tục.", - "-84068414": "Vẫn không nhận được email? Vui lòng liên hệ với chúng tôi qua <0>trò chuyện trực tiếp.", - "-428335668": "Bạn sẽ cần phải đặt một mật khẩu để hoàn tất quy trình.", + "-84068414": "Bạn vẫn không nhận được email? Vui lòng liên hệ với chúng tôi qua <0>live chat.", + "-428335668": "Bạn sẽ cần phải đặt mật khẩu để hoàn tất quy trình.", "-1743024217": "Chọn ngôn ngữ", "-30772747": "Thông tin cá nhân của bạn đã được lưu thành công.", "-1107320163": "Tự động hoá giao dịch của bạn. Không cần kiến thức về lập trình.", "-829643221": "Nền tảng giao dịch Cấp số nhân.", "-1585707873": "Financial Commission", - "-199154602": "Ủy ban Dịch vụ Tài chính Vanuatu", + "-199154602": "Vanuatu Financial Services Commission", "-191165775": "Malta Financial Services Authority", - "-194969520": "Công ty Counterparty", - "-1089385344": "Deriv LLC (SVG)", + "-194969520": "Công ty đối tác", + "-1089385344": "Deriv (SVG) LLC", "-2019617323": "Deriv (BVI) Ltd", "-112814932": "Deriv (FX) Ltd", - "-1131400885": "Công ty Derov Investments (Châu Âu)", + "-1131400885": "Deriv Investments (Europe) Limited", "-1471207907": "Tất cả tài sản", "-781132577": "Đòn bẩy", "-1591882610": "Chỉ số tổng hợp", @@ -2443,8 +2447,8 @@ "-1145604233": "Giao dịch CFD trên MT5 với các chỉ số Mô phỏng — phỏng theo các biến động của thị trường thực.", "-328128497": "Tài chính", "-1484404784": "Giao dịch CFD trên MT5 với thị trường forex, chỉ số chứng khoán, hàng hóa và tiền điện tử.", - "-659955365": "Miễn phí qua đêm", - "-133406819": "Trade dịch CFD miễn phí qua đêm trên MT5 với tổng hợp, ngoại hối, chứng khoán, chỉ số chứng khoán, cryptocurrencies và ETF.", + "-659955365": "Không phí qua đêm", + "-133406819": "Giao dịch CFD không phí qua đêm trên MT5 với chỉ số tổng hợp, forex, chứng khoán, chỉ số chứng khoán, tiền điện tử và ETF.", "-1210359945": "Chuyển tiền vào tài khoản của bạn", "-81256466": "Bạn cần một tài khoản Deriv để tạo một tài khoản CFD.", "-699372497": "Giao dịch với đòn bẩy và chênh lệch giá thấp để có lợi nhuận cao hơn. <0>Tìm hiểu thêm", @@ -2467,7 +2471,7 @@ "-1814994113": "CFD <0>{{compare_accounts_title}}", "-318106501": "Giao dịch CFD trên MT5 với các chỉ số tổng hợp, giỏ chỉ số và giao dịch mô phỏng thị trường FX.", "-1328701106": "Giao dịch CFD trên MT5 với forex, cổ phiếu, chỉ số chứng khoán, chỉ số tổng hợp, tiền điện tử và hàng hóa.", - "-2146691203": "Lựa chọn quy định", + "-2146691203": "Lựa chọn giám sát", "-249184528": "Bạn có thể tạo tài khoản thực theo quy định của châu Âu hoặc theo quy định của các nước không thuộc châu Âu. Nhấp vào biểu tượng <0><0/> để tìm hiểu thêm về các tài khoản này.", "-1505234170": "Khám phá Trader's Hub", "-181080141": "Khám phá trading hub", @@ -2482,25 +2486,25 @@ "-514389291": "<0>Tuyên bố từ chối trách nhiệm theo luật EU: CFD là công cụ phức tạp và có nguy cơ mất tiền nhanh chóng do đòn bẩy. <0>71% tài khoản nhà đầu tư lẻ bị mất tiền khi giao dịch CFD với nhà cung cấp này. Bạn nên cân nhắc liệu bạn có hiểu cách hoạt động của CFD và liệu bạn có đủ khả năng chấp nhận rủi ro mất tiền cao hay không.", "-1975494965": "Cổng thanh toán", "-1787304306": "Deriv P2P", - "-2021135479": "Trường này là bắt buộc.", - "-1870909526": "Máy chủ của chúng tôi không thể thu hồi một địa chỉ.", - "-582721696": "Số tiền được phép rút hiện tại là {{format_min_withdraw_amount}} đến {{format_max_withdraw_amount}} {{currency}}", + "-2021135479": "Cần có thông tin này.", + "-1870909526": "Máy chủ của chúng tôi không thể thu hồi địa chỉ.", + "-582721696": "Số tiền được phép rút hiện tại là từ {{format_min_withdraw_amount}} đến {{format_max_withdraw_amount}} {{currency}}", "-42592103": "Nạp tiền điện tử", - "-60779216": "Rút tiền tạm thời không khả dụng do bảo trì hệ thống. Bạn có thể rút tiền khi quá trình bảo trì hoàn tất.", - "-215186732": "Bạn chưa cài đặt quốc gia cư trú của mình. Để truy cập thu ngân, vui lòng cập nhật quốc gia cư trú của bạn trong phần Chi tiết cá nhân trong cài đặt tài khoản của bạn.", - "-1392897508": "Các giấy tờ tùy thân bạn gửi đã hết hạn. Vui lòng xuất trình giấy tờ tùy thân hợp lệ để mở khóa Thu ngân. ", - "-954082208": "Tính năng cashier của bạn hiện đang bị khóa. Vui lòng liên hệ với chúng tôi qua <0>live chat để được hướng dẫn cách mở khóa.", - "-929148387": "Vui lòng cài đặt đơn vị tiền tệ cho tài khoản của bạn để cho phép gửi tiền và rút tiền.", - "-541392118": "Tài khoản của bạn chưa được xác thực. Vui lòng gửi <0>bằng chứng nhận dạng và <1>bằng chứng địa chỉ để xác thực tài khoản và truy cập vào thu ngân của bạn.", - "-247122507": "Thu ngân của bạn bị khóa. Vui lòng hoàn thành <0>đánh giá tài chính để mở khóa.", - "-1443721737": "Thu ngân của bạn bị khóa. Xem <0>cách chúng tôi bảo vệ tiền của bạn trước khi bạn tiếp tục.", - "-901712457": "Quyền truy cập của bạn vào Thu ngân tạm thời bị vô hiệu hóa do bạn chưa đặt giới hạn doanh thu trong 30 ngày của mình. Vui lòng chuyển đến <0>Tự loại trừ và đặt giới hạn doanh thu trong 30 ngày của bạn.", - "-166472881": "<0>chi tiết cá nhân của bạn không đầy đủ. Vui lòng chuyển đến cài đặt tài khoản của bạn và điền đầy đủ thông tin cá nhân của bạn để có thể gửi tiền và rút tiền.", - "-666905139": "Tiền gửi bị khóa", - "-378858101": "<0>chi tiết cá nhân của bạn không đầy đủ. Vui lòng đi tới cài đặt tài khoản của bạn và điền đầy đủ thông tin cá nhân của bạn để có thể gửi tiền.", - "-1318742415": "Tài khoản của bạn chưa được xác thực. Vui lòng gửi <0>bằng chứng nhận dạng và <1>bằng chứng địa chỉ để xác thực tài khoản của bạn và làm yêu cầu rút tiền.", - "-1923809087": "Thật không may, bạn chỉ có thể nạp tiền. Vui lòng liên hệ với chúng tôi qua <0>live chat để kích hoạt tính năng rút tiền.", - "-172277021": "Cashier bị khóa để rút tiền", + "-60779216": "Tạm thời không thể rút tiền do bảo trì hệ thống. Bạn có thể rút tiền khi quá trình bảo trì hoàn tất.", + "-215186732": "Bạn chưa cài đặt quốc gia cư trú của mình. Để truy cập vào cổng thanh toán, vui lòng cập nhật quốc gia cư trú ở phần thông tin cá nhân trong cài đặt tài khoản của bạn.", + "-1392897508": "Các giấy tờ tùy thân bạn gửi đã hết hạn. Vui lòng gửi giấy tờ tùy thân hợp lệ để mở khóa Cổng thanh toán. ", + "-954082208": "Cổng thanh toán của bạn hiện đang bị khóa. Vui lòng liên hệ với chúng tôi qua <0>live chat để được hướng dẫn cách mở khóa.", + "-929148387": "Vui lòng cài đặt đơn vị tiền tệ cho tài khoản của bạn để được nạp và rút tiền.", + "-541392118": "Tài khoản của bạn chưa được xác thực. Vui lòng gửi <0>giấy tờ xác thực danh tính và <1>giấy tờ xác thực địa chỉ để xác thực tài khoản và truy cập vào cổng thanh toán của bạn.", + "-247122507": "Cổng thanh toán của bạn đã bị khóa. Vui lòng hoàn thành <0>đánh giá tài chính để mở khóa.", + "-1443721737": "Cổng thanh toán của bạn đã bị khóa. Hãy xem <0>cách chúng tôi bảo vệ tiền của bạn trước khi tiếp tục.", + "-901712457": "Quyền truy cập của bạn vào cổng thanh toán tạm thời bị vô hiệu hóa do bạn chưa đặt giới hạn doanh thu trong 30 ngày của mình. Vui lòng đi tới <0>Tự ngăn giao dịch và đặt giới hạn doanh thu trong 30 ngày của bạn.", + "-166472881": "<0>Thông tin cá nhân của bạn không đầy đủ. Vui lòng đi tới cài đặt tài khoản và điền đầy đủ thông tin cá nhân để có thể nạp và rút tiền.", + "-666905139": "Tính năng nạp tiền đã bị khóa", + "-378858101": "<0>Thông tin cá nhân của bạn không đầy đủ. Vui lòng đi tới cài đặt tài khoản và điền đầy đủ thông tin cá nhân để có thể nạp tiền.", + "-1318742415": "Tài khoản của bạn chưa được xác thực. Vui lòng gửi <0>giấy tờ xác thực danh tính và <1>giấy tờ xác thực địa chỉ để xác thực tài khoản và yêu cầu rút tiền.", + "-1923809087": "Rất tiếc, bạn chỉ có thể nạp tiền. Vui lòng liên hệ với chúng tôi qua <0>live chat để kích hoạt tính năng rút tiền.", + "-172277021": "Cổng thanh toán đã khóa tính năng rút tiền", "-1624999813": "Có vẻ như bạn không có hoa hồng để rút vào lúc này. Bạn có thể rút tiền khi bạn nhận được hoa hồng của bạn.", "-1077304626": "Số lượng ({{currency}})", "-1559994981": "Giá trị gần đúng", @@ -2544,35 +2548,35 @@ "-1062841150": "Việc rút tiền của bạn không thành công do lỗi trên chuỗi khối. Vui lòng <0>liên hệ với chúng tôi qua chat trực tuyến để biết thêm thông tin.", "-630780094": "Chúng tôi đang chờ xác nhận từ chuối khối.", "-1525882769": "Khoản tiền rút của bạn được thực hiện không thành công. Chúng tôi đã gửi cho bạn một email với thông tin chi tiết hơn.", - "-298601922": "Khoản tiền rút của bạn đã được thực hiện thành công.", + "-298601922": "Bạn đã rút tiền thành công.", "-1463156905": "Tìm hiểu thêm về các phương thức thanh toán", - "-2013448791": "Bạn muốn trao đổi giữa các ví tiền? Hãy thử <0>Ewallet.Exchange", - "-1547606079": "Chúng tôi chấp nhận các loại tiền kỹ thuật số sau:", - "-1517325716": "Gửi tiền qua các phương thức thanh toán sau:", - "-639677539": "Mua tiền kỹ thuật số", - "-1560098002": "Mua tiền kỹ thuật số qua dịch vụ trao đổi tiền pháp định", - "-541870313": "Gửi tiền qua đại lý thanh toán", + "-2013448791": "Bạn muốn chuyển tiền giữa các ví điện tử? Hãy thử <0>Ewallet.Exchange", + "-1547606079": "Chúng tôi chấp nhận các loại tiền điện tử sau:", + "-1517325716": "Nạp tiền qua các phương thức thanh toán sau:", + "-639677539": "Mua tiền điện tử", + "-1560098002": "Mua tiền điện tử qua dịch vụ trao đổi tiền pháp định", + "-541870313": "Nạp tiền qua đại lý thanh toán", "-474666134": "Đây là tài khoản {{currency_code}} của bạn {{loginid}}", - "-197251450": "Bạn không muốn giao dịch bằng {{currency_code}}? Bạn có thể mở một tài khoản tiền kỹ thuật số khác.", + "-197251450": "Bạn không muốn giao dịch bằng {{currency_code}}? Bạn có thể mở một tài khoản tiền điện tử khác.", "-781389987": "Đây là tài khoản {{regulation_text}} {{currency_code}} của bạn {{loginid}}", - "-1068036170": "Chúng tôi không tính phí chuyển tiền đối với các giao dịch chuyển tiền bằng cùng một loại tiền tệ giữa tài khoản tiền pháp định Deriv và {{platform_name_mt5}} cũng như giữa tài khoản tiền pháp định Deriv và {{platform_name_dxtrade}}.", - "-2056016338": "Bạn sẽ không bị tính phí chuyển tiền đối với các chuyển khoản bằng cùng một loại tiền tệ giữa tài khoản Deriv fiat và {{platform_name_mt5}} của mình.", - "-599632330": "Chúng tôi sẽ tính phí chuyển khoản 1% đối với các giao dịch chuyển tiền bằng các đơn vị tiền tệ khác nhau giữa tài khoản tiền pháp định Deriv và {{platform_name_mt5}} cũng như giữa tài khoản tiền pháp định Deriv và {{platform_name_dxtrade}}.", - "-1196994774": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo mức nào cao hơn, đối với chuyển khoản giữa các tài khoản tiền kỹ thuật số Deriv của bạn.", - "-1361372445": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo cách tính nào có giá trị cao hơn, đối với việc chuyển tiền giữa tài khoản tiền điện tử Deriv và các tài khoản Deriv MT5, giữa tài khoản tiền điện tử Deriv và các tài khoản {{platform_name_derivez}}, giữa tài khoản tiền điện tử Deriv và các tài khoản {{platform_name_dxtrade}} của bạn.", + "-1068036170": "Chúng tôi không tính phí chuyển tiền đối với các giao dịch chuyển tiền cùng một loại tiền tệ giữa tài khoản tiền pháp định Deriv và tài khoản {{platform_name_mt5}} cũng như giữa tài khoản tiền pháp định Deriv và tài khoản {{platform_name_dxtrade}}.", + "-2056016338": "Bạn sẽ không bị tính phí chuyển tiền khi chuyển khoản cùng một loại tiền tệ giữa tài khoản Deriv tiền pháp định và tài khoản {{platform_name_mt5}} của mình.", + "-599632330": "Chúng tôi sẽ tính phí chuyển khoản 1% đối với các giao dịch chuyển tiền giữa các đơn vị tiền tệ khác nhau giữa tài khoản tiền pháp định Deriv và tài khoản {{platform_name_mt5}} cũng như giữa tài khoản tiền pháp định Deriv và tài khoản {{platform_name_dxtrade}}.", + "-1196994774": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo mức nào cao hơn, đối với giao dịch chuyển khoản giữa các tài khoản tiền điện tử Deriv.", + "-1361372445": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo cách tính nào có giá trị cao hơn, đối với giao dịch chuyển tiền giữa tài khoản tiền điện tử Deriv và các tài khoản Deriv MT5, giữa tài khoản tiền điện tử Deriv và các tài khoản {{platform_name_derivez}}, giữa tài khoản tiền điện tử Deriv và các tài khoản {{platform_name_dxtrade}} của bạn.", "-993556039": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo mức nào cao hơn, đối với chuyển khoản giữa tài khoản tiền điện tử Deriv và tài khoản Deriv MT5 cũng như giữa tài khoản tiền điện tử Deriv và tài khoản {{platform_name_dxtrade}} của bạn.", "-1382702462": "Chúng tôi sẽ tính phí chuyển khoản 2% hoặc {{minimum_fee}} {{currency}}, tùy theo mức nào cao hơn, đối với chuyển khoản giữa tài khoản tiền điện tử Deriv và tài khoản Deriv MT5 của bạn.", - "-1995859618": "Bạn có thể chuyển khoản giữa các tài khoản Deriv fiat, tiền điện tử, {{platform_name_mt5}}, {{platform_name_derivez}} và {{platform_name_dxtrade}} của bạn.", + "-1995859618": "Bạn có thể chuyển khoản giữa các tài khoản Deriv tiền pháp định, tiền điện tử, {{platform_name_mt5}}, {{platform_name_derivez}} và {{platform_name_dxtrade}} của bạn.", "-545616470": "Mỗi ngày, bạn có thể chuyển khoản tối đa {{ allowed_internal }} giữa các tài khoản Deriv của bạn, tối đa {{ allowed_mt5 }} giữa tài khoản Deriv và các tài khoản {{platform_name_mt5}}, tối đa {{ allowed_derivez }} giữa tài khoản Deriv và các tài khoản {{platform_name_derivez}}, và tối đa {{ allowed_dxtrade }} giữa tài khoản Deriv và các tài khoản {{platform_name_dxtrade}} của bạn.", "-1151983985": "Giới hạn chuyển khoản có thể thay đổi tùy thuộc vào tỷ giá hối đoái.", "-1747571263": "Xin lưu ý rằng một số chuyển khoản có thể không thực hiện được.", - "-757062699": "Việc chuyển tiền có thể không khả dụng do sự biến động cao hoặc các vấn đề kỹ thuật và khi thị trường hối đoái đóng cửa.", + "-757062699": "Việc chuyển tiền có thể không khả dụng do biến động giá cao, có vấn đề kỹ thuật và khi thị trường forex đóng cửa.", "-1344870129": "Tài khoản Deriv", "-1156059326": "Bạn còn {{number}} lượt chuyển khoản trong hôm nay.", "-1109729546": "Bạn sẽ có thể chuyển tiền giữa các tài khoản MT5 và các tài khoản khác sau khi địa chỉ của bạn được xác minh.", "-1593609508": "Chuyển khoản giữa các tài khoản của bạn trong Deriv", "-464965808": "Giới hạn chuyển khoản: <0 /> - <1 />", - "-553249337": "Chuyển tiền bị khóa", + "-553249337": "Tính năng chuyển tiền đã bị khóa", "-1638172550": "Để kích hoạt tính năng này, bạn phải hoàn thành các bước sau:", "-1949883551": "Bạn chỉ có một tài khoản", "-1149845849": "Quay lại Trader's Hub", @@ -2582,17 +2586,17 @@ "-410890127": "Ethereum (ERC20)", "-1059526741": "Ethereum (ETH)", "-1615615253": "Chúng tôi không hỗ trợ Tron, để gửi tiền, vui lòng chỉ sử dụng Ethereum ({{token}}).", - "-1831000957": "Vui lòng chọn mạng mà tiền gửi của bạn sẽ chuyển từ đó.", + "-1831000957": "Vui lòng chọn nơi mà bạn sẽ nạp tiền.", "-314177745": "Rất tiếc, chúng tôi không thể lấy được địa chỉ vì máy chủ của chúng tôi không hoạt động. Vui lòng nhấp vào Làm mới để tải lại địa chỉ hoặc thử lại sau.", - "-1345040662": "Đang tìm kiếm một cách để mua tiền điện tử?", - "-759000391": "Chúng tôi không thể tự động xác minh thông tin của bạn. Để bật chức năng này, bạn phải hoàn thành các bước sau:", - "-1632668764": "Tôi chấp nhận", - "-544232635": "Vui lòng truy cập trang Nạp tiền để tạo một địa chỉ. Sau đó quay lại đây để tiếp tục giao dịch của bạn.", - "-1161069724": "Vui lòng sao chép địa chỉ tiền điện tử bạn thấy bên dưới. Bạn sẽ cần nó để nạp tiền điện tử của mình.", + "-1345040662": "Bạn đang tìm cách để mua tiền điện tử?", + "-759000391": "Chúng tôi không thể xác minh thông tin của bạn tự động. Để bật chức năng này, bạn phải hoàn thành các bước sau:", + "-1632668764": "Chấp nhận", + "-544232635": "Vui lòng đi tới trang Nạp tiền để tạo một địa chỉ. Sau đó quay lại đây để tiếp tục giao dịch của bạn.", + "-1161069724": "Vui lòng sao chép địa chỉ tiền điện tử bạn thấy bên dưới. Bạn sẽ cần nó để nạp tiền điện tử.", "-1388977563": "Đã sao chép!", - "-1962894999": "Địa chỉ này chỉ có thể được sử dụng MỘT LẦN. Vui lòng sao chép một cái mới cho giao dịch tiếp theo của bạn.", - "-451858550": "Bằng cách nhấp vào 'Tiếp tục', bạn sẽ được chuyển hướng đến {{ service }}, một nhà cung cấp dịch vụ thanh khoản bên thứ ba. Xin lưu ý rằng {{ website_name }} không chịu trách nhiệm cho các nội dung hoặc dịch vụ được cung cấp bởi {{ service }}. Nếu bạn gặp bất kỳ sự cố nào liên quan đến các dịch vụ của {{ service }}, bạn phải liên hệ trực tiếp với {{ service }}.", - "-2005265642": "Fiat onramp là một dịch vụ thu ngân cho phép bạn đổi tiền pháp định sang tiền điện tử để nạp vào tài khoản tiền điện tử Deriv của bạn. Được liệt kê ở đây là các sàn giao dịch tiền điện tử của bên thứ ba. Bạn sẽ cần tạo một tài khoản với họ để sử dụng dịch vụ của họ.", + "-1962894999": "Địa chỉ này chỉ có thể sử dụng MỘT LẦN. Vui lòng sao chép một cái mới cho giao dịch tiếp theo của bạn.", + "-451858550": "Bằng cách nhấp vào 'Tiếp tục', bạn sẽ được chuyển tới {{ service }}, một nhà cung cấp dịch vụ thanh toán bên thứ ba. Xin lưu ý rằng {{ website_name }} không chịu trách nhiệm cho các nội dung hoặc dịch vụ được cung cấp bởi {{ service }}. Nếu bạn gặp bất kỳ sự cố nào liên quan đến các dịch vụ của {{ service }}, bạn phải liên hệ trực tiếp với {{ service }}.", + "-2005265642": "Fiat onramp là một dịch vụ thanh toán cho phép bạn đổi tiền pháp định sang tiền điện tử để nạp vào tài khoản tiền điện tử Deriv của bạn. Danh sách liệt kê ở đây là các sàn giao dịch tiền điện tử của bên thứ ba. Bạn sẽ cần tạo một tài khoản với họ để sử dụng dịch vụ.", "-1593063457": "Chọn kênh thanh toán", "-1309258714": "Từ số tài khoản", "-1247676678": "Đến số tài khoản", @@ -2629,6 +2633,7 @@ "-1511825574": "Lãi/Lỗ:", "-726626679": "Lợi nhuận/thua lỗ tiềm năng:", "-338379841": "Giá biểu thị:", + "-2027409966": "Mức cược ban đầu:", "-1525144993": "Mức chi trả:", "-1167474366": "Tick ", "-555886064": "Đã thắng", @@ -2655,10 +2660,10 @@ "-1354485738": "Đặt lại Mua", "-376148198": "Chỉ Tăng", "-1337379177": "Tick cao", - "-328036042": "Vui lòng nhập một sỗ chặn lỗ cao hơn số lỗ dự kiến tại thời điểm hiện tại.", - "-2127699317": "Chặn lỗ không khả dụng. Chặn lỗ không thể lớn hơn tiền cọc.", - "-1150099396": "Chúng tôi đang cố gắng để tính năng này khả dụng với bạn. Nếu bạn có tài khoản khác, hãy chuyển sang tài khoản đó để tiếp tục giao dịch. Bạn có thể thêm tài khoản Deriv MT5 Financial.", - "-1940333322": "DBot không khả dụng cho tài khoản này", + "-328036042": "Vui lòng nhập số cắt lỗ cao hơn số lỗ dự kiến tại thời điểm hiện tại.", + "-2127699317": "Số cắt lỗ không hợp lệ. Số cắt lỗ không thể lớn hơn tiền cọc.", + "-1150099396": "Chúng tôi đang cố để bạn có thể sử dụng tính năng này. Nếu bạn có tài khoản khác, hãy chuyển sang tài khoản đó để tiếp tục giao dịch. Bạn có thể thêm tài khoản Deriv MT5 Tài chính.", + "-1940333322": "Tài khoản này không thể sử dụng DBot", "-1223145005": "Khoản lỗ: {{profit}}", "-1062922595": "ID tham chiếu (mua)", "-2068574600": "ID tham chiếu (bán)", @@ -2669,44 +2674,44 @@ "-746652890": "Thông báo", "-824109891": "Hệ thống", "-749186458": "Việc đổi tài khoản sẽ bị vô hiệu hóa khi bot đang chạy. Vui lòng dừng bot của bạn trước khi đổi tài khoản.", - "-662836330": "Bạn muốn giữ hay đóng hợp đồng hiện tại? Nếu bạn quyết định tiếp tục giữ hợp đồng, bạn có thể kiểm tra và đóng chúng về sau trên trang <0>Báo cáo.", + "-662836330": "Bạn muốn giữ hay đóng hợp đồng hiện tại? Nếu bạn quyết định tiếp tục giữ hợp đồng, bạn có thể kiểm tra và đóng chúng sau này trên trang <0>Báo cáo.", "-597939268": "Giữ hợp đồng của tôi", "-1322453991": "Bạn cần đăng nhập để chạy bot.", - "-1483938124": "Chiến lượng này hiện không khả dụng với DBot.", - "-236548954": "Lỗi Cập Nhật Hợp Đồng", + "-1483938124": "Chiến lược này hiện không khả dụng với DBot.", + "-236548954": "Lỗi cập nhật hợp đồng", "-1428017300": "CÁC", "-1450728048": "CỦA", "-255051108": "BẠN", "-1845434627": "LÀ", "-931434605": "ĐÂY", - "-740712821": "Một", - "-187634388": "Khung này là bắt buộc. Đây là nơi bạn có thể quyết định xem bot của bạn có nên tiếp tục giao dịch hay không. Chỉ có một bản sao của khung này được cho phép.", - "-2105473795": "Thông số đầu vào duy nhất quyết định cách đầu ra của khung được định dạng. Trong trường hợp thông số đầu vào là \"string\" thì đơn vị tiền tệ của tài khoản sẽ được thêm vào.", - "-1800436138": "2. cho \"số\": 1325.68", - "-2046396241": "Khung này là bắt buộc. Chỉ có một bản sao của khung này được cho phép. Nó được thêm vào bảng khung theo mặc định khi bạn mở DBot.", - "-530632460": "Khung này được sử dụng để xác định xem giá thị trường có di chuyển theo hướng đã chọn hay không. Nó đưa ra cho bạn giá trị \"Đúng\" hoặc \"Sai\".", + "-740712821": "MỘT", + "-187634388": "Bắt buộc phải có khung này. Đây là nơi bạn có thể quyết định xem bot của bạn có nên tiếp tục giao dịch hay không. Chỉ được có thêm một bản sao của khung này.", + "-2105473795": "Thông số đầu vào duy nhất quyết định cách đầu ra của khung được định dạng. Trong trường hợp thông số đầu vào là \"chuỗi\" thì đơn vị tiền tệ của tài khoản sẽ được thêm vào.", + "-1800436138": "2. cho \"số\": 1325,68", + "-2046396241": "Phải có khung này. Chỉ được có một bản sao của khung này. Khung được mặc định thêm vào bảng khi bạn mở DBot.", + "-530632460": "Khung này được sử dụng để xác định xem giá thị trường có di chuyển theo hướng đã chọn hay không. Khung sẽ trả về cho bạn giá trị \"Đúng\" hoặc \"Sai\".", "-1875717842": "Ví dụ:", - "-890079872": "1. Nếu hướng được chọn là \"Tăng\", và các giá trị của tick trước đó nhỏ hơn giá trị của tick hiện tại, đầu ra sẽ là \"Đúng\". Nếu không, đầu ra sẽ là một chuỗi rỗng.", - "-489739641": "2. Nếu hướng được chọn là \"Giảm\", và các giá trị của tick trước đó lớn hơn giá trị của tick hiện tại, đầu ra sẽ là \"Đúng\". Nếu không, đầu ra sẽ là một chuỗi rỗng.", + "-890079872": "1. Nếu hướng được chọn là \"Tăng\", và các giá trị của tick trước đó nhỏ hơn giá trị của tick hiện tại, kết quả trả về sẽ là \"Đúng\". Nếu không, kết quả sẽ là một chuỗi rỗng.", + "-489739641": "2. Nếu hướng được chọn là \"Giảm\", và các giá trị của tick trước đó lớn hơn giá trị của tick hiện tại, kết quả đầu ra sẽ là \"Đúng\". Nếu không, kết quả sẽ là một chuỗi rỗng.", "-2116076360": "Có 4 loại thông báo:", - "-1421941045": "2. 'Cảnh báo' hiển thị thông báo màu vàng để làm nổi bật điều gì đó cần chú ý.", - "-277850921": "Nếu \"Thắng\" được chọn, nó sẽ trả về \"Đúng\" nếu giao dịch cuối của bạn thành công. Nếu không, nó sẽ trả về chuỗi rỗng.", + "-1421941045": "2. 'Cảnh báo' hiển thị thông báo màu vàng để làm nổi bật thông tin cần chú ý.", + "-277850921": "Nếu chọn \"Thắng\", khung sẽ trả về \"Đúng\" nếu giao dịch cuối của bạn thành công. Nếu không, khung sẽ trả về chuỗi rỗng.", "-1918487001": "Ví dụ:", - "-2139916657": "1. Dưới đây là ví dụ vong lặp bị hủy trong trường hợp \"x\" là \"Sai\" cho dù chỉ có một vòng lặp được thực hiện", - "-1238900333": "2. Trong ví dụ dưới đây vòng lặp nhảy đến lần lặp tiếp theo mà không thực hiện khối thuật toán bên dưới trong trường hợp nếu \"x\" là \"Sai\"", + "-2139916657": "1. Dưới đây là ví dụ vòng lặp bị hủy trong trường hợp \"x\" là \"Sai\" cho dù chỉ có một vòng lặp được thực hiện", + "-1238900333": "2. Trong ví dụ dưới đây, vòng lặp nhảy đến lần lặp tiếp theo mà không thực hiện khối thuật toán bên dưới trong trường hợp nếu \"x\" là \"Sai\"", "-1729479576": "Bạn có thể sử dụng \"i\" trong vòng lặp, ví dụ để mở danh sách các mục", "-1474636594": "Trong ví dụ này, vòng lặp sẽ lặp lại ba lần, vì đó là số lượng mục trong danh sách đã cho. Trong mỗi lần lặp, biến \"i\" sẽ được gán một giá trị từ danh sách. ", "-908772734": "Khung này đánh giá một điều kiện và sẽ chỉ thực hiện một hành động khi điều kiện đúng.", "-334040831": "2. Trong ví dụ này, các chỉ dẫn được lặp lại khi giá trị của x lớn hơn hoặc bằng 10. Khi giá trị của x nhỏ hơn 10, vòng lặp sẽ kết thúc.", "-444267958": "Khung \"Số giây kể từ Epoch\" trả về số giây kể từ ngày 1 tháng 1 năm 1970.", "-447522129": "Bạn sẽ cần nó khi bạn muốn lặp lại một hành động sau một khoảng thời gian nhất định.", - "-1488259879": "Thuật ngữ \"nến\" ám chỉ mỗi thanh trong một bản thống kê thanh nến. Mỗi nến đại diện bốn giá thị trường tại thời điểm đã chọn:", + "-1488259879": "Thuật ngữ \"nến\" dùng để chỉ mỗi thanh trong biểu đồ nến. Mỗi nến đại diện cho bốn giá thị trường tại thời điểm đã chọn:", "-2020693608": "Mỗi nến trên biểu đồ thể hiện 4 giá thị trường cho khoảng thời gian đã chọn:", "-62728852": "- Giá mở cửa: giá bắt đầu", "-1247744334": "- Giá thấp: giá thấp nhất", "-1386365697": "- Giá đóng: giá kết thúc", - "-1498732382": "Một nến màu đen (hoặc đỏ) chỉ ra rằng giá mở cao hơn giá đóng cửa. Điều này thể hiện sự đi xuống của giá thị trường.", - "-1871864755": "Khối này cung cấp cho bạn chữ số cuối cùng của giá trị tick mới nhất của thị trường đã chọn. Nếu giá trị \btick mới nhất là 1410.90, khối này sẽ trả về 0. Nó có ích cho các hợp đồng dựa trên chữ số như Chẵn/Lẻ, \u001dKhớp/Khác nhau hoặc Cao hơn/Thấp hơn.", + "-1498732382": "Nến màu đen (hoặc đỏ) chỉ ra rằng giá mở cửa cao hơn giá đóng cửa. Điều này thể hiện sự đi xuống của giá thị trường.", + "-1871864755": "Khung này cung cấp cho bạn chữ số cuối cùng của giá trị tick mới nhất của thị trường đã chọn. Nếu giá trị \btick mới nhất là 1410,90, khung này sẽ trả về 0. Khung có ích cho các hợp đồng dựa trên chữ số như Chẵn/Lẻ, \u001dKhớp/Khác nhau hoặc Cao hơn/Thấp hơn.", "-1029671512": "Trong trường hợp nếu thuật toán \"OR\" được chọn, khung sẽ chỉ trả về là \"Đúng\" khi một hoặc cả hai điều kiện đưa ra là \"Đúng\"", "-210295176": "Phép tính có sẵn:", "-1385862125": "- Phép cộng", @@ -2758,7 +2763,7 @@ "-533927844": "Chọn loại giao dịch mong muốn của bạn. Ví dụ: Lên/Xuống > Tăng/Giảm", "-1192411640": "4. Khoảng thời gian nến mặc định", "-485434772": "8. Các tùy chọn giao dịch", - "-1827646586": "Khung này gán một giá trị đã cho cho một biến, tạo biến nếu nó không tồn tại.", + "-1827646586": "Khung này gán một giá trị đã cho vào một biến, tạo biến nếu không tồn tại.", "-254421190": "Danh sách: ({{message_length}})", "-1616649196": "các kết quả", "-90107030": "Không tìm thấy kết quả", @@ -2766,45 +2771,45 @@ "-783058284": "Tổng mức cược", "-2077494994": "Tổng mức chi trả", "-1073955629": "Số lần chạy", - "-1729519074": "\bThua thầu", - "-42436171": "Tổng Lợi nhuận/Thua lỗ", - "-1137823888": "Tổng số tiền thanh toán kể từ lần cuối bạn làm mới số liệu thống kê của mình.", + "-1729519074": "Hợp đồng lỗ", + "-42436171": "Tổng Lời/Lỗ", + "-1137823888": "Tổng tiền chi trả kể từ lần cuối bạn làm mới số liệu thống kê của mình.", "-992662695": "Số lần bot của bạn đã chạy kể từ lần cuối bạn làm mới số liệu thống kê của mình. Mỗi lần chạy bao gồm việc thực hiện tất cả các khung gốc.", - "-1382491190": "Tổng số lãi/lỗ của bạn kể từ lần cuối bạn xóa số liệu thống kê của mình. Đó là sự khác biệt giữa tổng mức chia trả và tổng mức mua vào của bạn.", - "-767342552": "Nhập tên bot của bạn, chọn lưu trên máy tính hoặc Google Drive của bạn và nhấn ", + "-1382491190": "Tổng số lời/lỗ của bạn kể từ lần cuối bạn làm mới số liệu thống kê của mình là mức chênh lệch giữa tổng mức chi trả và tổng tiền cược của bạn.", + "-767342552": "Nhập tên bot của bạn, chọn lưu trên máy tính hoặc Google Drive và nhấp ", "-1372891985": "Lưu.", "-462715374": "Bot chưa có tên", "-1150107517": "Kết nối", "-1373954791": "Nên là một số hợp lệ", "-1278608332": "Vui lòng nhập một số trong khoảng từ 0 và {{api_max_losses}}.", - "-287597204": "Nhập các giới hạn để dừng bot của bạn giao dịch khi bất kỳ điều kiện nào trong số này được đáp ứng.", + "-287597204": "Nhập các giới hạn để ra lệnh cho bot dừng giao dịch khi bất kỳ điều kiện nào trong những giới hạn này được đáp ứng.", "-1445989611": "Giới hạn khoản lỗ tiềm năng của bạn trong ngày trên tất cả các nền tảng Deriv.", "-152878438": "Số lượng giao dịch tối đa mà bot của bạn sẽ thực hiện cho lần chạy này.", "-1490942825": "Áp dụng và chạy", - "-1058262694": "Việc dừng bot sẽ ngăn chặn các giao dịch tiếp theo. Mọi giao dịch đang diễn ra sẽ được hoàn thành bởi hệ thống của chúng tôi.", + "-1058262694": "Dừng bot đồng nghĩa với việc không tiếp tục giao dịch nữa. Mọi giao dịch đang diễn ra sẽ được hoàn thành bởi hệ thống của chúng tôi.", "-1473283434": "Xin lưu ý rằng một số giao dịch đã hoàn thành có thể không được hiển thị trong bảng giao dịch nếu bot bị dừng trong khi thực hiện giao dịch.", - "-397015538": "Bạn có thể tham khảo trang sao kê để biết chi tiết về tất cả các giao dịch đã hoàn thành.", - "-1442034178": "Hợp đồng đã được mua", - "-2020280751": "Bot đang dừng lại", + "-397015538": "Bạn có thể tham khảo trang sao kê để biết thông tin về tất cả các giao dịch đã hoàn thành.", + "-1442034178": "Hợp đồng đã mua", + "-2020280751": "Đang dừng bot", "-1436403979": "Hợp đồng đã được đóng", - "-1711732508": "Các ID tham khảo", + "-1711732508": "Các ID tham chiếu", "-386141434": "(Mua)", "-482272687": "(Bán)", - "-1983189496": "các tick", + "-1983189496": "tick", "-694277729": "(Cao)", "-2028564707": "(Thấp)", - "-627895223": "Điểm chốt", - "-596238067": "Điểm Vào/Chốt", - "-558594655": "Bot đang không họa động", - "-478946875": "Các chỉ số đã được xóa", - "-1391310674": "Hãy xem các hướng dẫn và câu hỏi thường gặp này để tìm hiểu thêm về việc xây dựng bot của bạn:", - "-1706059570": "DBot - đối tác giao dịch tự động của bạn", + "-627895223": "Giá thoát", + "-596238067": "Giá vào/Giá thoát", + "-558594655": "Bot đang không hoạt động", + "-478946875": "Số liệu thống kê đã bị xóa", + "-1391310674": "Hãy xem các hướng dẫn và câu hỏi thường gặp này để tìm hiểu thêm về việc tạo bot:", + "-1706059570": "DBot - Đối tác giao dịch tự động của bạn", "-2066779239": "Câu hỏi thường gặp", "-1904049127": "DBot là gì?", "-507620484": "Chưa lưu", "-764102808": "Google Drive", - "-9461328": "Bảo mật và riêng tư", - "-1200116647": "Nhấn vào đây để bắt đầu tạo Dbot của bạn.", + "-9461328": "Bảo mật và quyền riêng tư", + "-1200116647": "Nhấp vào đây để bắt đầu tạo Dbot của bạn.", "-1696412885": "Nhập", "-250192612": "Phân loại", "-1566369363": "Thu nhỏ", @@ -2858,37 +2863,37 @@ "-677396944": "Bước 4 :", "-295975118": "Tiếp theo, chuyển đến <0>tab Tiện ích bên dưới trình đơn Khối. Nhấn vào mũi tên thả xuống và nhấn <0>Vòng lặp.", "-698493945": "Bước 5 :", - "-1992994687": "Bây giờ, nhấn vào mũi tên thả xuống <0>Phân tích và nhấn <0>Contract.", - "-1844492873": "Chuyển đến khối <0>kết quả giao dịch cuối cùng và nhấp vào biểu tượng + để thêm khối Res <0>ult is Win vào workspace.", - "-1547091772": "Sau đó, kéo Kết <0>quả là chiến thắng vào khe trống bên cạnh để <0>lặp lại cho đến khi chặn.", - "-736400802": "Bước 6 :", - "-732067680": "Cuối cùng, kéo và thêm toàn bộ khối <0>Lặp lại vào khối <0>Điều kiện giao dịch Khởi động lại.", + "-1992994687": "Bây giờ, hãy nhấn vào mũi tên thả xuống <0>Phân tích và nhấn <0>Hợp đồng.", + "-1844492873": "Đi tới khung <0>Kết quả giao dịch cuối cùng và nhấp vào biểu tượng + để thêm khung <0>Kết quả là thắng vào không gian làm việc.", + "-1547091772": "Sau đó, kéo <0>Kết quả là thắng vào ô trống bên cạnh khung <0>lặp lại cho đến khi.", + "-736400802": "Bước 6:", + "-732067680": "Cuối cùng, kéo và thêm toàn bộ khung <0>Lặp lại vào khung <0>Điều kiện khởi động lại giao dịch.", "-1411787252": "Bước 1", - "-65900463": "Bắt đầu trên DBot", - "-1447398448": "Nhập bot từ thiết bị di động của bạn hoặc từ Google drive, xem bản xem trước trong trình tạo bot và bắt đầu giao dịch bằng cách chạy bot hoặc chọn từ Chiến lược Nhanh được tạo sẵn của chúng tôi. ", + "-65900463": "Bắt đầu sử dụng DBot", + "-1447398448": "Nhập bot từ thiết bị di động của bạn hoặc từ Google Drive, xem bản xem trước trong trình tạo bot và bắt đầu giao dịch bằng cách chạy bot hoặc chọn từ Chiến lược nhanh được tạo sẵn của chúng tôi. ", "-1109191651": "Phải là số lớn hơn 0", "-689786738": "Thời lượng tối thiểu: {{ min }}", "-184183432": "Thời lượng tối đa: {{ max }}", "-1494924808": "Giá trị phải bằng hoặc lớn hơn 2.", "-1823621139": "Chiến lược nhanh", - "-1455277971": "Tour Thoát", - "-1999747212": "Bạn muốn tham gia lại tour du lịch?", - "-358288026": "Lưu ý: Bạn cũng có thể tìm thấy hướng dẫn này trong tab Hướng <0>dẫn.", - "-683790172": "Bây giờ, <0>chạy bot để kiểm tra chiến lược.", - "-129587613": "Được rồi, cảm ơn!", + "-1455277971": "Thoát khám phá", + "-1999747212": "Bạn muốn khám phá lại?", + "-358288026": "Lưu ý: Bạn cũng có thể tìm thấy hướng dẫn này trong thẻ <0>Hướng dẫn.", + "-683790172": "Bây giờ, hãy <0>chạy bot để thử chiến lược.", + "-129587613": "Tôi đã hiểu, cảm ơn!", "-1519425996": "Không tìm thấy kết quả \"{{ faq_search_value }}”", - "-155173714": "Hãy xây dựng một bot!", - "-468571681": "DBot là một nhà xây dựng chiến lược dựa trên web để giao dịch các tùy chọn kỹ thuật số. Đây là một nền tảng nơi bạn có thể xây dựng bot giao dịch tự động của riêng bạn bằng cách kéo và thả 'khối'.", - "-1919212468": "3. Bạn cũng có thể tìm kiếm các khối bạn muốn bằng thanh tìm kiếm phía trên các danh mục.", - "-1520558271": "Để biết thêm thông tin, kiểm tra bài đăng trên blog này về những điều cơ bản của việc xây dựng một bot giao dịch.", - "-980360663": "3. Chọn khối bạn muốn và kéo nó vào không gian làm việc.", + "-155173714": "Hãy tạo một bot!", + "-468571681": "DBot là một trình tạo chiến lược trên giao diện web cho các giao dịch quyền chọn kỹ thuật số. Đây là nền tảng, nơi bạn có thể tự xây dựng bot giao dịch tự động của riêng mình bằng cách kéo và thả 'khung'.", + "-1919212468": "3. Bạn cũng có thể tìm kiếm các khung bạn muốn bằng thanh tìm kiếm phía trên các danh mục.", + "-1520558271": "Để biết thêm thông tin, hãy xem bài đăng blog về những thông tin cơ bản khi tạo bot giao dịch.", + "-980360663": "3. Chọn khung bạn muốn và kéo vào không gian làm việc.", "-1493168314": "Chiến lược nhanh là gì?", "-364223277": "Chiến lược nhanh là chiến lược được tạo sẵn mà bạn có thể sử dụng trong DBot. Có 3 chiến lược nhanh mà bạn có thể chọn: Martingale, D'Alembert và Oscar's Grind.", "-1680391945": "Sử dụng một chiến lược nhanh", "-1177914473": "Làm cách nào để tôi lưu chiến lược của mình?", - "-271986909": "Trong Bot Builder, nhấn Lưu trên thanh công cụ ở trên cùng để tải về bot của bạn. Đặt tên cho bot của bạn và chọn tải bot xuống thiết bị hoặc Google Drive của bạn. Bot của bạn sẽ được tải xuống dưới dạng tệp XML.", + "-271986909": "Trong Tạo Bot, nhấn Lưu trên thanh công cụ ở trên cùng để tải về bot của bạn. Đặt tên cho bot và chọn tải bot xuống thiết bị hoặc Google Drive của bạn. Bot của bạn sẽ được tải xuống dưới dạng tệp XML.", "-1778742142": "Làm thế nào để tải trading bot của tôi lên DBot?", - "-1149045595": "1. Sau khi nhấn Import, chọn Local và nhấp Tiếp tục.", + "-1149045595": "1. Sau khi nhấn Nhập, chọn Local và nhấp Tiếp tục.", "-288041546": "2. Chọn tập tin XML của bạn và nhấn Open.", "-2127548288": "3. Bot của bạn sẽ được nạp cho phù hợp.", "-1311297611": "1. Sau khi nhấn Import, chọn Google Drive và nhấp Tiếp tục.", @@ -3441,7 +3446,6 @@ "-2039780875": "Xác nhận Mua", "-1672470173": "Yêu cầu xác nhận trước khi mua hợp đồng", "-1342661765": "Khoá nút mua hợp đồng", - "-1738427539": "Mua", "-504410042": "Khi bạn mở một vị thế, các ngưỡng sẽ được tạo ra xung quanh giá của tài sản. Ở mỗi tick mới, ngưỡng cao và ngưỡng thấp sẽ được tự động tính dựa trên loại tài sản và giá trị tích lũy bạn chọn. Nếu bạn đóng vị thế của mình trước khi giá tài sản chạm một trong hai ngưỡng, bạn sẽ có lời.", "-1907770956": "Miễn là sự thay đổi giá của mỗi tick đều nằm trong mức ngưỡng, số tiền chi trả cho bạn sẽ tăng lên tại mỗi tick, dựa trên giá trị tích lũy bạn đã chọn.", "-997670083": "Số tick tối đa", @@ -3503,9 +3507,11 @@ "-194424366": "trên", "-1527492178": "Khóa mua", "-725375562": "Bạn có thể khóa / mở khóa nút mua từ phần Cài đặt", - "-601992465": "Tích lũy", - "-30171993": "Tiền cược của bạn sẽ tăng lên {{growth_rate}}% tại mỗi tick, bắt đầu từ tick thứ hai, miễn là giá vẫn nằm trong phạm vi ±{{tick_size_barrier}} so với giá tick trước đó.", + "-2131851017": "Tốc độ tăng trưởng", "-1358367903": "Mức cược", + "-542594338": "Tối đa thanh toán", + "-690963898": "Hợp đồng của bạn sẽ được tự động đóng khi thanh toán của bạn đạt đến số tiền này.", + "-511541916": "Hợp đồng của bạn sẽ được tự động đóng khi đạt đến số tick này.", "-1918235233": "Số tiền cược tối thiểu", "-1935239381": "Số tiền cược tối đa", "-1930565757": "Số tiền cược của bạn là khoản phí chỉ trả một lần và không hoàn lại để mua hợp đồng này. Tổng lợi nhuận/lỗ của bạn sẽ bằng giá trị hợp đồng trừ đi số tiền cược.", @@ -3520,14 +3526,13 @@ "-2131859340": "Dừng lỗ <0/>", "-1686280757": "<0>{{commission_percentage}}% của (<1/>*{{multiplier}})", "-1043117679": "Khi khoản lỗ hiện tại của bạn bằng hoặc vượt quá {{stop_out_percentage}}% mức cược của bạn, hợp đồng của bạn sẽ được đóng ở mức giá tài sản hiện có gần nhất.", - "-477998532": "Hợp đồng của bạn sẽ tự động đóng khi tiền lỗ lớn hơn hoặc bằng giá trị này.", - "-2008947191": "Hợp đồng của bạn sẽ tự động đóng khi tiền lãi của bạn lớn hơn hoặc bằng giá trị này.", "-339236213": "Cấp số nhân", "-857660728": "Giá thực hiện", "-119134980": "<0>{{trade_type}}: Bạn sẽ nhận được tiền chi trả nếu giá thị trường {{payout_status}} giá này <0> tại thời điểm hết hạn hợp đồng. Nếu ngược lại, bạn sẽ không nhận được bất cứ khoản chi trả nào.", "-243332856": "Số liệu về chữ số cuối cùng của 1000 tick mới nhất cho {{ underlying_name }}", "-1900883796": "<0>{{trade_type}}: Bạn sẽ nhận được tiền chi trả nếu giá thị trường {{payout_status}} giá này <0> tại thời điểm hết hạn hợp đồng. Nếu ngược lại, bạn sẽ không nhận được bất cứ khoản chi trả nào.", "-347156282": "Gủi bằng chứng", + "-1738427539": "Mua", "-461955353": "giá Mua", "-172348735": "lợi nhuận", "-1624674721": "loại hợp đồng", diff --git a/packages/translations/src/translations/zh_cn.json b/packages/translations/src/translations/zh_cn.json index d796ec1114a0..2ddc246c5586 100644 --- a/packages/translations/src/translations/zh_cn.json +++ b/packages/translations/src/translations/zh_cn.json @@ -317,7 +317,6 @@ "379523479": "为避免资金损失,请勿在 Admin 范围内与未经授权的各方共享代币。", "380606668": "跳动点", "380694312": "最大连续交易数", - "382781785": "当您的利润达到或大于此金额,合约将自动平仓。", "384303768": "如上一个烛形线是黑色,此程序块将返回“真”。它能放在画布上任何位置,除了交易参数根块的范围内。", "386191140": "可以选择差价合约交易账户或期权和乘数账户", "386278304": "安装 {{platform_name_trader}} 网络应用", @@ -371,6 +370,7 @@ "437904704": "最大未平仓头寸", "438067535": "$500,000以上", "442520703": "$250,001 - $500,000", + "443203714": "当亏损达到此金额,合约将自动平仓。", "443559872": "金融 SVG", "444484637": "逻辑求反", "445419365": "1 - 2 年", @@ -455,6 +455,7 @@ "545476424": "提款总额", "546534357": "如果您选择“取消交易”,如果市场走势对您不利,您可以在选定时间范围内取消交易。此情况下我们仅收取些许费用,但是您的本金金额将会退还,您没有盈利或亏损。如果在取消交易到期之前达到了止损金额,您的头寸将自动被取消,您的本金金额将退还,您没有任何盈利或亏损。当“取消交易”处于有效状态时:", "549479175": "Deriv 乘数", + "550589723": "只要当前入市现价保持在前一个现价的±{{tick_size_barrier}} 范围内,投注额将以每一跳动价的 {{growth_rate}}%增长。", "551569133": "了解交易限制的详细信息", "554135844": "编辑", "554410233": "这是10个最常用的密码", @@ -524,6 +525,7 @@ "627814558": "如果条件为真,此程序块将返回一个值。在以上任一函数块中使用此程序块。", "628193133": "账户 ID", "629145209": "如果选择了“AND”操作,则仅当两个给定值均为“真”时,程序块才返回“真”", + "629395043": "所有增长率", "632398049": "此程序块给项目或语句分配空值。", "634219491": "您没有提供税务编号。法律和监管规定要求提供此信息。请到账户设置中的<0>个人资料,填写您最新的税务编号。", "636219628": "<0>c.如果找不到和解机会,则投诉将进入由 DRC 处理的确定阶段。", @@ -674,6 +676,7 @@ "802438383": "需要新的地址证明", "802556390": "秒", "802989607": "将 XML 文件拖到此处", + "803500173": "初始投注金额", "806165583": "澳大利亚 200", "807499069": "金融委员会投诉程序", "808323704": "您也可以使用“比较”和“逻辑运算”程序块制测试变量。", @@ -1093,6 +1096,7 @@ "1264842111": "可以在真实账户和演示账户之间切换。", "1265704976": "<空消息>", "1270581106": "如果您选择“未触及”期权,假设市场在合约期限内一直没有触及障碍水平,您将获得赔付。", + "1271461759": "当利润达到此金额,合约将自动平仓。", "1272012156": "英镑/瑞士法郎", "1272337240": "日", "1272681097": "小时", @@ -1430,7 +1434,6 @@ "1641395634": "最后数字列表", "1641635657": "需要新的身份证明文件", "1641980662": "称呼是必填项.", - "1642645912": "所有费率", "1644703962": "正在寻找差价合约账户?前往Trader's Hub", "1644864436": "申请成为专业客户前,必须验证账户。<0>验证账户", "1644908559": "数字代码是必填项。", @@ -1588,6 +1591,7 @@ "1803338729": "选择您要交易的合约类型。例如,对于“上涨/下跌”交易类型,您可以选择以下三选项之一:“上涨”,“下跌”或“两者都选”。选定的选项将确定“购入”程序块的可用选项。", "1804620701": "到期时间", "1804789128": "{{display_value}} 跳动点", + "1806017862": "最大跳动次数", "1806355993": "不收佣金", "1806503050": "请注意一些付款方式可能不适用于您的所在国。", "1808058682": "程序块加载成功", @@ -2629,6 +2633,7 @@ "-1511825574": "利润/亏损:", "-726626679": "潜在利润/亏损:", "-338379841": "指示性价格:", + "-2027409966": "初始投注额:", "-1525144993": "赔付限额:", "-1167474366": "跳动点 ", "-555886064": "赢得", @@ -3441,7 +3446,6 @@ "-2039780875": "买入确认", "-1672470173": "买入合约前须确认", "-1342661765": "锁定合约买入按钮", - "-1738427539": "买入", "-504410042": "开仓时会在资产价格上下建立障碍。系统会根据选择的资产和累计值自动计算每个新价点的上限和下限障碍。如果在资产价达到任一障碍之前平仓,您将获利。", "-1907770956": "只要每个新价点的价格变动在障碍范围内,赔付将会根据选择的累计值在每个价格变动时增加。", "-997670083": "最大跳动次数", @@ -3503,9 +3507,11 @@ "-194424366": "高于", "-1527492178": "买入被锁定", "-725375562": "购入按钮可在设置菜单上锁定/解锁", - "-601992465": "累计", - "-30171993": "只要价格保持在前一个跳动价点的±{{tick_size_barrier}} 范围内,从第二个跳动点开始,投注额将增加 {{growth_rate}}%。", + "-2131851017": "增长率", "-1358367903": "投注资金", + "-542594338": "最大赔付", + "-690963898": "当赔付额达到此金额,合约将自动平仓。", + "-511541916": "达到此价格跳动次数时,合约将自动平仓。", "-1918235233": "最低投注金额", "-1935239381": "最大投注金额", "-1930565757": "购买此合约时,投注额是不可退还的一次性付费。总利润/亏损等于合约值减去投注额。", @@ -3520,14 +3526,13 @@ "-2131859340": "强制平仓<0/>", "-1686280757": "(<1/> * {{multiplier}}) 的<0>{{commission_percentage}}%", "-1043117679": "当您当前的亏损等于或超过您投注额的{{stop_out_percentage}}%时,您的合约将以最接近的可用资产价格平仓。", - "-477998532": "当您的亏损达到或大于此金额,合约将自动平仓。", - "-2008947191": "当利润达到或大于此金额,合约将自动平仓。", "-339236213": "乘数期权", "-857660728": "行权价格", "-119134980": "<0>{{trade_type}}:到期时如果市场价格为 {{payout_status}} <0>,将获得赔付。否则,赔付将为零。", "-243332856": "{{ underlying_name }} 最新1000 跳点的最后统计数字", "-1900883796": "<0>{{trade_type}}:到期时如果市场为 {{payout_status}} 价<0>,将获得赔付。否则,赔付将为零。", "-347156282": "提交证明", + "-1738427539": "买入", "-461955353": "购入价格", "-172348735": "利润", "-1624674721": "合约类型", diff --git a/packages/translations/src/translations/zh_tw.json b/packages/translations/src/translations/zh_tw.json index 0f3d6bc71904..3f8d6cc42510 100644 --- a/packages/translations/src/translations/zh_tw.json +++ b/packages/translations/src/translations/zh_tw.json @@ -317,7 +317,6 @@ "379523479": "為避免資金損失,請勿在 Admin 範圍內與未經授權的各方分享代幣。", "380606668": "跳動點", "380694312": "最大連續交易數", - "382781785": "當利潤達到或大於此金額,合約將自動平倉。", "384303768": "如上一個燭線圖是黑色,此區塊將返回「真」。它能放在畫布上任何位置,除了交易參數根塊的範圍內。", "386191140": "可以選擇差價合約交易帳戶或期權和乘數帳戶", "386278304": "安裝 {{platform_name_trader}} 網絡應用", @@ -371,6 +370,7 @@ "437904704": "最大未平倉頭寸", "438067535": "$500,000以上", "442520703": "$250,001 - $500,000", + "443203714": "當虧損達到此金額,合約將自動平倉。", "443559872": "金融 SVG", "444484637": "邏輯否定", "445419365": "1 - 2 年", @@ -455,6 +455,7 @@ "545476424": "提款總額", "546534357": "如果您選擇「取消交易」,如果市場走勢對您不利,可以在選定時間範圍內取消交易。此情況下我們僅收取些許費用,但是本金金額將會退還,您沒有虧損。如果在取消交易到期之前達到了止損金額,您的頭寸將自動被取消,本金金額將退還,您沒有任何虧損。當「取消交易」處於有效狀態時:", "549479175": "Deriv 乘數", + "550589723": "只要入市現價格保持在前一個入市現價的±{{tick_size_barrier}} 範圍內,投注額將以每個跳動點的 {{growth_rate}}%增長。", "551569133": "了解交易限制的詳細資訊", "554135844": "編輯", "554410233": "這是10個最常用的密碼", @@ -524,6 +525,7 @@ "627814558": "如果條件為真,此區塊將返回一個值。在以上任一函數塊中使用此區塊。", "628193133": "帳戶 ID", "629145209": "如果選擇了「AND」操作,則僅當兩個給定值均為「真」時,區塊才返回「真」", + "629395043": "所有增長率", "632398049": "此區塊給項目或語句分配空值。", "634219491": "您沒有提供稅務編號。法律和監管規定要求提供此資訊。請到帳戶設定中的<0>個人資料,填寫您最新的稅務編號。", "636219628": "<0>c.如果找不到和解機會,則投訴將進入由 DRC 處理的確定階段。", @@ -674,6 +676,7 @@ "802438383": "需要新的地址證明", "802556390": "秒", "802989607": "將 XML 文件拖到此處", + "803500173": "起始投注金額", "806165583": "澳大利亞 200", "807499069": "金融委員會投訴程序", "808323704": "您也可以使用「比較」和「邏輯運算」區塊製作測試變數。", @@ -1093,6 +1096,7 @@ "1264842111": "可以在真實帳戶和示範帳戶之間切換。", "1265704976": "", "1270581106": "如果選擇「未觸及」期權,假設市場在合約期限內一直沒有觸及障礙水平,將獲得賠付。", + "1271461759": "當利潤達到此金額,合約將自動平倉。", "1272012156": "英鎊/瑞士法郎", "1272337240": "日", "1272681097": "小時", @@ -1430,7 +1434,6 @@ "1641395634": "最後數字清單", "1641635657": "需要新的身份證明文件", "1641980662": "稱呼為必填欄位。", - "1642645912": "所有費率", "1644703962": "尋找差價合約帳戶?前往 Trader's Hub", "1644864436": "申請成為專業客戶前,必須驗證帳戶。<0>驗證帳戶", "1644908559": "數字代碼是必填項。", @@ -1588,6 +1591,7 @@ "1803338729": "選擇要交易的合約類型。例如,對於「上漲/下跌」交易類型,可以選擇以下三選項之一:「上漲」,「下跌」或「兩者都選」。選定的選項將確定「購入」區塊的可用選項。", "1804620701": "到期", "1804789128": "{{display_value}} 跳動點", + "1806017862": "最大跳動點次數", "1806355993": "不收佣金", "1806503050": "請注意一些付款方式可能不適用於您的所在國。", "1808058682": "區塊載入成功", @@ -2629,6 +2633,7 @@ "-1511825574": "利潤/虧損:", "-726626679": "潛在利潤/虧損:", "-338379841": "指示性價格:", + "-2027409966": "起始投注金額:", "-1525144993": "賠付限額:", "-1167474366": "跳動點 ", "-555886064": "贏得", @@ -3441,7 +3446,6 @@ "-2039780875": "買入確認", "-1672470173": "買入合約前須確認", "-1342661765": "鎖定合約買入按鈕", - "-1738427539": "買入", "-504410042": "開倉時會在資產價格上下建立障礙。系統會根據選擇的資產和累計值自動計算每個新價點的上限和下限障礙。如果在資產價達到任一障礙之前平倉,您將獲利。", "-1907770956": "只要每個新價點的價格變動在障礙範圍內,賠付將會根據選擇的累計值在每個價格變動時增加。", "-997670083": "最大跳動次數", @@ -3503,9 +3507,11 @@ "-194424366": "高於", "-1527492178": "買入被鎖定", "-725375562": "購入按鈕可在設定功能表上鎖定/解鎖", - "-601992465": "累計", - "-30171993": "只要價格保持在前一個跳動價點的±{{tick_size_barrier}} 範圍內,從第二個跳動點開始,投注額將增加 {{growth_rate}}%。", + "-2131851017": "增長率", "-1358367903": "投注資金", + "-542594338": "最大賠付", + "-690963898": "當賠付額達到此金額,合約將自動平倉。", + "-511541916": "達到此跳動點次數時,合約將自動平倉。", "-1918235233": "最低投注金額", "-1935239381": "最大投注金額", "-1930565757": "購買此合約時,投注額是不可退還的一次性付費。總利潤/虧損等於合約值減去投注額。", @@ -3520,14 +3526,13 @@ "-2131859340": "強制平倉<0/>", "-1686280757": "(<1/> * {{multiplier}}) 的<0>{{commission_percentage}}%", "-1043117679": "當目前的虧損等於或超過投注額的{{stop_out_percentage}}%時,合約將以最接近的可用資產價格平倉。", - "-477998532": "當虧損達到或大於此金額,合約將自動平倉。", - "-2008947191": "當利潤達到或大於此金額,合約將自動平倉。", "-339236213": "乘數期權", "-857660728": "行權價格", "-119134980": "<0>{{trade_type}}:到期時如果市場價格為 {{payout_status}} <0>,將獲得賠付。 否則,賠付將為零。", "-243332856": "{{ underlying_name }} 最新1000跳點之最後統計數字", "-1900883796": "<0>{{trade_type}}:到期時如果市場為 {{payout_status}} 價<0>,將獲得賠付。 否則,賠付將為零。", "-347156282": "提交證明", + "-1738427539": "買入", "-461955353": "購入價格", "-172348735": "利潤", "-1624674721": "合約類型", From 5eaf78b0d87da63c34bea3fdc9f8ab4d706c60c8 Mon Sep 17 00:00:00 2001 From: yashim-deriv Date: Thu, 15 Jun 2023 20:09:54 +0800 Subject: [PATCH 019/104] chore: disable PT (#9021) --- .../Containers/AcuityDownloadModal/acuity-download-modal.tsx | 4 +--- packages/core/src/Utils/Language/__tests__/language.spec.js | 1 - packages/translations/src/i18next/i18next.ts | 2 -- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/core/src/App/Containers/AcuityDownloadModal/acuity-download-modal.tsx b/packages/core/src/App/Containers/AcuityDownloadModal/acuity-download-modal.tsx index 34ac55f91cf4..39efc1908fe0 100644 --- a/packages/core/src/App/Containers/AcuityDownloadModal/acuity-download-modal.tsx +++ b/packages/core/src/App/Containers/AcuityDownloadModal/acuity-download-modal.tsx @@ -36,9 +36,7 @@ const AcuityDownloadModal = ({ }; const getLink = (language: string): string => { - if (language === 'PT') { - return getUrlBase('/public/pdf/Acuity_tool_user_guide_Portuguese.pdf'); - } else if (language === 'ES') { + if (language === 'ES') { return getUrlBase('/public/pdf/Acuity_tool_user_guide_Spanish.pdf'); } if (is_eu) { diff --git a/packages/core/src/Utils/Language/__tests__/language.spec.js b/packages/core/src/Utils/Language/__tests__/language.spec.js index 704b1878d731..aac388e6ab55 100644 --- a/packages/core/src/Utils/Language/__tests__/language.spec.js +++ b/packages/core/src/Utils/Language/__tests__/language.spec.js @@ -7,7 +7,6 @@ const languages = { ID: 'Indonesian', IT: 'Italiano', PL: 'Polish', - PT: 'Português', RU: 'Русский', VI: 'Tiếng Việt', ZH_CN: '简体中文', diff --git a/packages/translations/src/i18next/i18next.ts b/packages/translations/src/i18next/i18next.ts index 3c2c8cae0c3f..cc4dec88eef6 100644 --- a/packages/translations/src/i18next/i18next.ts +++ b/packages/translations/src/i18next/i18next.ts @@ -14,7 +14,6 @@ const ALL_LANGUAGES = Object.freeze({ ID: 'Indonesian', IT: 'Italiano', PL: 'Polish', - PT: 'Português', RU: 'Русский', VI: 'Tiếng Việt', ZH_CN: '简体中文', @@ -24,7 +23,6 @@ const ALL_LANGUAGES = Object.freeze({ export const getAllowedLanguages = () => { const allowed_languages = { EN: 'English', - PT: 'Português', ES: 'Español', RU: 'Русский', FR: 'Français', From b27de399d4bc79cb7a522cee1dd9c4699f5e478b Mon Sep 17 00:00:00 2001 From: Farhan Ahmad Nurzi <125247833+farhan-nurzi-deriv@users.noreply.github.com> Date: Fri, 16 Jun 2023 18:20:17 +0800 Subject: [PATCH 020/104] Fix: leave confirm tests failed (#9030) * fix: leave-confirm tests failed * refactor: modify usestate spyOn function * refactor: add more coverage --- .../__tests__/leave-confirm.spec.tsx | 90 +++++++++++++------ 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/packages/account/src/Components/leave-confirm/__tests__/leave-confirm.spec.tsx b/packages/account/src/Components/leave-confirm/__tests__/leave-confirm.spec.tsx index 8a7c750463e2..cd8ea5e0ead6 100644 --- a/packages/account/src/Components/leave-confirm/__tests__/leave-confirm.spec.tsx +++ b/packages/account/src/Components/leave-confirm/__tests__/leave-confirm.spec.tsx @@ -1,12 +1,13 @@ import React from 'react'; -import { render, screen, fireEvent, waitFor } from '@testing-library/react'; -import LeaveConfirm, { TransitionBlockerWithRouter } from '../leave-confirm'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { Formik } from 'formik'; -import { Router } from 'react-router'; import { createBrowserHistory } from 'history'; +import { Router } from 'react-router'; import { isMobile } from '@deriv/shared'; +import LeaveConfirm, { TransitionBlocker } from '../leave-confirm'; -let modal_root_el; +let modal_root_el: HTMLElement; jest.mock('@deriv/shared', () => ({ ...jest.requireActual('@deriv/shared'), @@ -23,12 +24,34 @@ afterAll(() => { document.body.removeChild(modal_root_el); }); +const mock_set_show = jest.fn(); +const mock_set_next_location = jest.fn(); + +const get_leave_confirm_states = () => { + return jest + .spyOn(React, 'useState') + .mockImplementationOnce(() => [null, jest.fn()]) + .mockImplementationOnce(() => [true, mock_set_show]) + .mockImplementationOnce(() => [{ pathname: '/' }, mock_set_next_location]); +}; + +const get_transition_blocker_states = ({ pathname }: { pathname: string | null }) => { + return jest + .spyOn(React, 'useState') + .mockImplementationOnce(() => [true, mock_set_show]) + .mockImplementationOnce(() => [pathname ? { pathname: '/' } : null, mock_set_next_location]); +}; + +const on_dirty = jest.fn(); + const LeaveConfirmComponent = () => { const history = createBrowserHistory(); return ( - - + + {() => { + return ; + }} ); @@ -45,25 +68,24 @@ const withRouter = Component => { return WrapperComponent; }; -const TransitionBlockerComponent = withRouter(TransitionBlockerWithRouter); +const TransitionBlockerComponent = withRouter(TransitionBlocker); describe('LeaveConfirm', () => { it('should render LeaveConfirm component in desktop mode', () => { - jest.spyOn(React, 'useState').mockReturnValueOnce([true, () => null]); + get_leave_confirm_states(); render(); expect( screen.getByText('You have unsaved changes. Are you sure you want to discard changes and leave this page?') ).toBeInTheDocument(); }); it('should render LeaveConfirm component in mobile mode', () => { - jest.spyOn(React, 'useState').mockImplementationOnce(() => React.useState(true)); - isMobile.mockReturnValueOnce(true); + get_leave_confirm_states(); + (isMobile as jest.Mock).mockReturnValueOnce(true); render(); expect(screen.getByText('Unsaved changes')).toBeInTheDocument(); }); it('should show proper icon', () => { - jest.spyOn(React, 'useState').mockImplementationOnce(() => React.useState(true)); - + get_leave_confirm_states(); render(); expect(screen.getByTestId('unsaved_changes_icon')).toBeInTheDocument(); expect(screen.getByText('Unsaved changes')).toBeInTheDocument(); @@ -74,28 +96,46 @@ describe('LeaveConfirm', () => { expect(screen.getByRole('button', { name: 'Leave Settings' })).toBeInTheDocument(); }); it('should trigger onclick callback when the user clicks cancel button', async () => { - jest.spyOn(React, 'useState').mockImplementationOnce(() => React.useState(true)); + get_leave_confirm_states(); render(); const el_cancel_btn = screen.getByRole('button', { name: 'Cancel' }); - fireEvent.click(el_cancel_btn); - await waitFor(() => { - expect(screen.queryByText('Unsaved changes')).not.toBeInTheDocument(); - }); + await userEvent.click(el_cancel_btn); + + expect(mock_set_show).toHaveBeenCalled(); + expect(mock_set_next_location).toHaveBeenCalled(); }); + it('should sehow modal when value is dirty and trigger unblock function', () => { + get_transition_blocker_states({ pathname: '/' }); + render(); + const el_leave_settings_btn = screen.getByRole('button', { name: 'Leave Settings' }); + userEvent.click(el_leave_settings_btn); + + expect(on_dirty).toHaveBeenCalled(); + expect(mock_set_show).toHaveBeenCalled(); + expect(mock_set_next_location).toHaveBeenCalled(); + }); + it('should set values as dirty when the user leaves modal', () => { - jest.spyOn(React, 'useState').mockImplementationOnce(() => React.useState(true)); - render(); + get_transition_blocker_states({ pathname: '/' }); + render(); const el_cancel_btn = screen.getByRole('button', { name: 'Cancel' }); - fireEvent.click(el_cancel_btn); - expect(screen.getByRole('button', { name: 'Leave Settings' })).toBeInTheDocument(); + userEvent.click(el_cancel_btn); + + expect(on_dirty).toHaveBeenCalled(); }); it('should change pathname when user leaves form', () => { - jest.spyOn(React, 'useState') - .mockReturnValueOnce([true, () => null]) - .mockReturnValueOnce([{ pathname: '/' }, () => null]); + get_transition_blocker_states({ pathname: '/' }); + render(); + const el_leave_settings_btn = screen.getByRole('button', { name: 'Leave Settings' }); + userEvent.click(el_leave_settings_btn); + expect(screen.getByRole('button', { name: 'Leave Settings' })).toBeInTheDocument(); + }); + + it('should not change pathname when user leaves form', () => { + get_transition_blocker_states({ pathname: null }); render(); const el_leave_settings_btn = screen.getByRole('button', { name: 'Leave Settings' }); - fireEvent.click(el_leave_settings_btn); + userEvent.click(el_leave_settings_btn); expect(screen.getByRole('button', { name: 'Leave Settings' })).toBeInTheDocument(); }); }); From 733962182edc86b5ffd6c8553acb9a94e4dd54c6 Mon Sep 17 00:00:00 2001 From: adrienne-deriv <103016120+adrienne-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 13:55:16 +0800 Subject: [PATCH 021/104] Adrienne / Release automation integration (#8914) * feat: added release automation workflow * chore: added config for first merge * chore: renamed first merge delay config * feat: added configuration to skip updating base branch * feat: added option for maximum tasks * chore: skip slack integration * chore: enabled github integration * chore: updated fe-toolbox version * chore: removed platform input * chore: updated refetch limit * chore: added gitguardian to skip checks * chore: fixed syntax issue * chore: added new lines at bottom --- .github/workflows/automationrc.json | 20 +++++++ .../merge_and_release_to_staging.yml | 53 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 .github/workflows/automationrc.json create mode 100644 .github/workflows/merge_and_release_to_staging.yml diff --git a/.github/workflows/automationrc.json b/.github/workflows/automationrc.json new file mode 100644 index 000000000000..e1d3421b3f1b --- /dev/null +++ b/.github/workflows/automationrc.json @@ -0,0 +1,20 @@ +{ + "skip_pending_checks": false, + "skip_slack_integration": false, + "skip_updating_branch": true, + "merge_delay": 120000, + "first_merge_delay": 1200000, + "max_task_count": 15, + "pull_request": { + "checks_timeout": 60000, + "refetch_timeout": 10000, + "refetch_limit": 20, + "checks_limit": 40 + }, + "circleci": { + "project_slug": "gh/binary-com/deriv-app", + "branch": "master", + "workflow_name": "release_staging" + }, + "checks_to_skip": ["/gitguardian/i"] +} diff --git a/.github/workflows/merge_and_release_to_staging.yml b/.github/workflows/merge_and_release_to_staging.yml new file mode 100644 index 000000000000..9c96cbf2035b --- /dev/null +++ b/.github/workflows/merge_and_release_to_staging.yml @@ -0,0 +1,53 @@ +name: Merge and release to staging +permissions: + pull-requests: write +on: + workflow_dispatch: + inputs: + tag: + description: "Tag" + required: true + skip_circleci_checks: + description: "Skip checking CircleCI workflow" + type: boolean + required: false + skip_pending_checks: + description: "Skip waiting for pull request checks" + type: boolean + required: false + +concurrency: + group: release_automation_group + +jobs: + release_issues: + permissions: write-all + runs-on: ubuntu-latest + timeout-minutes: 600 + steps: + - name: Checkout to repo + uses: actions/checkout@v3 + with: + ref: main + - name: Setup node + uses: actions/setup-node@v2 + - name: Wait for logs to accumulate + run: | + sleep 10 + - name: Release issues in Deriv.app + uses: binary-com/fe-toolbox@production_V20230615_0 + with: + tag: ${{ inputs.tag }} + platform: 'Deriv.app' + list_id: ${{ secrets.LIST_ID }} + release_tags_list_id: ${{ secrets.RELEASE_TAGS_LIST_ID }} + regression_testing_template_id: ${{ secrets.REGRESSION_TESTING_TEMPLATE_ID }} + config_path: ./.github/workflows/automationrc.json + skip_circleci_checks: ${{ inputs.skip_circleci_checks }} + skip_pending_checks: ${{ inputs.skip_pending_checks }} + CIRCLECI_TOKEN: ${{ secrets.CIRCLECI_TOKEN }} + CLICKUP_API_TOKEN: ${{ secrets.CLICKUP_API_TOKEN }} + SLACK_APP_TOKEN: ${{ secrets.SLACK_APP_TOKEN }} + SLACK_USER_TOKEN: ${{ secrets.SLACK_USER_TOKEN }} + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} From 95fc0d11d3c779256295c7c57fa11fb58892edb7 Mon Sep 17 00:00:00 2001 From: adrienne-deriv <103016120+adrienne-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:26:19 +0800 Subject: [PATCH 022/104] fix: fix wrong branch name (#9037) --- .github/workflows/merge_and_release_to_staging.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/merge_and_release_to_staging.yml b/.github/workflows/merge_and_release_to_staging.yml index 9c96cbf2035b..8530aac262df 100644 --- a/.github/workflows/merge_and_release_to_staging.yml +++ b/.github/workflows/merge_and_release_to_staging.yml @@ -28,7 +28,7 @@ jobs: - name: Checkout to repo uses: actions/checkout@v3 with: - ref: main + ref: master - name: Setup node uses: actions/setup-node@v2 - name: Wait for logs to accumulate From eb7df5221cdb3a331947d25eebeb19415febbca2 Mon Sep 17 00:00:00 2001 From: henry-deriv <118344354+henry-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:28:32 +0800 Subject: [PATCH 023/104] henry/91713/test: Test coverage for POO statuses components (#8125) * test: Test coverage for POO statuses components * fix: Empty-Commit --------- Co-authored-by: Ali(Ako) Hosseini --- .../__tests__/not-required.spec.tsx | 24 +++++++++++++++++++ .../poo-rejected/__tests__/rejected.spec.tsx | 22 +++++++++++++++++ .../poo/statuses/poo-rejected/index.js | 4 ++-- .../poo/statuses/poo-rejected/rejected.jsx | 2 +- .../__tests__/submitted.spec.tsx | 22 +++++++++++++++++ .../poo-verified/__tests__/verified.spec.tsx | 19 +++++++++++++++ 6 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 packages/account/src/Components/poo/statuses/poo-not-required/__tests__/not-required.spec.tsx create mode 100644 packages/account/src/Components/poo/statuses/poo-rejected/__tests__/rejected.spec.tsx create mode 100644 packages/account/src/Components/poo/statuses/poo-submitted/__tests__/submitted.spec.tsx create mode 100644 packages/account/src/Components/poo/statuses/poo-verified/__tests__/verified.spec.tsx diff --git a/packages/account/src/Components/poo/statuses/poo-not-required/__tests__/not-required.spec.tsx b/packages/account/src/Components/poo/statuses/poo-not-required/__tests__/not-required.spec.tsx new file mode 100644 index 000000000000..7c826826c3f3 --- /dev/null +++ b/packages/account/src/Components/poo/statuses/poo-not-required/__tests__/not-required.spec.tsx @@ -0,0 +1,24 @@ +import { screen, render } from '@testing-library/react'; +import React from 'react'; +import POONotRequired from '../index'; + +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + return { + ...original_module, + Icon: jest.fn(() =>
Mocked Icon
), + }; +}); + +describe('', () => { + it('should render component with its content', () => { + render(); + expect(screen.getByText("Your proof of ownership isn't required.")).toBeInTheDocument(); + expect( + screen.getByText( + 'You are not required to submit proof of ownership at this time. We will inform you if proof of ownership is required in the future.' + ) + ).toBeInTheDocument(); + expect(screen.getByText('Mocked Icon')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/poo/statuses/poo-rejected/__tests__/rejected.spec.tsx b/packages/account/src/Components/poo/statuses/poo-rejected/__tests__/rejected.spec.tsx new file mode 100644 index 000000000000..09b591be281b --- /dev/null +++ b/packages/account/src/Components/poo/statuses/poo-rejected/__tests__/rejected.spec.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import POORejected from '../index'; + +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + return { + ...original_module, + Icon: jest.fn(() =>
Mocked Icon
), + }; +}); + +describe('', () => { + it('Should render and its contents', () => { + const onTryAgain = jest.fn(); + render(); + expect(screen.getByText('Mocked Icon')).toBeInTheDocument(); + expect(screen.getByText('Proof of ownership verification failed')).toBeInTheDocument(); + expect(screen.getByText('We were unable to verify your proof of ownership.')).toBeInTheDocument(); + expect(screen.getByText('Try again')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/poo/statuses/poo-rejected/index.js b/packages/account/src/Components/poo/statuses/poo-rejected/index.js index 330c72aa62f3..164171243ff8 100644 --- a/packages/account/src/Components/poo/statuses/poo-rejected/index.js +++ b/packages/account/src/Components/poo/statuses/poo-rejected/index.js @@ -1,3 +1,3 @@ -import { POORejetced } from './rejected.jsx'; +import { POORejected } from './rejected.jsx'; -export default POORejetced; +export default POORejected; diff --git a/packages/account/src/Components/poo/statuses/poo-rejected/rejected.jsx b/packages/account/src/Components/poo/statuses/poo-rejected/rejected.jsx index 4bb39411a13a..8ce3e0735ada 100644 --- a/packages/account/src/Components/poo/statuses/poo-rejected/rejected.jsx +++ b/packages/account/src/Components/poo/statuses/poo-rejected/rejected.jsx @@ -2,7 +2,7 @@ import { Button, Text, Icon } from '@deriv/components'; import { localize } from '@deriv/translations'; import React from 'react'; -export const POORejetced = ({ onTryAgain }) => { +export const POORejected = ({ onTryAgain }) => { return (
diff --git a/packages/account/src/Components/poo/statuses/poo-submitted/__tests__/submitted.spec.tsx b/packages/account/src/Components/poo/statuses/poo-submitted/__tests__/submitted.spec.tsx new file mode 100644 index 000000000000..df1cdd3e3b59 --- /dev/null +++ b/packages/account/src/Components/poo/statuses/poo-submitted/__tests__/submitted.spec.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import POOSubmitted from '../index'; + +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + return { + ...original_module, + Icon: jest.fn(() =>
Mocked Icon
), + }; +}); + +describe('', () => { + it('Should render { + render(); + expect(screen.getByText('We’ve received your proof of ownership.')).toBeInTheDocument(); + expect( + screen.getByText('We’ll review your documents and notify you of its status within 3 days.') + ).toBeInTheDocument(); + expect(screen.getByText('Mocked Icon')).toBeInTheDocument(); + }); +}); diff --git a/packages/account/src/Components/poo/statuses/poo-verified/__tests__/verified.spec.tsx b/packages/account/src/Components/poo/statuses/poo-verified/__tests__/verified.spec.tsx new file mode 100644 index 000000000000..db3bf3c77355 --- /dev/null +++ b/packages/account/src/Components/poo/statuses/poo-verified/__tests__/verified.spec.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import POOVerified from '../index'; + +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + return { + ...original_module, + Icon: jest.fn(() =>
Mocked Icon
), + }; +}); + +describe('', () => { + it('Should render and its contents', () => { + render(); + expect(screen.getByText('Proof of ownership verification passed.')).toBeInTheDocument(); + expect(screen.getByText('Mocked Icon')).toBeInTheDocument(); + }); +}); From 49ffe5a0a0e459e1138e3e4add88ffaca55f8763 Mon Sep 17 00:00:00 2001 From: henry-deriv <118344354+henry-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:44:49 +0800 Subject: [PATCH 024/104] henry/91709/test: add test coverage for poi unsupported (#8041) * test: add test coverage * test: switch from regex to string * fix: change test coverage --------- Co-authored-by: Henry Hein Co-authored-by: Ali(Ako) Hosseini --- .../__tests__/unsupported-failed.spec.tsx | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 packages/account/src/Components/poi-unsupported-failed/__tests__/unsupported-failed.spec.tsx diff --git a/packages/account/src/Components/poi-unsupported-failed/__tests__/unsupported-failed.spec.tsx b/packages/account/src/Components/poi-unsupported-failed/__tests__/unsupported-failed.spec.tsx new file mode 100644 index 000000000000..5f3116cbed14 --- /dev/null +++ b/packages/account/src/Components/poi-unsupported-failed/__tests__/unsupported-failed.spec.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import UnsupportedFailed from '../unsupported-failed'; + +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + return { + ...original_module, + Icon: jest.fn(() =>
Mocked Icon
), + }; +}); + +describe('', () => { + const error = 'error'; + it('should render component with its content', () => { + render(); + expect(screen.getByText('Proof of identity documents upload failed')).toBeInTheDocument(); + expect(screen.getByText('error')).toBeInTheDocument(); + expect(screen.getByText('Mocked Icon')).toBeInTheDocument(); + }); +}); From 1fed937bce3f773f7843d9125958bb5ae68fef58 Mon Sep 17 00:00:00 2001 From: henry-deriv <118344354+henry-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:56:56 +0800 Subject: [PATCH 025/104] henry/dtra-131/feat: dropdown style and description change for all trade types (#8727) * feat: dropdown style and description change for all trade types * fix: minify svg * refactor: resolve edge cases * fix: remove comment * fix: resolve comments * fix: add animation, make image scrollable * refactor: refactor for better maintainability * fix: circleci issue * fix: disable animation for now * fix: indexing to contract type value and change view height for mobile * fix: remove outerscroll * fix: trying auto size * fix: autosizer didnt work * fix: make words bold * fix: fix bold * fix: remove navigation and pagnation * fix: refactor * fix: resolve comments * empty commit * empty commit * fix: rearrange glossary based on order * fix: animation bug * fix: disable swipe on mobile and animation issue * fix: remove commented out code * fix: scroll not working for trade-types * fix: test * fix: remove unintended test file --- .../src/components/carousel/carousel.tsx | 4 +- packages/shared/src/styles/themes.scss | 2 + .../trade_explanations/img-accumulator.svg | 2 +- .../trade_explanations/img-even-odd.svg | 2 +- .../trade_explanations/img-high-low.svg | 2 +- .../trade_explanations/img-match-diff.svg | 2 +- .../trade_explanations/img-multiplier.svg | 2 +- .../trade_explanations/img-over-under.svg | 2 +- .../trade_explanations/img-rise-fall.svg | 2 +- .../trade_explanations/img-touch.svg | 2 +- .../trade_explanations/img-vanilla.svg | 2 +- .../accumulator-trade-description.jsx | 59 ------- .../accumulator-trade-description.tsx | 29 ++++ .../Trading/Categories/trade-categories.jsx | 54 ++++-- .../contract-type-glossary.tsx | 155 ++++++++++++++++++ .../ContractTypeInfo/contract-type-info.jsx | 124 +++++++++++--- .../ContractTypeMenu/contract-type-menu.jsx | 46 ++++-- .../__tests__/contract-type-glossary.spec.tsx | 25 +++ .../ContractType/contract-type-dialog.jsx | 2 +- .../components/contract-type-dialog.scss | 15 +- .../components/contract-type-info.scss | 137 +++++++++++++--- 21 files changed, 516 insertions(+), 154 deletions(-) delete mode 100644 packages/trader/src/Assets/Trading/Categories/accumulator-trade-description.jsx create mode 100644 packages/trader/src/Assets/Trading/Categories/accumulator-trade-description.tsx create mode 100644 packages/trader/src/Modules/Trading/Components/Form/ContractType/ContractTypeInfo/contract-type-glossary.tsx create mode 100644 packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-glossary.spec.tsx diff --git a/packages/components/src/components/carousel/carousel.tsx b/packages/components/src/components/carousel/carousel.tsx index e63aa3a9d22d..6cbed6563aa6 100644 --- a/packages/components/src/components/carousel/carousel.tsx +++ b/packages/components/src/components/carousel/carousel.tsx @@ -13,6 +13,7 @@ type TCarousel = { bullet_color?: string; bullet_position?: 'bottom' | 'top'; className?: string; + disable_swipe?: boolean; initial_index?: number; is_mt5?: boolean; item_per_window?: number; @@ -30,6 +31,7 @@ const Carousel = ({ bullet_color = 'var(--text-less-prominent)', bullet_position = 'bottom', className, + disable_swipe = false, initial_index = 0, is_mt5, item_per_window = 1, @@ -85,7 +87,7 @@ const Carousel = ({ }); return ( -
+
{sliced_list_length > 1 && (
diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-glossary.spec.tsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-glossary.spec.tsx new file mode 100644 index 000000000000..28bf12aa3863 --- /dev/null +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/__tests__/contract-type-glossary.spec.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import ContractTypeGlossary from '../ContractTypeInfo/contract-type-glossary'; + +describe('', () => { + it('Ensure accumulator glossary is rendered properly', () => { + render(); + + expect( + screen.getByText(/You can choose a growth rate with values of 1%, 2%, 3%, 4%, and 5%./i) + ).toBeInTheDocument(); + }); + it('Ensure vanilla glossary is rendered properly', () => { + render(); + + expect( + screen.getByText(/Contracts will expire at exactly 23:59:59 GMT on your selected expiry date./i) + ).toBeInTheDocument(); + }); + it('Ensure placeholder text is rendered if category does not exist', () => { + const { container } = render(); + + expect(container).toBeEmptyDOMElement(); + }); +}); diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx index a8fc6307a50d..b2b7a3611b8c 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx @@ -35,7 +35,7 @@ const ContractTypeDialog = ({ wrapper_classname='contracts-modal-list' visible={is_open} onClose={onClose} - has_content_scroll + has_content_scroll={!is_info_dialog_open} > {children} diff --git a/packages/trader/src/sass/app/_common/components/contract-type-dialog.scss b/packages/trader/src/sass/app/_common/components/contract-type-dialog.scss index 2215f46d3289..bbfbb34b4947 100644 --- a/packages/trader/src/sass/app/_common/components/contract-type-dialog.scss +++ b/packages/trader/src/sass/app/_common/components/contract-type-dialog.scss @@ -12,18 +12,17 @@ &__wrapper { position: absolute; - width: 290px; right: calc(100% + 10px); top: -66px; display: grid; grid-auto-columns: 1fr; z-index: 2; border-radius: 4px; - background: var(--general-main-2); + background: var(--general-main-1); box-shadow: 0 2px 8px 0 var(--shadow-menu); min-width: 560px; + width: 290px; height: 680px; - max-height: calc(100vh - 100px); overflow: hidden; /* postcss-bem-linter: ignore */ @@ -37,6 +36,10 @@ height: 56px; width: 320px; + &--contract-type-info-header { + width: 56rem; + } + /* postcss-bem-linter: ignore */ .dc-input { margin-bottom: 0; @@ -99,3 +102,9 @@ pointer-events: auto; } } + +.dc-mobile-dialog { + &__content { + height: 100%; + } +} diff --git a/packages/trader/src/sass/app/_common/components/contract-type-info.scss b/packages/trader/src/sass/app/_common/components/contract-type-info.scss index f2d7c01c139c..c5304cd6da14 100644 --- a/packages/trader/src/sass/app/_common/components/contract-type-info.scss +++ b/packages/trader/src/sass/app/_common/components/contract-type-info.scss @@ -4,41 +4,74 @@ height: 100%; display: flex; flex-direction: column; - justify-content: space-between; + + @include mobile { + height: calc(100% - 148.5px); + &--has-toggle-buttons { + height: calc(100% - 74px); + } + } & .dc-carousel { width: 100%; + &__wrapper { + padding: 0; + } + &__card { + padding-bottom: 0; + } + &__icon { + &--disabled { + pointer-events: none; + } + } + &__nav { + padding: 0 1.2rem; + } + @include mobile { &__wrapper { - padding: 1.6rem 0 0; + padding: 0; } &__nav { - margin: 3.2rem 0 0; + margin: 1.6rem auto; + padding: 0 2rem; + } + &__container { + height: 100%; + } + &__box { + height: 100%; } } } &__card { - min-height: calc(100vh - 210px); - max-height: calc(100vh - 268px); display: flex; flex-direction: column; - padding: 0.4rem 1rem; - @media screen and (min-height: 768px) and (max-height: 820px) { - min-height: calc(100vh - 288px); - } - @media screen and (min-height: 821px) { - min-height: 535px; - } + justify-content: space-between; + @include mobile { - min-height: calc(100vh - 140px); + height: 100%; padding: 0; } } &__content { overflow: hidden; - /* postcss-bem-linter: ignore */ + &-glossary { + &--heading { + margin: 0 !important; + } + } + &-definition { + color: var(--brand-red-coral); + + &:hover { + text-decoration: underline; + cursor: pointer; + } + } h2 { @include typeface(--paragraph-left-bold-black, none); margin-bottom: 0.8rem; @@ -62,7 +95,6 @@ } } @include mobile { - width: 32rem; /* postcss-bem-linter: ignore */ h2 { @include typeface(--small-left-bold-black, none); @@ -82,31 +114,37 @@ } &__gif { width: 100%; - height: 148px; + height: 16.4rem; border-radius: 4px; + text-align: center; + margin-top: 0; + margin-bottom: 1.6rem; @include mobile { width: 32.8rem; - height: 14.1rem; + height: 16.4rem; background-color: var(--general-section-1); svg { width: 100%; height: 100%; } } + + &--has-toggle-buttons { + margin-top: 1.6rem; + } } &__action-bar { display: flex; align-items: center; - justify-content: center; width: 100%; + padding-left: 2.4rem; @include mobile { - gap: 2.4rem; + padding-left: 2.4rem; } } &__title { - margin: auto; cursor: default; } &__nav { @@ -144,17 +182,68 @@ } &__icon { cursor: pointer; + padding-right: 2.4rem; } &__scrollbars { - margin-top: 2.4rem; - margin-bottom: auto; + position: relative; + &-description--active { + transition: transform 0.3s linear; + } + &-glossary { + margin-top: 0; + &--active { + position: relative; + transition: transform 0.3s linear; + } + } + } + &__trade-type-btn-wrapper { + display: flex; + justify-content: center; + border-top: 2px solid var(--general-section-1); + padding: 1.6rem 2.4rem; + margin-top: 1.6rem; + + @include mobile { + margin-top: 0; + padding: 1.6rem; + } } &__button { - margin-top: 2.4rem; + flex-shrink: 0; + width: 52.3rem; + @include mobile { - width: 27.2rem; padding: 1.5rem 0; align-self: center; + width: 32.8rem; + } + } + &__button-wrapper { + background: var(--general-section-1); + padding: 0.4rem; + margin: 1.6rem; + border-radius: $BORDER_RADIUS * 1.5; + width: 52.3rem; + + @include mobile { + width: 32.8rem; + margin: 1.6rem auto; + } + + .dc-button-menu__button { + background-color: var(--general-section-1) !important; + + .dc-btn__text { + color: var(--text-less-prominent) !important; + } + &--active { + background-color: var(--button-toggle-alternate) !important; + + .dc-btn__text { + color: var(--text-prominent) !important; + } + } } } } From 4ed7bf4f3e1d7eecb4864e7bcd360498bd12fa4b Mon Sep 17 00:00:00 2001 From: kate-deriv <121025168+kate-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 10:17:16 +0300 Subject: [PATCH 026/104] Kate / DTRA-202 / Apply new style to the trade type menu in mobile (#8931) * fix: remove special style from trade type menu in mobile * chore: change trade type text --- .../Components/Form/ContractType/contract-type-dialog.jsx | 2 +- .../src/sass/app/_common/components/contract-type-list.scss | 3 --- packages/trader/src/sass/app/modules/trading.scss | 6 ------ 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx index b2b7a3611b8c..5792e58734d4 100644 --- a/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx +++ b/packages/trader/src/Modules/Trading/Components/Form/ContractType/contract-type-dialog.jsx @@ -22,7 +22,7 @@ const ContractTypeDialog = ({ const current_mobile_title = is_info_dialog_open ? (
) : ( - localize('Trade type') + localize('Trade types') ); return ( diff --git a/packages/trader/src/sass/app/_common/components/contract-type-list.scss b/packages/trader/src/sass/app/_common/components/contract-type-list.scss index c65bc4aacabe..f39f7b78992c 100644 --- a/packages/trader/src/sass/app/_common/components/contract-type-list.scss +++ b/packages/trader/src/sass/app/_common/components/contract-type-list.scss @@ -14,9 +14,6 @@ &__contracts-wrapper { margin-bottom: 1.4rem; } - @include mobile { - border-bottom: 4px solid var(--border-disabled); - } } /** @define contract-type-item */ diff --git a/packages/trader/src/sass/app/modules/trading.scss b/packages/trader/src/sass/app/modules/trading.scss index ed301bec8ca9..94070d4292cd 100644 --- a/packages/trader/src/sass/app/modules/trading.scss +++ b/packages/trader/src/sass/app/modules/trading.scss @@ -46,12 +46,6 @@ /** @define modal-dialog; weak */ .dc-mobile-dialog { - &__contracts-modal-list { - /* postcss-bem-linter: ignore */ - .category-wrapper { - background-color: var(--general-main-1) !important; - } - } .dc-select-native__placeholder:not(.dc-select-native__placeholder--has-value) { background: initial; } From d2fb52cfd931f6eb6f8491e9e873d91cfa3f334b Mon Sep 17 00:00:00 2001 From: shontzu <108507236+shontzu-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 15:19:33 +0800 Subject: [PATCH 027/104] fix: remove Change password text for DMT5 (#8927) * fix: remove Change password text for DMT5 * chore: empty commit --------- Co-authored-by: Sandeep Rajput <90243468+sandeep-deriv@users.noreply.github.com> Co-authored-by: Ali(Ako) Hosseini --- .../src/Sections/Security/Passwords/passwords-platform.jsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx b/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx index f4092bf78314..400884fb9178 100644 --- a/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx +++ b/packages/account/src/Sections/Security/Passwords/passwords-platform.jsx @@ -46,12 +46,6 @@ const PasswordsPlatform = ({ email, has_dxtrade_accounts, has_mt5_accounts }) => - - ]} - /> -
From ae0b86eb64021f43694f11ebdefd33fdc0834c03 Mon Sep 17 00:00:00 2001 From: henry-deriv <118344354+henry-deriv@users.noreply.github.com> Date: Mon, 19 Jun 2023 15:21:51 +0800 Subject: [PATCH 028/104] henry/91133/refactor: Refactored, migrated to TS and added test cases (#7998) * refactor: Refactored, migrated to TS and added test cases * fix: circleCI issue * fix: circle CI issue * fix: codecov rerun commit * fix: all test cases covered * fix: make props reusable * Merge branch 'master' of github.com:binary-com/deriv-app into henry/91133/Refactor-ServicesErrorModal --------- Co-authored-by: Henry Hein Co-authored-by: Ali(Ako) Hosseini --- .../__tests__/services-error-modal.spec.tsx | 87 +++++++++++++++++++ .../Modals/ServicesErrorModal/index.js | 2 +- .../services-error-modal.jsx | 58 ------------- .../services-error-modal.tsx | 72 +++++++++++++++ 4 files changed, 160 insertions(+), 59 deletions(-) create mode 100644 packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/services-error-modal.spec.tsx delete mode 100644 packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/services-error-modal.jsx create mode 100644 packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/services-error-modal.tsx diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/services-error-modal.spec.tsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/services-error-modal.spec.tsx new file mode 100644 index 000000000000..d591893d75a6 --- /dev/null +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/__tests__/services-error-modal.spec.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import ServicesErrorModal from '../services-error-modal'; + +jest.mock('../authorization-required-modal.jsx', () => jest.fn(() => 'AuthorizationRequiredModal')); +jest.mock('../insufficient-balance-modal.jsx', () => jest.fn(() => 'InsufficientBalanceModal')); +jest.mock('../company-wide-limit-exceeded-modal.jsx', () => jest.fn(() => 'CompanyWideLimitExceededModal')); +jest.mock('../account-verification-required-modal', () => jest.fn(() => 'AccountVerificationRequiredModal')); +type TModal = { + (): JSX.Element; + Body?: React.FC; + Footer?: React.FC; +}; +jest.mock('@deriv/components', () => { + const original_module = jest.requireActual('@deriv/components'); + const Modal: TModal = jest.fn(() =>
Modal
); + Modal.Body = jest.fn(() =>
); + Modal.Footer = jest.fn(() =>
); + return { + ...original_module, + Modal, + }; +}); + +describe('', () => { + const modal_props = { + is_visible: true, + onConfirm: jest.fn(), + }; + it('Should return null if code or message is missing', () => { + const services_error_mock = { + code: '', + message: '', + type: '', + }; + const { container } = render( + + ); + expect(container).toBeEmptyDOMElement(); + }); + + it('AuthorizationRequiredModal should render when code is AuthorizationRequired', () => { + const services_error_mock = { + code: 'AuthorizationRequired', + message: 'AuthorizationRequired', + }; + render(); + expect(screen.getByText('AuthorizationRequiredModal')).toBeInTheDocument(); + }); + + it('InsufficientBalanceModal should render when code is InsufficientBalance', () => { + const services_error_mock = { + code: 'InsufficientBalance', + message: 'InsufficientBalance', + }; + render(); + expect(screen.getByText('InsufficientBalanceModal')).toBeInTheDocument(); + }); + + it('CompanyWideLimitExceededModal should render when code is CompanyWideLimitExceeded', () => { + const services_error_mock = { + code: 'CompanyWideLimitExceeded', + message: 'CompanyWideLimitExceeded', + }; + render(); + expect(screen.getByText('CompanyWideLimitExceededModal')).toBeInTheDocument(); + }); + + it('AccountVerificationRequiredModal should render when code is PleaseAuthenticate', () => { + const services_error_mock = { + code: 'PleaseAuthenticate', + message: 'PleaseAuthenticate', + }; + render(); + expect(screen.getByText('AccountVerificationRequiredModal')).toBeInTheDocument(); + }); + + it('Default case should render when code is not specified in switch case', () => { + const services_error_mock = { + code: 'Default Error', + message: 'Default Error', + title: 'Default Error', + }; + render(); + expect(screen.getByText('Modal')).toBeInTheDocument(); + }); +}); diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/index.js b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/index.js index 37075d64d43f..1a21c81c1750 100644 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/index.js +++ b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/index.js @@ -1,3 +1,3 @@ -import ServicesErrorModal from './services-error-modal.jsx'; +import ServicesErrorModal from './services-error-modal'; export default ServicesErrorModal; diff --git a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/services-error-modal.jsx b/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/services-error-modal.jsx deleted file mode 100644 index 898f82407355..000000000000 --- a/packages/trader/src/App/Components/Elements/Modals/ServicesErrorModal/services-error-modal.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { Button, Modal } from '@deriv/components'; -import { localize } from '@deriv/translations'; -import { getTitle } from './constants'; -import AuthorizationRequiredModal from './authorization-required-modal.jsx'; -import InsufficientBalanceModal from './insufficient-balance-modal.jsx'; -import CompanyWideLimitExceededModal from './company-wide-limit-exceeded-modal.jsx'; -import AccountVerificationRequiredModal from './account-verification-required-modal.tsx'; - -const ServicesErrorModal = ({ is_virtual, is_visible, is_logged_in, onConfirm, services_error }) => { - const { code, message } = services_error; - - if (!code || !message) return null; - - if (code === 'AuthorizationRequired') { - return ( - - ); - } - if (code === 'InsufficientBalance') { - return ( - - ); - } - - if (code === 'CompanyWideLimitExceeded') { - return ; - } - - if (code === 'PleaseAuthenticate') { - return ; - } - - return ( - - {message} - -